Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
69 changes: 69 additions & 0 deletions .github/workflows/android_verification.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
name: Android Verification

on:
pull_request:
branches: [ "*" ]
push:
branches: [ "*" ]
Comment on lines +4 to +7

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Use ** so slash-separated branches are verified

In .github/workflows/android_verification.yml, both the pull_request and push triggers are filtered with branches: [ "*" ], which does not mean “all branches” in GitHub Actions: the official workflow syntax docs state that * does not match /, while ** does. As a result, pushes to common branch names like feature/indexer-migration or release/3.8 will skip this verification workflow entirely, leaving the new live contract and connected tests unrun for those changes. See GitHub's filter pattern cheat sheet: https://docs.github.com/en/actions/writing-workflows/workflow-syntax-for-github-actions#filter-pattern-cheat-sheet

Useful? React with 👍 / 👎.

workflow_dispatch:

concurrency:
group: android-verification-${{ github.ref }}
cancel-in-progress: true

jobs:
explorer-contracts:
name: Explorer Contracts
runs-on: ubuntu-latest
timeout-minutes: 30
env:
RUN_LIVE_EXPLORER_TESTS: "true"
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Set up JDK
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: 17

- name: Set up Android SDK
uses: android-actions/setup-android@v3

- name: Set up Gradle
uses: gradle/actions/setup-gradle@v4

- name: Run live explorer contract tests
run: ./gradlew :feature_blockexplorer_api:testDevelopDebugUnitTest --tests '*SoraMetricsLiveContractTest' --stacktrace --no-daemon

blockexplorer-connected:
name: Block Explorer Connected Test
runs-on: ubuntu-latest
timeout-minutes: 45
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Set up JDK
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: 17

- name: Set up Android SDK
uses: android-actions/setup-android@v3

- name: Set up Gradle
uses: gradle/actions/setup-gradle@v4

- name: Run connected block explorer test
uses: reactivecircus/android-emulator-runner@v2
with:
api-level: 36
target: google_apis
arch: x86_64
profile: pixel_6
disable-animations: true
emulator-options: -no-window -gpu swiftshader_indirect -no-snapshot -noaudio -no-boot-anim -camera-back none
script: ./gradlew :feature_blockexplorer_api:connectedDevelopDebugAndroidTest --stacktrace --no-daemon
65 changes: 40 additions & 25 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,37 +1,52 @@
import com.github.triplet.gradle.androidpublisher.ReleaseStatus
import com.google.firebase.appdistribution.gradle.firebaseAppDistribution
import com.google.firebase.crashlytics.buildtools.gradle.CrashlyticsExtension

plugins {
id("maven-publish")
alias(libs.plugins.androidApplication)
alias(libs.plugins.kotlinAndroid)
alias(libs.plugins.serialization)
alias(libs.plugins.hilt)
alias(libs.plugins.kapt)
alias(libs.plugins.googleServicesPlugin)
alias(libs.plugins.ksp)
alias(libs.plugins.firebaseCrashlyticsPlugin)
alias(libs.plugins.firebaseAppDistributionPlugin)
alias(libs.plugins.triplet)
id("kotlin-parcelize")
alias(libs.plugins.kover)
}

val googleServicesJsonFiles = fileTree(projectDir) {
include("google-services.json")
include("src/**/google-services.json")
}
val hasGoogleServicesJson = !googleServicesJsonFiles.isEmpty

if (hasGoogleServicesJson) {
apply(plugin = "com.google.gms.google-services")
} else {
logger.lifecycle("Skipping Google Services plugin because google-services.json is not present.")
}

kotlin {
jvmToolchain(17)
}

// soralution 143 3.8.6.3 2024.10.31
// sora dae 118 3.8.5.3 2024.10.23
// sora dae 122 3.8.6.3 2024.11.21
val appVersionCode = System.getenv("CI_BUILD_ID")?.toInt() ?: 122
val appVersionName = "3.8.6.3"

android {
namespace = "jp.co.soramitsu.sora"
compileSdk = 34
compileSdk = 36

defaultConfig {
applicationId = "jp.co.soramitsu.sora"
minSdk = 26
targetSdk = 34
versionCode = System.getenv("CI_BUILD_ID")?.toInt() ?: 143
versionName = "3.8.6.3"
targetSdk = 36
versionCode = appVersionCode
versionName = appVersionName
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
multiDexEnabled = true
// resConfigs "en", "ru", "es", "fr", "de", "nb", "in", "tr", "ar"
Expand All @@ -55,6 +70,9 @@ android {
isMinifyEnabled = true
signingConfig = signingConfigs.getByName("cidebug")
isShrinkResources = true
configure<CrashlyticsExtension> {
mappingFileUploadEnabled = hasGoogleServicesJson
}
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
Expand Down Expand Up @@ -92,6 +110,7 @@ android {
buildFeatures {
viewBinding = true
buildConfig = true
resValues = true
}
packaging {
resources {
Expand Down Expand Up @@ -143,15 +162,6 @@ android {
}
}

applicationVariants.all {
val variant = this
this.outputs.map { it as com.android.build.gradle.internal.api.BaseVariantOutputImpl }
.forEach {
it.outputFileName =
"SORA_Wallet_${variant.versionName}_${variant.versionCode}_${variant.flavorName}_${variant.buildType.name}.apk"
}
}

configurations {
all {
exclude(module = "bcprov-jdk15on")
Expand All @@ -164,8 +174,18 @@ android {
}
}

androidComponents {
onVariants { variant ->
variant.outputs.forEach { output ->
output.outputFileName.set(
"SORA_Wallet_${appVersionName}_${appVersionCode}_${variant.flavorName}_${variant.buildType}.apk"
)
}
}
}

hilt {
enableAggregatingTask = true
enableAggregatingTask = false
}

play {
Expand All @@ -179,6 +199,7 @@ play {
dependencies {
// implementation(libs.fileTree(dir: 'libs', include: ['*.jar'])
implementation(project(":common"))
implementation(project(":common_wallet"))
implementation(project(":core_db"))
implementation(project(":demeter"))
implementation(project(":feature_assets_api"))
Expand Down Expand Up @@ -224,12 +245,11 @@ dependencies {
implementation(libs.soramitsu.android.foundation)

implementation(libs.daggerDep)
kapt(libs.daggerKaptDep)
ksp(libs.hiltCompilerDep)
implementation(libs.hiltWorkManagerDep)
kapt(libs.hiltWorkManagerKaptDep)
ksp(libs.hiltWorkManagerCompilerDep)

implementation(libs.lifecycleProcessDep)
kapt(libs.lifecycleKaptDep)

implementation(libs.coroutineAndroidDep)
implementation(libs.coroutineDep)
Expand Down Expand Up @@ -277,11 +297,6 @@ dependencies {
kover(project(":sorasubstrate"))
kover(project(":network"))
}

kapt {
correctErrorTypes = true
}

kover {
reports {
variant("developDebug") {
Expand Down
39 changes: 39 additions & 0 deletions app/proguard-rules.pro
Original file line number Diff line number Diff line change
Expand Up @@ -214,3 +214,42 @@
-keep class com.google.api.services.drive.** {
*;
}

# Optional Sora Card SDK integrations are not packaged by this app.
-dontwarn com.paywings.kyc.android.sdk.data.enums.KycErrorCode
-dontwarn com.paywings.kyc.android.sdk.data.model.PayWingsUserCredentials
-dontwarn com.paywings.kyc.android.sdk.data.model.PayWingsWhiteLabelCredentials
-dontwarn com.paywings.kyc.android.sdk.initializer.PayWingsKycClient
-dontwarn com.paywings.oauth.android.sdk.data.enums.EnvironmentType
-dontwarn com.paywings.oauth.android.sdk.data.enums.HttpRequestMethod$Companion
-dontwarn com.paywings.oauth.android.sdk.data.enums.HttpRequestMethod
-dontwarn com.paywings.oauth.android.sdk.data.enums.OAuthErrorCode
-dontwarn com.paywings.oauth.android.sdk.data.model.AccessTokenData
-dontwarn com.paywings.oauth.android.sdk.data.model.ErrorData
-dontwarn com.paywings.oauth.android.sdk.data.model.GetNewAuthorizationDataResult
-dontwarn com.paywings.oauth.android.sdk.initializer.OAuthInitializationCallback
-dontwarn com.paywings.oauth.android.sdk.initializer.PayWingsOAuthClient$Companion
-dontwarn com.paywings.oauth.android.sdk.initializer.PayWingsOAuthClient
-dontwarn com.paywings.oauth.android.sdk.service.OAuthService
-dontwarn com.paywings.oauth.android.sdk.service.callback.ChangeUnverifiedEmailCallback
-dontwarn com.paywings.oauth.android.sdk.service.callback.CheckEmailVerifiedCallback
-dontwarn com.paywings.oauth.android.sdk.service.callback.GetUserDataCallback
-dontwarn com.paywings.oauth.android.sdk.service.callback.RegisterUserCallback
-dontwarn com.paywings.oauth.android.sdk.service.callback.SendNewVerificationEmailCallback
-dontwarn com.paywings.oauth.android.sdk.service.callback.SignInWithPhoneNumberRequestOtpCallback
-dontwarn com.paywings.oauth.android.sdk.service.callback.SignInWithPhoneNumberVerifyOtpCallback

# Optional JNDI/LDAP APIs referenced by crypto and HTTP libraries are not
# available on Android.
-dontwarn javax.naming.Binding
-dontwarn javax.naming.InvalidNameException
-dontwarn javax.naming.NamingEnumeration
-dontwarn javax.naming.NamingException
-dontwarn javax.naming.directory.Attribute
-dontwarn javax.naming.directory.Attributes
-dontwarn javax.naming.directory.DirContext
-dontwarn javax.naming.directory.InitialDirContext
-dontwarn javax.naming.directory.SearchControls
-dontwarn javax.naming.directory.SearchResult
-dontwarn javax.naming.ldap.LdapName
-dontwarn javax.naming.ldap.Rdn
4 changes: 2 additions & 2 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />

<queries>
<package android:name="com.soracard.iban.wallet"/>
<package android:name="com.soracard.iban.wallet.test"/>
<package android:name="com.soracard.wallet.iban"/>
<package android:name="com.soracard.wallet.iban.test"/>
</queries>

<application
Expand Down
10 changes: 7 additions & 3 deletions app/src/main/java/jp/co/soramitsu/sora/SoraApp.kt
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ import jp.co.soramitsu.androidfoundation.resource.ResourceManager
import jp.co.soramitsu.common.domain.DarkThemeManager
import jp.co.soramitsu.common.domain.OptionsProvider
import jp.co.soramitsu.common.io.FileManager
import jp.co.soramitsu.common.logger.FirebaseWrapper
import jp.co.soramitsu.common.util.BuildType
import jp.co.soramitsu.common.util.BuildUtils
import jp.co.soramitsu.common.util.Flavor
Expand Down Expand Up @@ -79,8 +80,8 @@ open class SoraApp : Application(), Configuration.Provider, ImageLoaderFactory {
return loader.build()
}

override val workManagerConfiguration: Configuration
get() = Configuration.Builder()
override fun getWorkManagerConfiguration(): Configuration =
Configuration.Builder()
.setWorkerFactory(workerFactory)
.build()

Expand All @@ -90,7 +91,10 @@ open class SoraApp : Application(), Configuration.Provider, ImageLoaderFactory {
initLogger()

registerActivityLifecycleCallbacks(resourceManager)
FirebaseApp.initializeApp(this)
val firebaseApp = runCatching { FirebaseApp.initializeApp(this) }
.onFailure { Timber.e(it) }
.getOrNull()
FirebaseWrapper.setCrashlyticsEnabled(firebaseApp != null)

OptionsProvider.CURRENT_VERSION_CODE = BuildConfig.VERSION_CODE
OptionsProvider.CURRENT_VERSION_NAME = BuildConfig.VERSION_NAME
Expand Down
26 changes: 14 additions & 12 deletions build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,22 +1,20 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
@Suppress("DSL_SCOPE_VIOLATION") // TODO: Remove once KTIJ-19369 is fixed
plugins {
alias(libs.plugins.androidApplication) apply false
alias(libs.plugins.androidLibrary) apply false
alias(libs.plugins.kotlinAndroid) apply false
alias(libs.plugins.composeCompiler) apply false
alias(libs.plugins.hilt) apply false
alias(libs.plugins.kapt) apply false
alias(libs.plugins.ksp) apply false
alias(libs.plugins.serialization) apply false
alias(libs.plugins.googleServicesPlugin) apply false
alias(libs.plugins.firebaseCrashlyticsPlugin) apply false
alias(libs.plugins.firebaseAppDistributionPlugin) apply false
alias(libs.plugins.triplet) apply false
id("com.google.devtools.ksp") version "1.9.24-1.0.20" apply false
id("org.jetbrains.kotlinx.kover") version "0.8.3"
alias(libs.plugins.kover)
}

tasks.register("clean", Delete::class) {
delete(rootProject.buildDir)
delete(layout.buildDirectory)
}

val ktlint by configurations.creating
Expand All @@ -36,12 +34,16 @@ tasks.register<JavaExec>("ktlintCheck") {
classpath = ktlint
mainClass.set("com.pinterest.ktlint.Main")
// see https://pinterest.github.io/ktlint/install/cli/#command-line-usage for more information
args(
"**/src/**/*.kt",
"**.kts",
"!**/build/**",
"--reporter=checkstyle,output=${project.buildDir}/reports/checkstyle/ktlint.xml"
)
val reportFile = layout.buildDirectory.file("reports/checkstyle/ktlint.xml")
val sourceFiles = fileTree(rootDir) {
include("**/src/**/*.kt")
include("**/*.gradle.kts")
include("settings.gradle.kts")
exclude("**/build/**")
exclude(".gradle/**")
}
args(sourceFiles.files.map { it.relativeTo(rootDir).path })
args("--reporter=checkstyle,output=${reportFile.get().asFile}")
}

tasks.register<JavaExec>("ktlintFormat") {
Expand Down
Loading
Loading