diff --git a/app/build.gradle.kts b/app/build.gradle.kts index c3155d45..916b2085 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -207,6 +207,7 @@ val googlePlayServiceKeyFilePath = project.property("ZCASH_GOOGLE_PLAY_SERVICE_K androidComponents { onVariants { variant -> for (output in variant.outputs) { + // Configure strict mode in runtime variant.buildConfigFields.put( "IS_STRICT_MODE_CRASH_ENABLED", BuildConfigField( diff --git a/build.gradle.kts b/build.gradle.kts index e2963e0b..d5f30233 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -101,6 +101,7 @@ tasks { "ZCASH_RELEASE_APP_NAME" to "Zashi", "ZCASH_RELEASE_PACKAGE_NAME" to "co.electriccoin.zcash", "ZCASH_SUPPORT_EMAIL_ADDRESS" to "support@electriccoin.co", + "IS_SECURE_SCREEN_PROTECTION_ACTIVE" to "true", "ZCASH_DEBUG_KEYSTORE_PATH" to "", "ZCASH_RELEASE_KEYSTORE_PATH" to "", diff --git a/gradle.properties b/gradle.properties index 3f8ffb08..3e1ecce7 100644 --- a/gradle.properties +++ b/gradle.properties @@ -61,6 +61,10 @@ ZCASH_RELEASE_PACKAGE_NAME=co.electriccoin.zcash ZCASH_DEBUG_APP_NAME_SUFFIX=" (D)" ZCASH_SUPPORT_EMAIL_ADDRESS=support@electriccoin.co +# Recommended protection of screens with sensitive data. +# It is enabled by default to protect the developers from revealing their wallet secrets by mistake. +IS_SECURE_SCREEN_PROTECTION_ACTIVE=true + # Set keystore details to enable build signing. Typically these # are overridden via ~/.gradle/gradle.properties to allow secure injection. # Debug keystore is useful if using Google Maps or Firebase, which require API keys to be linked diff --git a/ui-lib/build.gradle.kts b/ui-lib/build.gradle.kts index b0ed6b60..a1afcd57 100644 --- a/ui-lib/build.gradle.kts +++ b/ui-lib/build.gradle.kts @@ -1,3 +1,5 @@ +import com.android.build.api.variant.BuildConfigField + plugins { id("com.android.library") kotlin("android") @@ -51,6 +53,20 @@ android { } } +androidComponents { + onVariants { variant -> + // Configure SecureScreen for protecting screens with sensitive data in runtime + variant.buildConfigFields.put( + "IS_SECURE_SCREEN_ENABLED", + BuildConfigField( + type = "boolean", + value = project.property("IS_SECURE_SCREEN_PROTECTION_ACTIVE").toString(), + comment = null + ) + ) + } +} + dependencies { implementation(libs.accompanist.permissions) implementation(libs.androidx.activity) diff --git a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/common/model/VersionInfoTest.kt b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/common/model/VersionInfoTest.kt index d4e07ddc..005a02a3 100644 --- a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/common/model/VersionInfoTest.kt +++ b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/common/model/VersionInfoTest.kt @@ -16,7 +16,6 @@ class VersionInfoTest { // We expect some VersionInfo object parameters to be empty during the testing // isDebuggable is not tested as it's not static during UI testing in CI or locally - assertEquals("null", versionInfo.versionName) assertEquals(0, versionInfo.versionCode) assertNotEquals(versionInfo.gitSha, "") diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/backup/view/LongNewWalletBackupView.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/backup/view/LongNewWalletBackupView.kt index 94ec0fe4..63401997 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/backup/view/LongNewWalletBackupView.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/backup/view/LongNewWalletBackupView.kt @@ -43,6 +43,7 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle import cash.z.ecc.android.sdk.model.PersistableWallet import cash.z.ecc.sdk.fixture.PersistableWalletFixture import co.electriccoin.zcash.spackle.model.Index +import co.electriccoin.zcash.ui.BuildConfig import co.electriccoin.zcash.ui.R import co.electriccoin.zcash.ui.common.SecureScreen import co.electriccoin.zcash.ui.design.MINIMAL_WEIGHT @@ -202,7 +203,9 @@ private fun EducationRecoveryPhrase() { @Composable private fun SeedPhrase(persistableWallet: PersistableWallet) { - SecureScreen() + if (BuildConfig.IS_SECURE_SCREEN_ENABLED) { + SecureScreen() + } Column( Modifier .verticalScroll(rememberScrollState()) @@ -225,14 +228,16 @@ private data class TestChoice(val originalIndex: Index, val word: String) */ @Composable +@Suppress("LongMethod") private fun TestInProgress( splitSeedPhrase: ImmutableList, selectedTestChoices: TestChoices, onChoicesChanged: ((choicesCount: Int) -> Unit)?, backupState: BackupState ) { - SecureScreen() - + if (BuildConfig.IS_SECURE_SCREEN_ENABLED) { + SecureScreen() + } val testChoices = splitSeedPhrase .mapIndexed { index, word -> TestChoice(Index(index), word) } .filter { testIndices.contains(it.originalIndex) } diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/backup/view/ShortNewWalletBackupView.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/backup/view/ShortNewWalletBackupView.kt index 23ea87e9..42414cfb 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/backup/view/ShortNewWalletBackupView.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/backup/view/ShortNewWalletBackupView.kt @@ -32,6 +32,7 @@ import androidx.compose.ui.tooling.preview.Devices import androidx.compose.ui.tooling.preview.Preview import cash.z.ecc.android.sdk.model.PersistableWallet import cash.z.ecc.sdk.fixture.PersistableWalletFixture +import co.electriccoin.zcash.ui.BuildConfig import co.electriccoin.zcash.ui.R import co.electriccoin.zcash.ui.common.SecureScreen import co.electriccoin.zcash.ui.design.component.Body @@ -111,7 +112,9 @@ private fun ShortNewWalletMainContent( @Composable private fun SeedPhrase(persistableWallet: PersistableWallet) { - SecureScreen() + if (BuildConfig.IS_SECURE_SCREEN_ENABLED) { + SecureScreen() + } Column { Body(stringResource(R.string.new_wallet_short_body)) ChipGrid(persistableWallet.seedPhrase.split.toPersistentList()) diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/restore/view/RestoreView.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/restore/view/RestoreView.kt index 7f88bd9b..06b968ad 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/restore/view/RestoreView.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/restore/view/RestoreView.kt @@ -63,6 +63,7 @@ import cash.z.ecc.android.sdk.model.BlockHeight import cash.z.ecc.android.sdk.model.ZcashNetwork import cash.z.ecc.sdk.model.SeedPhraseValidation import co.electriccoin.zcash.spackle.model.Index +import co.electriccoin.zcash.ui.BuildConfig import co.electriccoin.zcash.ui.R import co.electriccoin.zcash.ui.common.SecureScreen import co.electriccoin.zcash.ui.design.MINIMAL_WEIGHT @@ -201,7 +202,9 @@ fun RestoreWallet( when (currentStage) { RestoreStage.Seed -> { - SecureScreen() + if (BuildConfig.IS_SECURE_SCREEN_ENABLED) { + SecureScreen() + } RestoreSeedMainContent( userWordList = userWordList, diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/seed/view/SeedView.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/seed/view/SeedView.kt index f42cdbb0..288623c6 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/seed/view/SeedView.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/seed/view/SeedView.kt @@ -22,6 +22,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import cash.z.ecc.android.sdk.model.PersistableWallet import cash.z.ecc.sdk.fixture.PersistableWalletFixture +import co.electriccoin.zcash.ui.BuildConfig import co.electriccoin.zcash.ui.R import co.electriccoin.zcash.ui.common.SecureScreen import co.electriccoin.zcash.ui.design.component.Body @@ -55,7 +56,9 @@ fun Seed( onBack: () -> Unit, onCopyToClipboard: () -> Unit ) { - SecureScreen() + if (BuildConfig.IS_SECURE_SCREEN_ENABLED) { + SecureScreen() + } Scaffold(topBar = { SeedTopAppBar(onBack = onBack) }) { paddingValues ->