Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Upgrade to Kotlin 2.1.10 #654

Open
wants to merge 17 commits into
base: master
Choose a base branch
from
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
14 changes: 4 additions & 10 deletions BUILD.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,7 @@ You'll need to install the following:

Phoenix is an actual lightning node running on your phone. It contains much of the bitcoin/lightning protocol, contained in the [lightning-kmp](https://github.com/ACINQ/lightning-kmp) library, also developed by ACINQ.

Tags of the lightning-kmp library are released on public Maven repository, so you'll likely not have to build it yourself.

However, from time to time, Phoenix uses a SNAPSHOT development version of lightning-kmp. When that happens, you will have to build this library yourself on your local machine. To do that, follow [the lightning-kmp build instructions](https://github.com/ACINQ/lightning-kmp/blob/master/BUILD.md).
Tags of the lightning-kmp library are released on a public Maven repository. Sometimes during development, Phoenix uses a `snapshot`version ; this you will have to [build yourself](https://github.com/ACINQ/lightning-kmp/blob/master/BUILD.md).

## Build the application

Expand Down Expand Up @@ -56,19 +54,15 @@ skip.android=true

### Lightning-kmp versions

Make sure that the lightning-kmp version that phoenix depends on is the same that the lightning-kmp version you are building. Your local lightning-kmp repository may not be pointing to the version that `phoenix-android` requires.

Phoenix defines its lightning-kmp version in `buildSrc/src/main/kotlin/Versions.kt`, through the `val lightningKmp = "xxx"` field.

If this value is `snapshot` it means that the current phoenix `master` branch is using a development version of this library. In that case, there may be API changes in lightning-kmp which are not yet supported here.
The lightning-kmp version is set in `gradle/libs.version.toml`. If this version is a `snapshot`, phoenix is using a development version of lightning-kmp. Not only will you need to build it yourself, but Phoenix may also need to be patched if there are API changes.

## Release the Android app

Phoenix releases are built using a dockerized Linux environment. The build is not deterministic yet, we are working on it.

Notes:

- This tool works on Linux and Windows.
- This tool works on Macos, Linux and Windows.
- Following instructions only work for releases after v.1.3.1 (excluded).

### Prerequisites
Expand Down Expand Up @@ -99,7 +93,7 @@ docker build -t phoenix_build .
5. Build the APKs using the docker image (takes typically ~10min):

```shell
# If you're on linux:
# If you're on macOS/linux:
docker run --rm -v $(pwd):/home/ubuntu/phoenix/phoenix-android/build/outputs -w /home/ubuntu/phoenix phoenix_build ./gradlew :phoenix-android:assembleRelease

# If you're on Windows:
Expand Down
12 changes: 5 additions & 7 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,11 @@ buildscript {
}

dependencies {
classpath("com.android.tools.build:gradle:8.4.2")
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:${Versions.kotlin}")
classpath("org.jetbrains.kotlin:kotlin-serialization:${Versions.kotlin}")
classpath("app.cash.sqldelight:gradle-plugin:${Versions.sqlDelight}")

// Firebase cloud messaging plugin
classpath("com.google.gms:google-services:${Versions.fcmPlugin}")
classpath(libs.agp)
classpath(libs.kgp)
classpath(libs.serialization)
classpath(libs.sqldelight.plugin)
classpath(libs.fcm.plugin)
}
}

Expand Down
6 changes: 0 additions & 6 deletions buildSrc/build.gradle.kts

This file was deleted.

39 changes: 0 additions & 39 deletions buildSrc/src/main/kotlin/Versions.kt

This file was deleted.

4 changes: 1 addition & 3 deletions gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,7 @@ org.gradle.parallel = true

# Kotlin
kotlin.code.style = official
kotlin.mpp.stability.nowarn=true
kotlin.incremental.multiplatform = true
kotlin.parallel.tasks.in.project = true
kotlin.mpp.stability.nowarn = true
kotlin.mpp.enableCInteropCommonization = true

# Android
Expand Down
48 changes: 48 additions & 0 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
[versions]
lightningkmp = "1.8.5-SNAPSHOT"
secp256k1 = "0.17.1"

kotlin = "2.1.10"
ktor = "3.1.0"
sqldelight = "2.0.2"
okio = "3.8.0"

# iOS
skie = "0.10.1"

# Android
androidx-junit = "1.1.3"
androidx-corektx = "1.13.1"
androidx-appcompat = "1.7.0"
androidx-lifecycle = "2.8.7"

androidx-biometrics = "1.1.0"
androidx-datastore = "1.1.2"
androidx-workmanager = "2.9.1"

androidx-compose-common = "1.7.8"
androidx-compose-navigation = "2.8.7"
androidx-compose-constraintlayout = "1.1.0"
androidx-compose-material3 = "1.3.1"
accompanist = "0.30.1"

slf4j = "2.0.16"
zxing = "4.1.0"
logback = "3.0.0"

fcm = "24.1.0"
playservices = "18.5.0"

espresso = "3.3.0"
robolectric = "4.13"
agp = "8.8.0"

[libraries]
agp = { module = "com.android.tools.build:gradle", version.ref = "agp" }
kgp = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin" }
serialization = { module = "org.jetbrains.kotlin:kotlin-serialization", version.ref = "kotlin" }
sqldelight-plugin = { group = "app.cash.sqldelight", name = "gradle-plugin", version.ref = "sqldelight" }
fcm-plugin = { module = "com.google.gms:google-services", version = "4.4.2" }

[plugins]
compose = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" }
2 changes: 1 addition & 1 deletion gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip
83 changes: 44 additions & 39 deletions phoenix-android/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ plugins {
kotlin("android")
id("com.google.gms.google-services")
id("kotlinx-serialization")
alias(libs.plugins.compose)
}

fun gitCommitHash(): String {
Expand All @@ -28,7 +29,6 @@ android {
versionCode = 98
versionName = gitCommitHash()
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
resourceConfigurations.addAll(listOf("en", "fr", "de", "es", "b+es+419", "cs", "pt-rBR", "sk", "vi", "sw"))
}

buildTypes {
Expand All @@ -40,7 +40,7 @@ android {
getByName("release") {
resValue("string", "CHAIN", chain)
buildConfigField("String", "CHAIN", chain)
isMinifyEnabled = false
isMinifyEnabled = true
isDebuggable = false
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
Expand All @@ -55,6 +55,12 @@ android {
}
}

java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}

compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
Expand All @@ -72,70 +78,69 @@ android {
buildConfig = true
}

composeOptions {
kotlinCompilerExtensionVersion = Versions.Android.composeCompiler
androidResources {
localeFilters.addAll(listOf("en", "fr", "de", "es", "b+es+419", "cs", "pt-rBR", "sk", "vi", "sw"))
}
}

kotlin {
target {
compilations.all {
kotlinOptions.freeCompilerArgs += listOf("-Xskip-metadata-version-check", "-Xinline-classes", "-Xopt-in=kotlin.RequiresOptIn")
compilerOptions {
optIn.addAll("kotlin.RequiresOptIn")
freeCompilerArgs.addAll(listOf("-Xskip-metadata-version-check", "-Xinline-classes"))
}
}
}

//noinspection UseTomlInstead
dependencies {
implementation(project(":phoenix-shared"))

implementation("com.google.android.material:material:1.7.0")

// -- AndroidX
implementation("androidx.core:core-ktx:${Versions.Android.coreKtx}")
implementation("androidx.core:core-ktx:${libs.versions.androidx.corektx.get()}")
implementation("androidx.appcompat:appcompat:${libs.versions.androidx.appcompat.get()}")
// -- AndroidX: livedata
implementation("androidx.lifecycle:lifecycle-runtime-ktx:${Versions.Android.lifecycle}")
implementation("androidx.lifecycle:lifecycle-livedata-ktx:${Versions.Android.lifecycle}")
implementation("androidx.lifecycle:lifecycle-runtime-ktx:${libs.versions.androidx.lifecycle.get()}")
implementation("androidx.lifecycle:lifecycle-livedata-ktx:${libs.versions.androidx.lifecycle.get()}")
// -- AndroidX: preferences datastore
implementation("androidx.datastore:datastore-preferences:1.0.0")
implementation("androidx.datastore:datastore-preferences:${libs.versions.androidx.datastore.get()}")
// -- AndroidX: biometric
implementation("androidx.biometric:biometric:${Versions.Android.biometrics}")
implementation("androidx.biometric:biometric:${libs.versions.androidx.biometrics.get()}")
// -- AndroidX: work manager
implementation("androidx.work:work-runtime-ktx:${Versions.Android.work}")

implementation("androidx.work:work-runtime-ktx:${libs.versions.androidx.workmanager.get()}")

// -- jetpack compose
implementation("androidx.compose.ui:ui:${Versions.Android.compose}")
implementation("androidx.compose.foundation:foundation:${Versions.Android.compose}")
implementation("androidx.compose.foundation:foundation-layout:${Versions.Android.compose}")
implementation("androidx.compose.ui:ui-tooling:${Versions.Android.compose}")
implementation("androidx.compose.ui:ui-util:${Versions.Android.compose}")
implementation("androidx.compose.ui:ui-viewbinding:${Versions.Android.compose}")
implementation("androidx.compose.runtime:runtime-livedata:${Versions.Android.compose}")
implementation("androidx.compose.material:material:${Versions.Android.compose}")
implementation("androidx.compose.animation:animation:${Versions.Android.compose}")
implementation("androidx.compose.animation:animation-graphics:${Versions.Android.compose}")
implementation("androidx.compose.material3:material3:1.1.2")
implementation("androidx.compose.ui:ui:${libs.versions.androidx.compose.common.get()}")
implementation("androidx.compose.foundation:foundation:${libs.versions.androidx.compose.common.get()}")
implementation("androidx.compose.foundation:foundation-layout:${libs.versions.androidx.compose.common.get()}")
implementation("androidx.compose.ui:ui-tooling:${libs.versions.androidx.compose.common.get()}")
implementation("androidx.compose.ui:ui-util:${libs.versions.androidx.compose.common.get()}")
implementation("androidx.compose.ui:ui-viewbinding:${libs.versions.androidx.compose.common.get()}")
implementation("androidx.compose.runtime:runtime-livedata:${libs.versions.androidx.compose.common.get()}")
implementation("androidx.compose.material:material:${libs.versions.androidx.compose.common.get()}")
implementation("androidx.compose.animation:animation:${libs.versions.androidx.compose.common.get()}")
implementation("androidx.compose.animation:animation-graphics:${libs.versions.androidx.compose.common.get()}")
implementation("androidx.compose.material3:material3:${libs.versions.androidx.compose.material3.get()}")
// -- jetpack compose: navigation
implementation("androidx.navigation:navigation-compose:${Versions.Android.navCompose}")
implementation("androidx.navigation:navigation-compose:${libs.versions.androidx.compose.navigation.get()}")
// -- jetpack compose: accompanist (utility library for compose)
implementation("com.google.accompanist:accompanist-systemuicontroller:${Versions.Android.accompanist}")
implementation("com.google.accompanist:accompanist-permissions:${Versions.Android.accompanist}")
implementation("com.google.accompanist:accompanist-systemuicontroller:${libs.versions.accompanist.get()}")
implementation("com.google.accompanist:accompanist-permissions:${libs.versions.accompanist.get()}")
// -- constraint layout for compose
implementation("androidx.constraintlayout:constraintlayout-compose:${Versions.Android.composeConstraintLayout}")
implementation("androidx.constraintlayout:constraintlayout-compose:${libs.versions.androidx.compose.constraintlayout.get()}")

// -- scanner zxing
implementation("com.journeyapps:zxing-android-embedded:${Versions.Android.zxing}")
implementation("com.journeyapps:zxing-android-embedded:${libs.versions.zxing.get()}")

// logging
implementation("org.slf4j:slf4j-api:${Versions.slf4j}")
implementation("com.github.tony19:logback-android:${Versions.Android.logback}")
implementation("org.slf4j:slf4j-api:${libs.versions.slf4j.get()}")
implementation("com.github.tony19:logback-android:${libs.versions.logback.get()}")

// firebase cloud messaging
implementation("com.google.firebase:firebase-messaging:${Versions.Android.fcm}")
implementation("com.google.android.gms:play-services-base:18.5.0")
implementation("com.google.firebase:firebase-messaging:${libs.versions.fcm.get()}")
implementation("com.google.android.gms:play-services-base:${libs.versions.playservices.get()}")

testImplementation("junit:junit:${Versions.junit}")
testImplementation("app.cash.sqldelight:sqlite-driver:${Versions.sqlDelight}")
androidTestImplementation("androidx.test.ext:junit:1.1.4")
androidTestImplementation("androidx.test.espresso:espresso-core:${Versions.Android.espresso}")
testImplementation("app.cash.sqldelight:sqlite-driver:${libs.versions.sqldelight.get()}")
androidTestImplementation("androidx.test.ext:junit:${libs.versions.androidx.junit.get()}")
androidTestImplementation("androidx.test.espresso:espresso-core:${libs.versions.espresso.get()}")
}
1 change: 0 additions & 1 deletion phoenix-android/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:hardwareAccelerated="true"
android:extractNativeLibs="true"
android:theme="@style/Theme.PhoenixAndroid"
android:localeConfig="@xml/locales_config">

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -234,7 +234,7 @@ fun AmountInput(
imeAction = ImeAction.Done,
keyboardType = KeyboardType.Number,
capitalization = KeyboardCapitalization.None,
autoCorrect = false,
autoCorrectEnabled = false,
),
keyboardActions = KeyboardActions(onDone = { focusManager.clearFocus() }),
colors = outlinedTextFieldColors(),
Expand Down Expand Up @@ -326,7 +326,7 @@ fun InlineSatoshiInput(
imeAction = ImeAction.Done,
keyboardType = KeyboardType.Number,
capitalization = KeyboardCapitalization.None,
autoCorrect = false,
autoCorrectEnabled = false,
),
keyboardActions = KeyboardActions(onDone = { focusManager.clearFocus() }),
colors = outlinedTextFieldColors(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.layout.*
import androidx.compose.material.Checkbox
import androidx.compose.material.Text
import androidx.compose.material.ripple
import androidx.compose.material.ripple.rememberRipple
import androidx.compose.runtime.*
import androidx.compose.runtime.saveable.rememberSaveable
Expand Down Expand Up @@ -59,7 +60,7 @@ fun Checkbox(
onCheckedChange = null,
modifier = Modifier.indication(
interactionSource = interactionSource,
indication = rememberRipple(bounded = false, color = if (isDarkTheme) gray300 else gray600, radius = 28.dp)
indication = ripple(bounded = false, color = if (isDarkTheme) gray300 else gray600, radius = 28.dp)
)
)
Spacer(Modifier.width(12.dp))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -236,7 +236,7 @@ fun NumberInput(
imeAction = ImeAction.Done,
keyboardType = KeyboardType.Number,
capitalization = KeyboardCapitalization.None,
autoCorrect = false,
autoCorrectEnabled = false,
),
keyboardActions = KeyboardActions(onDone = { focusManager.clearFocus() }),
colors = outlinedTextFieldColors(),
Expand Down Expand Up @@ -284,7 +284,7 @@ fun RowScope.InlineNumberInput(
imeAction = ImeAction.Done,
keyboardType = KeyboardType.Number,
capitalization = KeyboardCapitalization.None,
autoCorrect = false,
autoCorrectEnabled = false,
),
keyboardActions = KeyboardActions(onDone = { focusManager.clearFocus() }),
colors = outlinedTextFieldColors(),
Expand Down
Loading