diff --git a/docs/Third party licenses.md b/docs/Third party licenses.md index 41839c0e..e2d3f1ed 100644 --- a/docs/Third party licenses.md +++ b/docs/Third party licenses.md @@ -6,4 +6,4 @@ The majority of the contents of this Git repository are covered under the [LICEN ## 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). +We use fonts from Rubik font family. The fonts 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/gradle.properties b/gradle.properties index b6551c44..99175946 100644 --- a/gradle.properties +++ b/gradle.properties @@ -94,7 +94,7 @@ ANDROIDX_APPCOMPAT_VERSION=1.4.1 ANDROIDX_CAMERA_VERSION=1.1.0-rc01 ANDROIDX_COMPOSE_COMPILER_VERSION=1.2.0-beta03 ANDROIDX_COMPOSE_MATERIAL3_VERSION=1.0.0-alpha13 -ANDROIDX_COMPOSE_VERSION=1.1.1 +ANDROIDX_COMPOSE_VERSION=1.2.0-beta03 ANDROIDX_CONSTRAINTLAYOUT_VERSION=1.0.0 ANDROIDX_CORE_VERSION=1.7.0 ANDROIDX_ESPRESSO_VERSION=3.5.0-alpha07 diff --git a/settings.gradle.kts b/settings.gradle.kts index 3dd35ffb..988cd178 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -164,6 +164,7 @@ dependencyResolutionManagement { library("androidx-compose-material-icons-extended", "androidx.compose.material:material-icons-extended:$androidxComposeVersion") library("androidx-compose-tooling", "androidx.compose.ui:ui-tooling:$androidxComposeVersion") library("androidx-compose-ui", "androidx.compose.ui:ui:$androidxComposeVersion") + library("androidx-compose-ui-fonts", "androidx.compose.ui:ui-text-google-fonts:$androidxComposeVersion") library("androidx-compose-compiler", "androidx.compose.compiler:compiler:$androidxComposeCompilerVersion") library("androidx-core", "androidx.core:core-ktx:$androidxCoreVersion") library("androidx-constraintlayout", "androidx.constraintlayout:constraintlayout-compose:$androidxConstraintlayoutVersion") @@ -219,6 +220,7 @@ dependencyResolutionManagement { "androidx-compose-material3", "androidx-compose-tooling", "androidx-compose-ui", + "androidx-compose-ui-fonts" ) ) bundle( diff --git a/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/compat/FontCompat.kt b/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/compat/FontCompat.kt deleted file mode 100644 index e2c2c860..00000000 --- a/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/compat/FontCompat.kt +++ /dev/null @@ -1,32 +0,0 @@ -package co.electriccoin.zcash.ui.design.compat - -import android.content.Context -import androidx.annotation.FontRes -import androidx.core.content.res.ResourcesCompat -import co.electriccoin.zcash.spackle.AndroidApiVersion -import co.electriccoin.zcash.ui.design.R -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.withContext - -object FontCompat { - fun isFontPrefetchNeeded() = !AndroidApiVersion.isAtLeastO - - suspend fun prefetchFontsLegacy(context: Context) { - prefetchFontLegacy(context, R.font.rubik_medium) - prefetchFontLegacy(context, R.font.rubik_regular) - } - - /** - * Pre-fetches fonts on Android N (API 25) and below. - */ - /* - * ResourcesCompat is used implicitly by Compose on older Android versions. - * The backwards compatibility library performs disk IO and then - * caches the results. This moves that IO off the main thread, to prevent ANRs and - * jank during app startup. - */ - private suspend fun prefetchFontLegacy(context: Context, @FontRes fontRes: Int) = - withContext(Dispatchers.IO) { - ResourcesCompat.getFont(context, fontRes) - } -} diff --git a/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/theme/internal/Typography.kt b/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/theme/internal/Typography.kt index 05efd0f8..cd33c3d1 100644 --- a/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/theme/internal/Typography.kt +++ b/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/theme/internal/Typography.kt @@ -3,39 +3,56 @@ package co.electriccoin.zcash.ui.design.theme.internal import androidx.compose.material3.Typography import androidx.compose.runtime.Immutable import androidx.compose.runtime.staticCompositionLocalOf +import androidx.compose.ui.text.ExperimentalTextApi 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.text.googlefonts.Font +import androidx.compose.ui.text.googlefonts.GoogleFont import androidx.compose.ui.text.style.BaselineShift -import androidx.compose.ui.unit.ExperimentalUnitApi import androidx.compose.ui.unit.sp import co.electriccoin.zcash.ui.design.R -private val Rubik = FontFamily( - Font(R.font.rubik_regular, FontWeight.W400), - Font(R.font.rubik_medium, FontWeight.W500) +@OptIn(ExperimentalTextApi::class) +private val provider = GoogleFont.Provider( + providerAuthority = "com.google.android.gms.fonts", + providerPackage = "com.google.android.gms", + certificates = R.array.com_google_android_gms_fonts_certs ) -@OptIn(ExperimentalUnitApi::class) +// We use bestEffort here to be able to get the closest font weight, if accidentally use +// an unspecified font weight and not the default one. +@OptIn(ExperimentalTextApi::class) +private val RubikFont = GoogleFont(name = "Rubik", bestEffort = true) + +@OptIn(ExperimentalTextApi::class) +private val RubikFontFamily = FontFamily( + Font(googleFont = RubikFont, fontProvider = provider, weight = FontWeight.Normal), // W400 + Font(googleFont = RubikFont, fontProvider = provider, weight = FontWeight.Medium), // W500 + Font(googleFont = RubikFont, fontProvider = provider, weight = FontWeight.SemiBold), // W600 + Font(googleFont = RubikFont, fontProvider = provider, weight = FontWeight.Bold) // W700 +) + +// If you change this definition of our Typography, don't forget to check if you use only +// the defined font weights above, otherwise the closest one will be used. internal val Typography = Typography( headlineLarge = TextStyle( - fontFamily = Rubik, - fontWeight = FontWeight.W600, + fontFamily = RubikFontFamily, + fontWeight = FontWeight.SemiBold, fontSize = 30.sp, ), bodyLarge = TextStyle( - fontFamily = Rubik, + fontFamily = RubikFontFamily, fontWeight = FontWeight.Normal, fontSize = 16.sp ), bodySmall = TextStyle( - fontFamily = Rubik, + fontFamily = RubikFontFamily, fontWeight = FontWeight.Medium, fontSize = 16.sp ), labelLarge = TextStyle( - fontFamily = Rubik, + fontFamily = RubikFontFamily, fontWeight = FontWeight.Normal, fontSize = 16.sp ), diff --git a/ui-design-lib/src/main/res/ui/common/font/rubik_medium.ttf b/ui-design-lib/src/main/res/ui/common/font/rubik_medium.ttf deleted file mode 100644 index a4008b72..00000000 Binary files a/ui-design-lib/src/main/res/ui/common/font/rubik_medium.ttf and /dev/null differ diff --git a/ui-design-lib/src/main/res/ui/common/font/rubik_regular.ttf b/ui-design-lib/src/main/res/ui/common/font/rubik_regular.ttf deleted file mode 100644 index dc90ef05..00000000 Binary files a/ui-design-lib/src/main/res/ui/common/font/rubik_regular.ttf and /dev/null differ diff --git a/ui-design-lib/src/main/res/ui/common/values/font_certs.xml b/ui-design-lib/src/main/res/ui/common/values/font_certs.xml new file mode 100644 index 00000000..5ece3f5f --- /dev/null +++ b/ui-design-lib/src/main/res/ui/common/values/font_certs.xml @@ -0,0 +1,32 @@ + + + + + @array/com_google_android_gms_fonts_certs_dev + @array/com_google_android_gms_fonts_certs_prod + + + + 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 + + + \ No newline at end of file diff --git a/ui-integration-test-lib/src/androidTest/AndroidManifest.xml b/ui-integration-test-lib/src/androidTest/AndroidManifest.xml index e0e30c38..4b646e3c 100644 --- a/ui-integration-test-lib/src/androidTest/AndroidManifest.xml +++ b/ui-integration-test-lib/src/androidTest/AndroidManifest.xml @@ -6,7 +6,7 @@ diff --git a/ui-integration-test-lib/src/androidTest/java/co/electriccoin/zcash/ui/integration/test/Global.kt b/ui-integration-test-lib/src/androidTest/java/co/electriccoin/zcash/ui/integration/test/common/Global.kt similarity index 100% rename from ui-integration-test-lib/src/androidTest/java/co/electriccoin/zcash/ui/integration/test/Global.kt rename to ui-integration-test-lib/src/androidTest/java/co/electriccoin/zcash/ui/integration/test/common/Global.kt diff --git a/ui-integration-test-lib/src/androidTest/java/co/electriccoin/zcash/ui/integration/test/common/IntegrationTestingActivity.kt b/ui-integration-test-lib/src/androidTest/java/co/electriccoin/zcash/ui/integration/test/common/IntegrationTestingActivity.kt new file mode 100644 index 00000000..6d6d6c7d --- /dev/null +++ b/ui-integration-test-lib/src/androidTest/java/co/electriccoin/zcash/ui/integration/test/common/IntegrationTestingActivity.kt @@ -0,0 +1,5 @@ +package co.electriccoin.zcash.ui.integration.test.common + +import androidx.activity.ComponentActivity + +class IntegrationTestingActivity : ComponentActivity() diff --git a/ui-integration-test-lib/src/androidTest/java/co/electriccoin/zcash/ui/integration/test/screen/scan/TestScanActivity.kt b/ui-integration-test-lib/src/androidTest/java/co/electriccoin/zcash/ui/integration/test/screen/scan/TestScanActivity.kt deleted file mode 100644 index 1ab44310..00000000 --- a/ui-integration-test-lib/src/androidTest/java/co/electriccoin/zcash/ui/integration/test/screen/scan/TestScanActivity.kt +++ /dev/null @@ -1,37 +0,0 @@ -package co.electriccoin.zcash.ui.integration.test.screen.scan - -import android.os.Bundle -import androidx.activity.ComponentActivity -import androidx.activity.compose.setContent -import androidx.compose.foundation.layout.fillMaxHeight -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.ui.Modifier -import co.electriccoin.zcash.ui.design.component.GradientSurface -import co.electriccoin.zcash.ui.design.theme.ZcashTheme -import co.electriccoin.zcash.ui.screen.scan.WrapScan - -class TestScanActivity : ComponentActivity() { - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setupUiContent() - } - - private fun setupUiContent() { - setContent { - ZcashTheme { - GradientSurface( - Modifier - .fillMaxWidth() - .fillMaxHeight() - ) { - WrapScan( - this, - goBack = {}, - onScanned = {}, - ) - } - } - } - } -} diff --git a/ui-integration-test-lib/src/androidTest/java/co/electriccoin/zcash/ui/integration/test/screen/scan/view/ScanViewIntegrationTest.kt b/ui-integration-test-lib/src/androidTest/java/co/electriccoin/zcash/ui/integration/test/screen/scan/view/ScanViewIntegrationTest.kt index 2659f682..0e4625df 100644 --- a/ui-integration-test-lib/src/androidTest/java/co/electriccoin/zcash/ui/integration/test/screen/scan/view/ScanViewIntegrationTest.kt +++ b/ui-integration-test-lib/src/androidTest/java/co/electriccoin/zcash/ui/integration/test/screen/scan/view/ScanViewIntegrationTest.kt @@ -6,8 +6,8 @@ import androidx.compose.ui.test.junit4.createAndroidComposeRule import androidx.compose.ui.test.onNodeWithTag import androidx.test.filters.LargeTest import co.electriccoin.zcash.test.UiTestPrerequisites +import co.electriccoin.zcash.ui.integration.test.common.IntegrationTestingActivity import co.electriccoin.zcash.ui.integration.test.getPermissionPositiveButtonUiObject -import co.electriccoin.zcash.ui.integration.test.screen.scan.TestScanActivity import co.electriccoin.zcash.ui.screen.scan.ScanTag import co.electriccoin.zcash.ui.screen.scan.model.ScanState import org.junit.Assert @@ -19,7 +19,7 @@ import org.junit.Test class ScanViewIntegrationTest : UiTestPrerequisites() { @get:Rule - val composeTestRule = createAndroidComposeRule() + val composeTestRule = createAndroidComposeRule() private lateinit var testSetup: ScanViewTestSetup diff --git a/ui-integration-test-lib/src/androidTest/java/co/electriccoin/zcash/ui/integration/test/screen/scan/view/ScanViewTest.kt b/ui-integration-test-lib/src/androidTest/java/co/electriccoin/zcash/ui/integration/test/screen/scan/view/ScanViewTest.kt index 5ddeb8a4..e00c0737 100644 --- a/ui-integration-test-lib/src/androidTest/java/co/electriccoin/zcash/ui/integration/test/screen/scan/view/ScanViewTest.kt +++ b/ui-integration-test-lib/src/androidTest/java/co/electriccoin/zcash/ui/integration/test/screen/scan/view/ScanViewTest.kt @@ -11,9 +11,9 @@ import androidx.compose.ui.test.performClick import androidx.test.filters.LargeTest import co.electriccoin.zcash.test.UiTestPrerequisites import co.electriccoin.zcash.ui.R +import co.electriccoin.zcash.ui.integration.test.common.IntegrationTestingActivity import co.electriccoin.zcash.ui.integration.test.getPermissionPositiveButtonUiObject import co.electriccoin.zcash.ui.integration.test.getStringResource -import co.electriccoin.zcash.ui.integration.test.screen.scan.TestScanActivity import co.electriccoin.zcash.ui.integration.test.waitForDeviceIdle import co.electriccoin.zcash.ui.screen.scan.ScanTag import co.electriccoin.zcash.ui.screen.scan.model.ScanState @@ -28,7 +28,7 @@ import kotlin.time.Duration.Companion.milliseconds class ScanViewTest : UiTestPrerequisites() { @get:Rule - val composeTestRule = createAndroidComposeRule() + val composeTestRule = createAndroidComposeRule() private lateinit var testSetup: ScanViewTestSetup diff --git a/ui-lib/src/androidTest/AndroidManifest.xml b/ui-lib/src/androidTest/AndroidManifest.xml index 5d05abc0..f9a4adfb 100644 --- a/ui-lib/src/androidTest/AndroidManifest.xml +++ b/ui-lib/src/androidTest/AndroidManifest.xml @@ -6,13 +6,7 @@ - - diff --git a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/common/UiTestingActivity.kt b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/common/UiTestingActivity.kt new file mode 100644 index 00000000..bcc2dafb --- /dev/null +++ b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/common/UiTestingActivity.kt @@ -0,0 +1,5 @@ +package co.electriccoin.zcash.ui.common + +import androidx.activity.ComponentActivity + +class UiTestingActivity : ComponentActivity() diff --git a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/backup/TestBackupActivity.kt b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/backup/TestBackupActivity.kt deleted file mode 100644 index 0e8c37ae..00000000 --- a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/backup/TestBackupActivity.kt +++ /dev/null @@ -1,40 +0,0 @@ -package co.electriccoin.zcash.ui.screen.backup - -import android.os.Bundle -import androidx.activity.ComponentActivity -import androidx.activity.compose.setContent -import androidx.compose.foundation.layout.fillMaxHeight -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.ui.Modifier -import cash.z.ecc.sdk.fixture.PersistableWalletFixture -import co.electriccoin.zcash.ui.design.component.GradientSurface -import co.electriccoin.zcash.ui.design.theme.ZcashTheme -import co.electriccoin.zcash.ui.screen.backup.model.BackupStage -import co.electriccoin.zcash.ui.screen.backup.state.BackupState - -class TestBackupActivity : ComponentActivity() { - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setupUiContent() - } - - private fun setupUiContent() { - setContent { - ZcashTheme { - GradientSurface( - Modifier - .fillMaxWidth() - .fillMaxHeight() - ) { - WrapBackup( - persistableWallet = PersistableWalletFixture.new(), - backupState = BackupState(BackupStage.EducationOverview), - onCopyToClipboard = {}, - onBackupComplete = {} - ) - } - } - } - } -} diff --git a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/backup/integration/BackupActivityTest.kt b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/backup/integration/BackupActivityTest.kt new file mode 100644 index 00000000..c5dcd26e --- /dev/null +++ b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/backup/integration/BackupActivityTest.kt @@ -0,0 +1,51 @@ +package co.electriccoin.zcash.ui.screen.backup.integration + +import androidx.compose.ui.test.junit4.createAndroidComposeRule +import androidx.compose.ui.test.onNodeWithText +import androidx.compose.ui.test.performClick +import androidx.test.filters.MediumTest +import co.electriccoin.zcash.test.UiTestPrerequisites +import co.electriccoin.zcash.ui.R +import co.electriccoin.zcash.ui.common.UiTestingActivity +import co.electriccoin.zcash.ui.fixture.TestChoicesFixture +import co.electriccoin.zcash.ui.screen.backup.model.BackupStage +import co.electriccoin.zcash.ui.screen.backup.view.BackupTestSetup +import co.electriccoin.zcash.ui.test.getStringResource +import org.junit.Assert.assertEquals +import org.junit.Rule +import org.junit.Test + +class BackupActivityTest : UiTestPrerequisites() { + + @get:Rule + val composeTestRule = createAndroidComposeRule() + + private fun newTestSetup(): BackupTestSetup { + return BackupTestSetup( + composeTestRule, + BackupStage.EducationOverview, + TestChoicesFixture.new(TestChoicesFixture.INITIAL_CHOICES) + ) + } + + @Test + @MediumTest + fun current_stage_restoration_activity() { + val testSetup = newTestSetup() + testSetup.setDefaultContent() + + assertEquals(BackupStage.EducationOverview, testSetup.getStage()) + + composeTestRule.onNodeWithText(getStringResource(R.string.new_wallet_1_button)).also { + it.performClick() + } + + assertEquals(BackupStage.EducationRecoveryPhrase, testSetup.getStage()) + + composeTestRule.activityRule.scenario.onActivity { + it.recreate() + } + + assertEquals(BackupStage.EducationRecoveryPhrase, testSetup.getStage()) + } +} diff --git a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/backup/view/BackupIntegrationTest.kt b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/backup/integration/BackupIntegrationTest.kt similarity index 79% rename from ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/backup/view/BackupIntegrationTest.kt rename to ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/backup/integration/BackupIntegrationTest.kt index abf96945..07314a7c 100644 --- a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/backup/view/BackupIntegrationTest.kt +++ b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/backup/integration/BackupIntegrationTest.kt @@ -1,8 +1,8 @@ -package co.electriccoin.zcash.ui.screen.backup.view +package co.electriccoin.zcash.ui.screen.backup.integration import androidx.compose.ui.test.hasTestTag import androidx.compose.ui.test.junit4.StateRestorationTester -import androidx.compose.ui.test.junit4.createAndroidComposeRule +import androidx.compose.ui.test.junit4.createComposeRule import androidx.compose.ui.test.onAllNodesWithTag import androidx.compose.ui.test.onChildren import androidx.compose.ui.test.onNodeWithText @@ -12,16 +12,17 @@ import co.electriccoin.zcash.test.UiTestPrerequisites import co.electriccoin.zcash.ui.R import co.electriccoin.zcash.ui.fixture.TestChoicesFixture import co.electriccoin.zcash.ui.screen.backup.BackupTag -import co.electriccoin.zcash.ui.screen.backup.TestBackupActivity import co.electriccoin.zcash.ui.screen.backup.model.BackupStage +import co.electriccoin.zcash.ui.screen.backup.view.BackupTestSetup import co.electriccoin.zcash.ui.test.getStringResource import org.junit.Assert.assertEquals import org.junit.Rule import org.junit.Test class BackupIntegrationTest : UiTestPrerequisites() { + @get:Rule - val composeTestRule = createAndroidComposeRule() + val composeTestRule = createComposeRule() private fun newTestSetup(initialStage: BackupStage): BackupTestSetup { return BackupTestSetup( @@ -92,25 +93,4 @@ class BackupIntegrationTest : UiTestPrerequisites() { assertEquals(2, testSetup.getOnChoicesCallbackCount()) assertEquals(4, testSetup.getSelectedChoicesCount()) } - - @Test - @MediumTest - fun current_stage_restoration_activity() { - val testSetup = newTestSetup(BackupStage.EducationOverview) - testSetup.setDefaultContent() - - assertEquals(BackupStage.EducationOverview, testSetup.getStage()) - - composeTestRule.onNodeWithText(getStringResource(R.string.new_wallet_1_button)).also { - it.performClick() - } - - assertEquals(BackupStage.EducationRecoveryPhrase, testSetup.getStage()) - - composeTestRule.activityRule.scenario.onActivity { - it.recreate() - } - - assertEquals(BackupStage.EducationRecoveryPhrase, testSetup.getStage()) - } } diff --git a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/onboarding/TestOnboardingActivity.kt b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/onboarding/TestOnboardingActivity.kt deleted file mode 100644 index a91a30e6..00000000 --- a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/onboarding/TestOnboardingActivity.kt +++ /dev/null @@ -1,55 +0,0 @@ -package co.electriccoin.zcash.ui.screen.onboarding - -import android.os.Bundle -import androidx.activity.ComponentActivity -import androidx.activity.compose.setContent -import androidx.activity.viewModels -import androidx.compose.foundation.layout.fillMaxHeight -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.runtime.Composable -import androidx.compose.runtime.collectAsState -import androidx.compose.ui.Modifier -import co.electriccoin.zcash.ui.design.component.GradientSurface -import co.electriccoin.zcash.ui.design.theme.ZcashTheme -import co.electriccoin.zcash.ui.screen.onboarding.view.Onboarding -import co.electriccoin.zcash.ui.screen.onboarding.viewmodel.OnboardingViewModel - -class TestOnboardingActivity : ComponentActivity() { - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setupUiContent() - } - - private fun setupUiContent() { - setContent { - ZcashTheme { - GradientSurface( - Modifier - .fillMaxWidth() - .fillMaxHeight() - ) { - WrapOnboarding() - } - } - } - } - - @Composable - private fun WrapOnboarding() { - val onboardingViewModel by viewModels() - - // TODO [#383]: https://github.com/zcash/secant-android-wallet/issues/383 - if (!onboardingViewModel.isImporting.collectAsState().value) { - Onboarding( - onboardingState = onboardingViewModel.onboardingState, - isDebugMenuEnabled = false, - onImportWallet = { onboardingViewModel.isImporting.value = true }, - onCreateWallet = {}, - onFixtureWallet = {} - ) - - reportFullyDrawn() - } - } -} diff --git a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/onboarding/integration/OnboardingActivityTest.kt b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/onboarding/integration/OnboardingActivityTest.kt new file mode 100644 index 00000000..0f7e9203 --- /dev/null +++ b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/onboarding/integration/OnboardingActivityTest.kt @@ -0,0 +1,44 @@ +package co.electriccoin.zcash.ui.screen.onboarding.integration + +import androidx.compose.ui.test.junit4.createAndroidComposeRule +import androidx.compose.ui.test.onNodeWithText +import androidx.compose.ui.test.performClick +import androidx.test.filters.MediumTest +import co.electriccoin.zcash.test.UiTestPrerequisites +import co.electriccoin.zcash.ui.R +import co.electriccoin.zcash.ui.common.UiTestingActivity +import co.electriccoin.zcash.ui.screen.onboarding.model.OnboardingStage +import co.electriccoin.zcash.ui.screen.onboarding.view.OnboardingTestSetup +import co.electriccoin.zcash.ui.test.getStringResource +import org.junit.Assert.assertEquals +import org.junit.Rule +import org.junit.Test + +// TODO [#382]: https://github.com/zcash/secant-android-wallet/issues/382 +class OnboardingActivityTest : UiTestPrerequisites() { + @get:Rule + val composeTestRule = createAndroidComposeRule() + + private fun newTestSetup() = OnboardingTestSetup(composeTestRule, OnboardingStage.ShieldedByDefault) + + @Test + @MediumTest + fun current_stage_restoration_activity() { + val testSetup = newTestSetup() + testSetup.setDefaultContent() + + assertEquals(OnboardingStage.ShieldedByDefault, testSetup.getOnboardingStage()) + + composeTestRule.onNodeWithText(getStringResource(R.string.onboarding_next)).also { + it.performClick() + } + + assertEquals(OnboardingStage.UnifiedAddresses, testSetup.getOnboardingStage()) + + composeTestRule.activityRule.scenario.onActivity { + it.recreate() + } + + assertEquals(OnboardingStage.UnifiedAddresses, testSetup.getOnboardingStage()) + } +} diff --git a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/onboarding/view/OnboardingIntegrationTest.kt b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/onboarding/integration/OnboardingIntegrationTest.kt similarity index 66% rename from ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/onboarding/view/OnboardingIntegrationTest.kt rename to ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/onboarding/integration/OnboardingIntegrationTest.kt index dd53dc36..64eeb962 100644 --- a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/onboarding/view/OnboardingIntegrationTest.kt +++ b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/onboarding/integration/OnboardingIntegrationTest.kt @@ -1,14 +1,14 @@ -package co.electriccoin.zcash.ui.screen.onboarding.view +package co.electriccoin.zcash.ui.screen.onboarding.integration import androidx.compose.ui.test.junit4.StateRestorationTester -import androidx.compose.ui.test.junit4.createAndroidComposeRule +import androidx.compose.ui.test.junit4.createComposeRule import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick import androidx.test.filters.MediumTest import co.electriccoin.zcash.test.UiTestPrerequisites import co.electriccoin.zcash.ui.R -import co.electriccoin.zcash.ui.screen.onboarding.TestOnboardingActivity import co.electriccoin.zcash.ui.screen.onboarding.model.OnboardingStage +import co.electriccoin.zcash.ui.screen.onboarding.view.OnboardingTestSetup import co.electriccoin.zcash.ui.test.getStringResource import org.junit.Assert.assertEquals import org.junit.Rule @@ -17,7 +17,7 @@ import org.junit.Test // TODO [#382]: https://github.com/zcash/secant-android-wallet/issues/382 class OnboardingIntegrationTest : UiTestPrerequisites() { @get:Rule - val composeTestRule = createAndroidComposeRule() + val composeTestRule = createComposeRule() private fun newTestSetup(initialStage: OnboardingStage) = OnboardingTestSetup(composeTestRule, initialStage) @@ -49,25 +49,4 @@ class OnboardingIntegrationTest : UiTestPrerequisites() { assertEquals(OnboardingStage.More, testSetup.getOnboardingStage()) } - - @Test - @MediumTest - fun current_stage_restoration_activity() { - val testSetup = newTestSetup(OnboardingStage.ShieldedByDefault) - testSetup.setDefaultContent() - - assertEquals(OnboardingStage.ShieldedByDefault, testSetup.getOnboardingStage()) - - composeTestRule.onNodeWithText(getStringResource(R.string.onboarding_next)).also { - it.performClick() - } - - assertEquals(OnboardingStage.UnifiedAddresses, testSetup.getOnboardingStage()) - - composeTestRule.activityRule.scenario.onActivity { - it.recreate() - } - - assertEquals(OnboardingStage.UnifiedAddresses, testSetup.getOnboardingStage()) - } } diff --git a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/update/TestUpdateActivity.kt b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/update/TestUpdateActivity.kt deleted file mode 100644 index 7c74c528..00000000 --- a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/update/TestUpdateActivity.kt +++ /dev/null @@ -1,36 +0,0 @@ -package co.electriccoin.zcash.ui.screen.update - -import android.os.Bundle -import androidx.activity.ComponentActivity -import androidx.activity.compose.setContent -import androidx.compose.foundation.layout.fillMaxHeight -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.ui.Modifier -import co.electriccoin.zcash.ui.design.component.GradientSurface -import co.electriccoin.zcash.ui.design.theme.ZcashTheme -import co.electriccoin.zcash.ui.screen.update.fixture.UpdateInfoFixture - -class TestUpdateActivity : ComponentActivity() { - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setupUiContent() - } - - private fun setupUiContent() { - setContent { - ZcashTheme { - GradientSurface( - Modifier - .fillMaxWidth() - .fillMaxHeight() - ) { - WrapUpdate( - this, - UpdateInfoFixture.new(appUpdateInfo = null) - ) - } - } - } - } -} diff --git a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/update/integration/UpdateViewActivityTest.kt b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/update/integration/UpdateViewActivityTest.kt new file mode 100644 index 00000000..9d640caf --- /dev/null +++ b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/update/integration/UpdateViewActivityTest.kt @@ -0,0 +1,59 @@ +package co.electriccoin.zcash.ui.screen.update.integration + +import androidx.compose.ui.test.junit4.ComposeContentTestRule +import androidx.compose.ui.test.junit4.createAndroidComposeRule +import androidx.compose.ui.test.onNodeWithTag +import androidx.compose.ui.test.performClick +import androidx.test.filters.MediumTest +import co.electriccoin.zcash.test.UiTestPrerequisites +import co.electriccoin.zcash.ui.common.UiTestingActivity +import co.electriccoin.zcash.ui.screen.update.AppUpdateChecker +import co.electriccoin.zcash.ui.screen.update.UpdateTag +import co.electriccoin.zcash.ui.screen.update.fixture.UpdateInfoFixture +import co.electriccoin.zcash.ui.screen.update.model.UpdateInfo +import co.electriccoin.zcash.ui.screen.update.model.UpdateState +import co.electriccoin.zcash.ui.screen.update.view.UpdateViewTestSetup +import org.junit.Assert.assertEquals +import org.junit.Rule +import org.junit.Test + +class UpdateActivityViewTest : UiTestPrerequisites() { + + @get:Rule + val composeTestRule = createAndroidComposeRule() + + @Test + @MediumTest + fun later_btn_force_update_test() { + val updateInfo = UpdateInfoFixture.new( + priority = AppUpdateChecker.Priority.HIGH, + force = true, + appUpdateInfo = null, + state = UpdateState.Prepared, + ) + val testSetup = newTestSetup(updateInfo) + + assertEquals(0, testSetup.getOnLaterCount()) + + composeTestRule.clickLater() + + assertEquals(0, testSetup.getOnLaterCount()) + + composeTestRule.activity.onBackPressed() + + assertEquals(0, testSetup.getOnLaterCount()) + } + + private fun newTestSetup(updateInfo: UpdateInfo) = UpdateViewTestSetup( + composeTestRule, + updateInfo + ).apply { + setDefaultContent() + } +} + +private fun ComposeContentTestRule.clickLater() { + onNodeWithTag(UpdateTag.BTN_LATER).also { + it.performClick() + } +} diff --git a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/update/integration/UpdateViewModelTest.kt b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/update/integration/UpdateViewModelTest.kt index 4353a156..b9794f90 100644 --- a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/update/integration/UpdateViewModelTest.kt +++ b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/update/integration/UpdateViewModelTest.kt @@ -3,8 +3,8 @@ package co.electriccoin.zcash.ui.screen.update.integration import androidx.compose.ui.test.junit4.createAndroidComposeRule import androidx.lifecycle.viewModelScope import androidx.test.filters.MediumTest +import co.electriccoin.zcash.ui.common.UiTestingActivity import co.electriccoin.zcash.ui.screen.update.AppUpdateChecker -import co.electriccoin.zcash.ui.screen.update.TestUpdateActivity import co.electriccoin.zcash.ui.screen.update.fixture.UpdateInfoFixture import co.electriccoin.zcash.ui.screen.update.model.UpdateInfo import co.electriccoin.zcash.ui.screen.update.model.UpdateState @@ -26,7 +26,7 @@ import kotlin.test.assertNull @ExperimentalCoroutinesApi class UpdateViewModelTest { @get:Rule - val composeTestRule = createAndroidComposeRule() + val composeTestRule = createAndroidComposeRule() private lateinit var viewModel: UpdateViewModel private lateinit var checker: AppUpdateCheckerMock diff --git a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/update/view/AppUpdateCheckerImpTest.kt b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/update/view/AppUpdateCheckerImpTest.kt index 4c44c2f0..7e5fa640 100644 --- a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/update/view/AppUpdateCheckerImpTest.kt +++ b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/update/view/AppUpdateCheckerImpTest.kt @@ -2,12 +2,12 @@ package co.electriccoin.zcash.ui.screen.update.view import android.app.Activity import android.content.Context +import androidx.activity.ComponentActivity import androidx.compose.ui.test.junit4.createAndroidComposeRule import androidx.test.core.app.ApplicationProvider import androidx.test.filters.MediumTest import cash.z.ecc.android.sdk.ext.onFirst import co.electriccoin.zcash.ui.screen.update.AppUpdateCheckerImp -import co.electriccoin.zcash.ui.screen.update.TestUpdateActivity import co.electriccoin.zcash.ui.screen.update.model.UpdateInfo import co.electriccoin.zcash.ui.screen.update.model.UpdateState import com.google.android.play.core.install.model.ActivityResult @@ -15,7 +15,7 @@ import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.test.runTest import org.junit.Rule -import kotlin.test.Test +import org.junit.Test import kotlin.test.assertNotNull import kotlin.test.assertNull import kotlin.test.assertTrue @@ -23,7 +23,7 @@ import kotlin.test.assertTrue class AppUpdateCheckerImpTest { @get:Rule - val composeTestRule = createAndroidComposeRule() + val composeTestRule = createAndroidComposeRule() companion object { val context: Context = ApplicationProvider.getApplicationContext() diff --git a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/update/view/UpdateViewTest.kt b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/update/view/UpdateViewTest.kt index a2151992..42657941 100644 --- a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/update/view/UpdateViewTest.kt +++ b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/update/view/UpdateViewTest.kt @@ -1,7 +1,7 @@ package co.electriccoin.zcash.ui.screen.update.view import androidx.compose.ui.test.junit4.ComposeContentTestRule -import androidx.compose.ui.test.junit4.createAndroidComposeRule +import androidx.compose.ui.test.junit4.createComposeRule import androidx.compose.ui.test.onNodeWithTag import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.onRoot @@ -10,7 +10,6 @@ import androidx.test.filters.MediumTest import co.electriccoin.zcash.test.UiTestPrerequisites import co.electriccoin.zcash.ui.R import co.electriccoin.zcash.ui.screen.update.AppUpdateChecker -import co.electriccoin.zcash.ui.screen.update.TestUpdateActivity import co.electriccoin.zcash.ui.screen.update.UpdateTag import co.electriccoin.zcash.ui.screen.update.fixture.UpdateInfoFixture import co.electriccoin.zcash.ui.screen.update.model.UpdateInfo @@ -24,29 +23,7 @@ import org.junit.Test class UpdateViewTest : UiTestPrerequisites() { @get:Rule - val composeTestRule = createAndroidComposeRule() - - @Test - @MediumTest - fun later_btn_force_update_test() { - val updateInfo = UpdateInfoFixture.new( - priority = AppUpdateChecker.Priority.HIGH, - force = true, - appUpdateInfo = null, - state = UpdateState.Prepared, - ) - val testSetup = newTestSetup(updateInfo) - - assertEquals(0, testSetup.getOnLaterCount()) - - composeTestRule.clickLater() - - assertEquals(0, testSetup.getOnLaterCount()) - - composeTestRule.activity.onBackPressed() - - assertEquals(0, testSetup.getOnLaterCount()) - } + val composeTestRule = createComposeRule() @Test @MediumTest diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/MainActivity.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/MainActivity.kt index cfa31d9e..927a6f28 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/MainActivity.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/MainActivity.kt @@ -23,7 +23,6 @@ import androidx.navigation.compose.composable import androidx.navigation.compose.rememberNavController import cash.z.ecc.sdk.model.ZecRequest import cash.z.ecc.sdk.send -import co.electriccoin.zcash.ui.design.compat.FontCompat import co.electriccoin.zcash.ui.design.component.ConfigurationOverride import co.electriccoin.zcash.ui.design.component.GradientSurface import co.electriccoin.zcash.ui.design.component.Override @@ -82,15 +81,7 @@ class MainActivity : ComponentActivity() { setupSplashScreen() - if (FontCompat.isFontPrefetchNeeded()) { - lifecycleScope.launch { - FontCompat.prefetchFontsLegacy(applicationContext) - - setupUiContent() - } - } else { - setupUiContent() - } + setupUiContent() } private fun setupSplashScreen() {