[#1666] Release v1.2.2

* Adopt Zcash SDK v2.2.6

* Changelogs version update

* Version name change

* Update WHATS_NEW_EN.md

updated Whats New for 1.2.2 release

* Update WHATS_NEW_ES.md

Updated WhatsNew in Spanish for 1.2.2 release

* Switch to non-snapshot Zcash SDK version

* Fix app version in What’s New title

* Center longer screen text

* ChangelogParser works with translated titles

---------

Co-authored-by: Andrea Kobrlova <109794238+true-jared@users.noreply.github.com>
This commit is contained in:
Honza Rychnovský 2024-11-18 12:33:33 +01:00 committed by GitHub
parent d31f713361
commit 13cf2c435d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
9 changed files with 124 additions and 58 deletions

View File

@ -6,6 +6,8 @@ and this application adheres to [Semantic Versioning](https://semver.org/spec/v2
## [Unreleased] ## [Unreleased]
## [1.2.2 (788)] - 2024-11-17
### Added ### Added
- Address book encryption - Address book encryption
- Android auto backup support for address book encryption - Android auto backup support for address book encryption
@ -21,6 +23,7 @@ and this application adheres to [Semantic Versioning](https://semver.org/spec/v2
- The Not enough space and In-app udpate screens have been redesigned - The Not enough space and In-app udpate screens have been redesigned
- External links now open in in-app browser - External links now open in in-app browser
- All the Settings screens have been redesigned - All the Settings screens have been redesigned
- Adopted Zcash SDK version 2.2.6
### Fixed ### Fixed
- Address book toast now correctly shows on send screen when adding both new and known addresses to text field - Address book toast now correctly shows on send screen when adding both new and known addresses to text field

View File

@ -3,6 +3,8 @@ package publish
import org.intellij.markdown.ast.getTextInNode import org.intellij.markdown.ast.getTextInNode
import org.intellij.markdown.flavours.gfm.GFMFlavourDescriptor import org.intellij.markdown.flavours.gfm.GFMFlavourDescriptor
import org.intellij.markdown.parser.MarkdownParser import org.intellij.markdown.parser.MarkdownParser
import publish.ChangelogParser.ENGLISH_TAG
import publish.ChangelogParser.SPANISH_TAG
import java.io.File import java.io.File
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.Date import java.util.Date
@ -15,6 +17,18 @@ object ChangelogParser {
private const val CHANGELOG_TITLE_POSITION = 0 private const val CHANGELOG_TITLE_POSITION = 0
private const val UNRELEASED_TITLE_POSITION = 4 private const val UNRELEASED_TITLE_POSITION = 4
internal const val ENGLISH_TAG = "EN"
internal const val SPANISH_TAG = "ES"
private const val ADDED_PART_EN = "Added"
private const val ADDED_PART_ES = "Agregado"
private const val CHANGED_PART_EN = "Changed"
private const val CHANGED_PART_ES = "Cambiado"
private const val FIXED_PART_EN = "Fixed"
private const val FIXED_PART_ES = "Arreglado"
private const val REMOVED_PART_EN = "Removed"
private const val REMOVED_PART_ES = "Removido"
private fun log(value: Any) { private fun log(value: Any) {
if (DEBUG_LOGS_ENABLED) { if (DEBUG_LOGS_ENABLED) {
println(value) println(value)
@ -23,9 +37,10 @@ object ChangelogParser {
fun getChangelogEntry( fun getChangelogEntry(
filePath: String, filePath: String,
versionNameFallback: String languageTag: LanguageTag,
versionNameFallback: String,
): ChangelogEntry { ): ChangelogEntry {
log("Parser: starting...") log("Parser: starting for file: $filePath")
val src = File(filePath).readText() val src = File(filePath).readText()
val parsedTree = MarkdownParser(GFMFlavourDescriptor()).buildMarkdownTreeFromString(src) val parsedTree = MarkdownParser(GFMFlavourDescriptor()).buildMarkdownTreeFromString(src)
@ -46,7 +61,7 @@ object ChangelogParser {
"Provided changelog file is incorrect or its structure is malformed." "Provided changelog file is incorrect or its structure is malformed."
} }
val fromIndex = findFirstValidNodeIndex(nodes) val fromIndex = findFirstValidNodeIndex(languageTag, nodes)
log("Parser: index from: $fromIndex") log("Parser: index from: $fromIndex")
val toIndex = val toIndex =
@ -67,10 +82,10 @@ object ChangelogParser {
ChangelogEntry( ChangelogEntry(
version = parts.getVersionPart(versionNameFallback), version = parts.getVersionPart(versionNameFallback),
date = parts.getDatePart(), date = parts.getDatePart(),
added = parts.getNodePart("Added"), added = parts.getNodePart(titleByLanguage(TitleType.ADDED, languageTag)),
changed = parts.getNodePart("Changed"), changed = parts.getNodePart(titleByLanguage(TitleType.CHANGED, languageTag)),
fixed = parts.getNodePart("Fixed"), fixed = parts.getNodePart(titleByLanguage(TitleType.FIXED, languageTag)),
removed = parts.getNodePart("Removed"), removed = parts.getNodePart(titleByLanguage(TitleType.REMOVED, languageTag)),
) )
} }
@ -78,9 +93,12 @@ object ChangelogParser {
return lastChangelogEntry return lastChangelogEntry
} }
private fun findFirstValidNodeIndex(nodes: List<String>): Int { private fun findFirstValidNodeIndex(
languageTag: LanguageTag,
nodes: List<String>
): Int {
nodes.forEachIndexed { index, node -> nodes.forEachIndexed { index, node ->
if (findNodeByPrefix(node) && findValidSubNodeByPrefix(nodes[index + 1])) { if (findNodeByPrefix(node) && findValidSubNodeByPrefix(languageTag, nodes[index + 1])) {
return index return index
} }
} }
@ -90,17 +108,21 @@ object ChangelogParser {
private fun findNodeByPrefix(node: String): Boolean = node.startsWith("## [") private fun findNodeByPrefix(node: String): Boolean = node.startsWith("## [")
private fun findValidSubNodeByPrefix(subNode: String): Boolean = private fun findValidSubNodeByPrefix(
subNode.startsWith("### Added") || languageTag: LanguageTag,
subNode.startsWith("### Changed") || subNode: String
subNode.startsWith("### Fixed") || ): Boolean =
subNode.startsWith("### Removed") subNode.startsWith("### ${titleByLanguage(TitleType.ADDED, languageTag)}") ||
subNode.startsWith("### ${titleByLanguage(TitleType.CHANGED, languageTag)}") ||
subNode.startsWith("### ${titleByLanguage(TitleType.FIXED, languageTag)}") ||
subNode.startsWith("### ${titleByLanguage(TitleType.REMOVED, languageTag)}")
private fun List<String>.getVersionPart(versionNameFallback: String): String { private fun List<String>.getVersionPart(versionNameFallback: String): String {
return if (this.contains("## [Unreleased]")) { return if (this.contains("## [Unreleased]")) {
versionNameFallback versionNameFallback
} else { } else {
this[0].split("[")[1].split("]")[0].trim() // Parse just version name omitting version code as we currently don't need it in the UI
this[0].split("[")[1].split(" ")[0].trim()
} }
} }
@ -142,4 +164,45 @@ object ChangelogParser {
ChangelogEntrySection(title = title, content = it) ChangelogEntrySection(title = title, content = it)
} }
} }
private fun titleByLanguage(
type: TitleType,
languageTag: LanguageTag
): String {
return when (type) {
TitleType.ADDED ->
when (languageTag) {
is LanguageTag.English -> ADDED_PART_EN
is LanguageTag.Spanish -> ADDED_PART_ES
}
TitleType.CHANGED ->
when (languageTag) {
is LanguageTag.English -> CHANGED_PART_EN
is LanguageTag.Spanish -> CHANGED_PART_ES
}
TitleType.FIXED ->
when (languageTag) {
is LanguageTag.English -> FIXED_PART_EN
is LanguageTag.Spanish -> FIXED_PART_ES
}
TitleType.REMOVED ->
when (languageTag) {
is LanguageTag.English -> REMOVED_PART_EN
is LanguageTag.Spanish -> REMOVED_PART_ES
}
}
}
}
sealed class LanguageTag(open val tag: String) {
data class English(override val tag: String = ENGLISH_TAG) : LanguageTag(tag)
data class Spanish(override val tag: String = SPANISH_TAG) : LanguageTag(tag)
}
private enum class TitleType {
ADDED,
CHANGED,
FIXED,
REMOVED
} }

View File

@ -241,7 +241,11 @@ abstract class PublishToGooglePlay @Inject constructor(
val inAppUpdatePriority = project.property("ZCASH_IN_APP_UPDATE_PRIORITY").toString().toInt() val inAppUpdatePriority = project.property("ZCASH_IN_APP_UPDATE_PRIORITY").toString().toInt()
val releaseNotes: List<LocalizedText> = getReleaseNotesFor( val releaseNotes: List<LocalizedText> = getReleaseNotesFor(
gradleVersionName, listOf("EN", "ES") gradleVersionName = gradleVersionName,
languageTags = listOf(
LanguageTag.English(),
LanguageTag.Spanish()
)
) )
log("Publish - Version: $versionName has been uploaded") log("Publish - Version: $versionName has been uploaded")
@ -279,14 +283,18 @@ abstract class PublishToGooglePlay @Inject constructor(
private val releaseNotesFilePath = "docs/whatsNew/WHATS_NEW_" private val releaseNotesFilePath = "docs/whatsNew/WHATS_NEW_"
private val releaseNotesFileSuffix = ".md" private val releaseNotesFileSuffix = ".md"
private fun getReleaseNotesFor(gradleVersionName: String, languageTags: List<String>): MutableList<LocalizedText> { private fun getReleaseNotesFor(
gradleVersionName: String,
languageTags: List<LanguageTag>
): MutableList<LocalizedText> {
return buildList { return buildList {
languageTags.forEach { languageTag -> languageTags.forEach { languageTag ->
// A description of what is new in this release in form of [LocalizedText] // A description of what is new in this release in form of [LocalizedText]
add(LocalizedText().apply { add(LocalizedText().apply {
language = languageTag language = languageTag.tag
text = ChangelogParser.getChangelogEntry( text = ChangelogParser.getChangelogEntry(
filePath = releaseNotesFilePath + languageTag + releaseNotesFileSuffix, filePath = releaseNotesFilePath + languageTag + releaseNotesFileSuffix,
languageTag = languageTag,
versionNameFallback = gradleVersionName versionNameFallback = gradleVersionName
).toInAppUpdateReleaseNotesText() ).toInAppUpdateReleaseNotesText()
}) })

View File

@ -1,5 +1,6 @@
import co.electriccoin.zcash.Git import co.electriccoin.zcash.Git
import publish.ChangelogParser import publish.ChangelogParser
import publish.LanguageTag
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.Date import java.util.Date
import java.util.TimeZone import java.util.TimeZone
@ -103,14 +104,16 @@ fun fillInReleaseNotes(inputs: TaskInputs) {
val releaseNotesEnJson = ChangelogParser.getChangelogEntry( val releaseNotesEnJson = ChangelogParser.getChangelogEntry(
filePath = releaseNotesEnPath, filePath = releaseNotesEnPath,
versionNameFallback = gradleVersionName versionNameFallback = gradleVersionName,
languageTag = LanguageTag.English()
).toJsonString() ).toJsonString()
inputs.property(releaseNotesEn, releaseNotesEnJson) inputs.property(releaseNotesEn, releaseNotesEnJson)
val releaseNotesEsJson = ChangelogParser.getChangelogEntry( val releaseNotesEsJson = ChangelogParser.getChangelogEntry(
filePath = releaseNotesEsPath, filePath = releaseNotesEsPath,
versionNameFallback = gradleVersionName versionNameFallback = gradleVersionName,
languageTag = LanguageTag.Spanish()
).toJsonString() ).toJsonString()
inputs.property(releaseNotesEs, releaseNotesEsJson) inputs.property(releaseNotesEs, releaseNotesEsJson)

View File

@ -9,27 +9,21 @@ directly impact users rather than highlighting other key architectural updates.*
## [Unreleased] ## [Unreleased]
## [1.2.2 (788)] - 2024-11-17
### Added ### Added
- Address book encryption - Hola! We taught Zashi to speak Spanish!
- Android auto backup support for address book encryption - We adopted SDK release 2.2.6 which should help speed up sending multiple transactions.
- The device authentication feature on the Zashi app launch has been added - We implemented encryption and remote storage for Address Book!
- Zashi app now supports Spanish language. It can be changed in the System settings options. - We added device authentication to app launch.
- The Flexa SDK has been adopted to enable payments using the embedded Flexa UI - We added animated progress screen and new success and failure screens.
- New Sending, Success, Failure, and GrpcFailure subscreens of the Send Confirmation screen have been added
- New Copy Transaction IDs feature has been added to the MultipleTransactionFailure screen
### Changed ### Changed
- Shielded transactions are properly indicated in transaction history - We made Settings and status screens pretty.
- The in-app update logic has been fixed and is now correctly requested with every app launch - Let us know how you like Zashi with the improved Send Feedback feature.
- The Not enough space and In-app udpate screens have been redesigned
- External links now open in in-app browser
- All the Settings screens have been redesigned
### Fixed ### Fixed
- Address book toast now correctly shows on send screen when adding both new and known addresses to text field - We fixed the shield icon behaviour in Transaction History.
- The application now correctly navigates to the homepage after deleting the current wallet and creating a new or
recovering an older one
- The in-app update logic has been fixed and is now correctly requested with every app launch
## [1.2.1 (760)] - 2024-10-22 ## [1.2.1 (760)] - 2024-10-22

View File

@ -9,24 +9,18 @@ directly impact users rather than highlighting other key architectural updates.*
## [Unreleased] ## [Unreleased]
### Added ## [1.2.2 (788)] - 2024-11-17
- Address book encryption
- Android auto backup support for address book encryption
- The device authentication feature on the Zashi app launch has been added
- Zashi app now supports Spanish language. It can be changed in the System settings options.
- The Flexa SDK has been adopted to enable payments using the embedded Flexa UI
- New Sending, Success, Failure, and GrpcFailure subscreens of the Send Confirmation screen have been added
- New Copy Transaction IDs feature has been added to the MultipleTransactionFailure screen
### Changed ### Agregado
- Shielded transactions are properly indicated in transaction history - ¡Hola!, Zashi aprendió Español.
- The in-app update logic has been fixed and is now correctly requested with every app launch - Nuevo manejo de transacciones de baja denominación, esto hace transacciones más rápidas y uso eficiente del saldo.
- The Not enough space and In-app udpate screens have been redesigned - Implementación de encriptado y almacenamiento remoto de información en agenda.
- External links now open in in-app browser - Se agrego una barra de progreso y nuevas pantallas de éxito y falla.
- All the Settings screens have been redesigned - Inicio de aplicación con autenticación implementada.
### Fixed ### Cambiado
- Address book toast now correctly shows on send screen when adding both new and known addresses to text field - Mejora en pantalla de configuración y estatus.
- The application now correctly navigates to the homepage after deleting the current wallet and creating a new or - Comentarios y sugerencias mejoradas.
recovering an older one
- The in-app update logic has been fixed and is now correctly requested with every app launch ### Arreglado
- Icono de transacciones privadas arreglado.

View File

@ -61,7 +61,7 @@ NDK_DEBUG_SYMBOL_LEVEL=symbol_table
# VERSION_CODE is effectively ignored. VERSION_NAME is suffixed with the version code. # VERSION_CODE is effectively ignored. VERSION_NAME is suffixed with the version code.
# If not using automated Google Play deployment, then these serve as the actual version numbers. # If not using automated Google Play deployment, then these serve as the actual version numbers.
ZCASH_VERSION_CODE=1 ZCASH_VERSION_CODE=1
ZCASH_VERSION_NAME=1.2.1 ZCASH_VERSION_NAME=1.2.2
# Set these fields, as you need them (e.g. with values "Zcash X" and "co.electriccoin.zcash.x") # Set these fields, as you need them (e.g. with values "Zcash X" and "co.electriccoin.zcash.x")
# to distinguish a different release build that can be installed alongside the official version # to distinguish a different release build that can be installed alongside the official version
@ -220,7 +220,7 @@ ZCASH_BIP39_VERSION=1.0.8
FLEXA_VERSION=1.0.5 FLEXA_VERSION=1.0.5
# WARNING: Ensure a non-snapshot version is used before releasing to production # WARNING: Ensure a non-snapshot version is used before releasing to production
ZCASH_SDK_VERSION=2.2.5-SNAPSHOT ZCASH_SDK_VERSION=2.2.6
# Toolchain is the Java version used to build the application, which is separate from the # Toolchain is the Java version used to build the application, which is separate from the
# Java version used to run the application. # Java version used to run the application.

View File

@ -218,7 +218,8 @@ private fun Empty(
text = stringResource(id = R.string.address_book_empty), text = stringResource(id = R.string.address_book_empty),
fontWeight = FontWeight.SemiBold, fontWeight = FontWeight.SemiBold,
color = ZashiColors.Text.textPrimary, color = ZashiColors.Text.textPrimary,
style = ZashiTypography.header6 style = ZashiTypography.header6,
textAlign = TextAlign.Center
) )
} }