[#209] Compose dependency update

* [#209] Update Compose dependency to latest version 1.2.0-beta03

- Update dependency
- Align our integration tests with the new Compose requirements
- Add integration folder to tests, if missing
- Split integration tests, which require activity to separate classes
- Remove unnecessary custom activity for each integration app part and create one custom common activity
- Implement Downloadable fonts from Compose 1.2
- Update Third party licenses documentation
This commit is contained in:
Honza Rychnovsky 2022-06-14 08:50:55 +02:00 committed by GitHub
parent 3d5ed7b10b
commit 90c2fcb255
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
28 changed files with 251 additions and 315 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -0,0 +1,32 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2022 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<resources>
<array name="com_google_android_gms_fonts_certs">
<item>@array/com_google_android_gms_fonts_certs_dev</item>
<item>@array/com_google_android_gms_fonts_certs_prod</item>
</array>
<string-array name="com_google_android_gms_fonts_certs_dev">
<item>
MIIEqDCCA5CgAwIBAgIJANWFuGx90071MA0GCSqGSIb3DQEBBAUAMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTAeFw0wODA0MTUyMzM2NTZaFw0zNTA5MDEyMzM2NTZaMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTCCASAwDQYJKoZIhvcNAQEBBQADggENADCCAQgCggEBANbOLggKv+IxTdGNs8/TGFy0PTP6DHThvbbR24kT9ixcOd9W+EaBPWW+wPPKQmsHxajtWjmQwWfna8mZuSeJS48LIgAZlKkpFeVyxW0qMBujb8X8ETrWy550NaFtI6t9+u7hZeTfHwqNvacKhp1RbE6dBRGWynwMVX8XW8N1+UjFaq6GCJukT4qmpN2afb8sCjUigq0GuMwYXrFVee74bQgLHWGJwPmvmLHC69EH6kWr22ijx4OKXlSIx2xT1AsSHee70w5iDBiK4aph27yH3TxkXy9V89TDdexAcKk/cVHYNnDBapcavl7y0RiQ4biu8ymM8Ga/nmzhRKya6G0cGw8CAQOjgfwwgfkwHQYDVR0OBBYEFI0cxb6VTEM8YYY6FbBMvAPyT+CyMIHJBgNVHSMEgcEwgb6AFI0cxb6VTEM8YYY6FbBMvAPyT+CyoYGapIGXMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbYIJANWFuGx90071MAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEEBQADggEBABnTDPEF+3iSP0wNfdIjIz1AlnrPzgAIHVvXxunW7SBrDhEglQZBbKJEk5kT0mtKoOD1JMrSu1xuTKEBahWRbqHsXclaXjoBADb0kkjVEJu/Lh5hgYZnOjvlba8Ld7HCKePCVePoTJBdI4fvugnL8TsgK05aIskyY0hKI9L8KfqfGTl1lzOv2KoWD0KWwtAWPoGChZxmQ+nBli+gwYMzM1vAkP+aayLe0a1EQimlOalO762r0GXO0ks+UeXde2Z4e+8S/pf7pITEI/tP+MxJTALw9QUWEv9lKTk+jkbqxbsh8nfBUapfKqYn0eidpwq2AzVp3juYl7//fKnaPhJD9gs=
</item>
</string-array>
<string-array name="com_google_android_gms_fonts_certs_prod">
<item>
MIIEQzCCAyugAwIBAgIJAMLgh0ZkSjCNMA0GCSqGSIb3DQEBBAUAMHQxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtHb29nbGUgSW5jLjEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDAeFw0wODA4MjEyMzEzMzRaFw0zNjAxMDcyMzEzMzRaMHQxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtHb29nbGUgSW5jLjEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDCCASAwDQYJKoZIhvcNAQEBBQADggENADCCAQgCggEBAKtWLgDYO6IIrgqWbxJOKdoR8qtW0I9Y4sypEwPpt1TTcvZApxsdyxMJZ2JORland2qSGT2y5b+3JKkedxiLDmpHpDsz2WCbdxgxRczfey5YZnTJ4VZbH0xqWVW/8lGmPav5xVwnIiJS6HXk+BVKZF+JcWjAsb/GEuq/eFdpuzSqeYTcfi6idkyugwfYwXFU1+5fZKUaRKYCwkkFQVfcAs1fXA5V+++FGfvjJ/CxURaSxaBvGdGDhfXE28LWuT9ozCl5xw4Yq5OGazvV24mZVSoOO0yZ31j7kYvtwYK6NeADwbSxDdJEqO4k//0zOHKrUiGYXtqw/A0LFFtqoZKFjnkCAQOjgdkwgdYwHQYDVR0OBBYEFMd9jMIhF1Ylmn/Tgt9r45jk14alMIGmBgNVHSMEgZ4wgZuAFMd9jMIhF1Ylmn/Tgt9r45jk14aloXikdjB0MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEUMBIGA1UEChMLR29vZ2xlIEluYy4xEDAOBgNVBAsTB0FuZHJvaWQxEDAOBgNVBAMTB0FuZHJvaWSCCQDC4IdGZEowjTAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBAUAA4IBAQBt0lLO74UwLDYKqs6Tm8/yzKkEu116FmH4rkaymUIE0P9KaMftGlMexFlaYjzmB2OxZyl6euNXEsQH8gjwyxCUKRJNexBiGcCEyj6z+a1fuHHvkiaai+KL8W1EyNmgjmyy8AW7P+LLlkR+ho5zEHatRbM/YAnqGcFh5iZBqpknHf1SKMXFh4dd239FJ1jWYfbMDMy3NS5CTMQ2XFI1MvcyUTdZPErjQfTbQe3aDQsQcafEQPD+nqActifKZ0Np0IS9L9kR/wbNvyz6ENwPiTrjV2KRkEjH78ZMcUQXg0L3BYHJ3lc69Vs5Ddf9uUGGMYldX3WfMBEmh/9iFBDAaTCK
</item>
</string-array>
</resources>

View File

@ -6,7 +6,7 @@
<application
android:label="zcash-ui-integration-test">
<activity
android:name="co.electriccoin.zcash.ui.integration.test.screen.scan.TestScanActivity"
android:name="co.electriccoin.zcash.ui.integration.test.common.IntegrationTestingActivity"
android:exported="false" />
</application>

View File

@ -0,0 +1,5 @@
package co.electriccoin.zcash.ui.integration.test.common
import androidx.activity.ComponentActivity
class IntegrationTestingActivity : ComponentActivity()

View File

@ -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 = {},
)
}
}
}
}
}

View File

@ -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<TestScanActivity>()
val composeTestRule = createAndroidComposeRule<IntegrationTestingActivity>()
private lateinit var testSetup: ScanViewTestSetup

View File

@ -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<TestScanActivity>()
val composeTestRule = createAndroidComposeRule<IntegrationTestingActivity>()
private lateinit var testSetup: ScanViewTestSetup

View File

@ -6,13 +6,7 @@
<application
android:label="zcash-ui-test" >
<activity
android:name="co.electriccoin.zcash.ui.screen.onboarding.TestOnboardingActivity"
android:exported="false" />
<activity
android:name="co.electriccoin.zcash.ui.screen.backup.TestBackupActivity"
android:exported="false" />
<activity
android:name="co.electriccoin.zcash.ui.screen.update.TestUpdateActivity"
android:name="co.electriccoin.zcash.ui.common.UiTestingActivity"
android:exported="false" />
</application>

View File

@ -0,0 +1,5 @@
package co.electriccoin.zcash.ui.common
import androidx.activity.ComponentActivity
class UiTestingActivity : ComponentActivity()

View File

@ -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 = {}
)
}
}
}
}
}

View File

@ -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<UiTestingActivity>()
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())
}
}

View File

@ -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<TestBackupActivity>()
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())
}
}

View File

@ -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<OnboardingViewModel>()
// 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()
}
}
}

View File

@ -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<UiTestingActivity>()
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())
}
}

View File

@ -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<TestOnboardingActivity>()
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())
}
}

View File

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

View File

@ -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<UiTestingActivity>()
@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()
}
}

View File

@ -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<TestUpdateActivity>()
val composeTestRule = createAndroidComposeRule<UiTestingActivity>()
private lateinit var viewModel: UpdateViewModel
private lateinit var checker: AppUpdateCheckerMock

View File

@ -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<TestUpdateActivity>()
val composeTestRule = createAndroidComposeRule<ComponentActivity>()
companion object {
val context: Context = ApplicationProvider.getApplicationContext()

View File

@ -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<TestUpdateActivity>()
@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

View File

@ -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() {