Skip to content
Merged
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
4 changes: 4 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,7 @@ indent_size = 4
[*.md]
max_line_length = off
trim_trailing_whitespace = false

[*.json]
max_line_length = off
indent_size = 2
155 changes: 75 additions & 80 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,26 +1,23 @@
plugins {
id("com.android.application")
id("kotlin-android")
id("org.jetbrains.kotlin.plugin.serialization")
id("com.google.devtools.ksp")
id("com.google.dagger.hilt.android")
id("com.google.gms.google-services")
alias(libs.plugins.android.application)
alias(libs.plugins.kotlin.android)
alias(libs.plugins.kotlin.serialization)
alias(libs.plugins.ksp)
alias(libs.plugins.hilt.android)
alias(libs.plugins.google.services)
alias(libs.plugins.room)
}

android {
namespace = "to.bitkit"
compileSdk = 34
ndkVersion = "26.1.10909125"

ndkVersion = "26.1.10909125" // probably required by LDK bindings? - safer to keep it for now.
defaultConfig {
applicationId = "to.bitkit"
minSdk = 28
targetSdk = 34
versionCode = 1
versionName = "1.0"

testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"

vectorDrawables {
useSupportLibrary = true
}
Expand All @@ -36,7 +33,7 @@ android {
buildTypes {
debug {
signingConfig = signingConfigs.getByName("debug")
// applicationIdSuffix = ".dev"
applicationIdSuffix = ".dev"
}
release {
isMinifyEnabled = false
Expand All @@ -47,17 +44,18 @@ android {
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
}
kotlinOptions {
jvmTarget = "1.8"
jvmTarget = "11"
}
buildFeatures {
buildConfig = true
compose = true
}
composeOptions {
// https://developer.android.com/jetpack/androidx/releases/compose-kotlin#pre-release_kotlin_compatibility
kotlinCompilerExtensionVersion = "1.5.14"
}
packaging {
Expand All @@ -66,76 +64,73 @@ android {
}
}
}

dependencies {
implementation(fileTree("libs") { include("*.aar") })

// BDK & LDK
implementation("org.bitcoindevkit:bdk-android:0.30.0")
implementation("org.lightningdevkit:ldk-node-android:0.3.0")

implementation("androidx.core:core-ktx:1.13.1")
implementation("androidx.appcompat:appcompat:1.7.0")
implementation("androidx.activity:activity-compose:1.9.1")

implementation(libs.core.ktx)
implementation(libs.appcompat)
implementation(libs.activity.compose)
implementation(libs.material)
// BDK + LDK
implementation(libs.bdk.android)
implementation(libs.ldk.node.android)
// Firebase
implementation(platform("com.google.firebase:firebase-bom:33.1.2"))
implementation("com.google.firebase:firebase-messaging")
implementation("com.google.firebase:firebase-analytics")

implementation(platform(libs.firebase.bom))
implementation(libs.firebase.messaging)
implementation(libs.firebase.analytics)
// Lifecycle
val lifecycleVersion = "2.8.4"
// ViewModel
implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycleVersion")
implementation("androidx.lifecycle:lifecycle-viewmodel-compose:$lifecycleVersion") // ViewModel utils for Compose
implementation("androidx.lifecycle:lifecycle-livedata-ktx:$lifecycleVersion") // LiveData
implementation("androidx.lifecycle:lifecycle-runtime-ktx:$lifecycleVersion") // Lifecycles wo ViewModel/LiveData
implementation("androidx.lifecycle:lifecycle-runtime-compose:$lifecycleVersion") // Lifecycle utils for Compose
implementation("androidx.lifecycle:lifecycle-viewmodel-savedstate:$lifecycleVersion") // Saved state for ViewModel

implementation(libs.lifecycle.viewmodel.ktx)
implementation(libs.lifecycle.viewmodel.compose) // ViewModel utils for Compose
implementation(libs.lifecycle.livedata.ktx) // LiveData
implementation(libs.lifecycle.runtime.ktx) // Lifecycles wo ViewModel/LiveData
implementation(libs.lifecycle.runtime.compose) // Lifecycle utils for Compose
implementation(libs.lifecycle.viewmodel.savedstate) // Saved state for ViewModel
// Compose
implementation(platform(libs.compose.bom))
androidTestImplementation(platform(libs.compose.bom))
implementation(libs.material3)
implementation(libs.material.icons.extended)
implementation(libs.ui.tooling.preview)
debugImplementation(libs.ui.tooling)
debugImplementation(libs.ui.test.manifest)
androidTestImplementation(libs.ui.test.junit4)
// Compose Navigation
val composeNavigationVersion = "2.7.7"
implementation("androidx.navigation:navigation-compose:$composeNavigationVersion")
androidTestImplementation("androidx.navigation:navigation-testing:$composeNavigationVersion")
implementation("androidx.hilt:hilt-navigation-compose:1.2.0")

// Compose Tooling for Android Studio Preview
val composeToolingVersion = "1.6.8"
implementation("androidx.compose.ui:ui-tooling-preview:$composeToolingVersion")
debugImplementation("androidx.compose.ui:ui-tooling:$composeToolingVersion")

// Dagger-Hilt
val hiltVersion = "2.51.1"
implementation("com.google.dagger:hilt-android:$hiltVersion")
ksp("com.google.dagger:hilt-android-compiler:$hiltVersion")
ksp("androidx.hilt:hilt-compiler:1.2.0")

implementation(libs.navigation.compose)
androidTestImplementation(libs.navigation.testing)
implementation(libs.hilt.navigation.compose)
// Hilt - DI
implementation(libs.hilt.android)
ksp(libs.hilt.android.compiler)
ksp(libs.hilt.compiler)
// WorkManager
implementation("androidx.hilt:hilt-work:1.2.0")
implementation("androidx.work:work-runtime-ktx:2.9.0")

// Material Design
implementation("com.google.android.material:material:1.12.0")
implementation("androidx.compose.material3:material3:1.2.1")
implementation("androidx.compose.material:material-icons-extended:1.7.0-beta06")

// Ktor
val ktorVersion = "2.3.8"
implementation("io.ktor:ktor-client-core:$ktorVersion")
implementation("io.ktor:ktor-client-okhttp:$ktorVersion")
implementation("io.ktor:ktor-client-cio:$ktorVersion")
implementation("io.ktor:ktor-client-logging:$ktorVersion")
implementation("io.ktor:ktor-client-content-negotiation:$ktorVersion")
implementation("io.ktor:ktor-serialization-kotlinx-json:$ktorVersion")
implementation("ch.qos.logback:logback-classic:1.2.11")

// Testing
debugImplementation("androidx.compose.ui:ui-test-manifest:1.6.8")
testImplementation("junit:junit:4.13.2")
androidTestImplementation("androidx.test.ext:junit:1.2.1")
androidTestImplementation("androidx.test.espresso:espresso-core:3.6.1")
androidTestImplementation("androidx.compose.ui:ui-test-junit4:1.6.8")

implementation(libs.hilt.work)
implementation(libs.work.runtime.ktx)
// Ktor - Networking
implementation(libs.ktor.client.core)
implementation(libs.ktor.client.okhttp)
implementation(libs.ktor.client.cio)
implementation(libs.ktor.client.logging)
implementation(libs.ktor.client.content.negotiation)
implementation(libs.ktor.serialization.kotlinx.json)
debugImplementation(libs.slf4j.simple)
// Room - DB
implementation(libs.room.ktx)
implementation(libs.room.runtime)
ksp(libs.room.compiler)
testImplementation(libs.room.testing)
// Test + Debug
androidTestImplementation(libs.espresso.core)
androidTestImplementation(libs.junit.ext)
androidTestImplementation(libs.kotlin.test.junit)
testImplementation(libs.junit)
testImplementation(libs.kotlin.test.junit)
// Other
implementation("com.google.guava:guava:31.1-android") // for ByteArray.toHex()+
implementation(libs.guava) // for ByteArray.toHex()+
}
ksp {
// cool but strict: https://developer.android.com/jetpack/androidx/releases/room#2.6.0
// arg("room.generateKotlin", "true")
}
// https://developer.android.com/jetpack/androidx/releases/room#gradle-plugin
room {
schemaDirectory("$projectDir/schemas")
}
Binary file added app/libs/LDK-release.aar
Binary file not shown.
34 changes: 34 additions & 0 deletions app/schemas/to.bitkit.data.AppDb/1.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
{
"formatVersion": 1,
"database": {
"version": 1,
"identityHash": "ea0d5b36d92a5a3fb1523c3064686f7d",
"entities": [
{
"tableName": "config",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`walletIndex` INTEGER NOT NULL, PRIMARY KEY(`walletIndex`))",
"fields": [
{
"fieldPath": "walletIndex",
"columnName": "walletIndex",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"walletIndex"
]
},
"indices": [],
"foreignKeys": []
}
],
"views": [],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'ea0d5b36d92a5a3fb1523c3064686f7d')"
]
}
}
Binary file added app/src/androidTest/assets/ldk-backup/manager.bin
Binary file not shown.
Binary file added app/src/androidTest/assets/ldk-backup/monitor.bin
Binary file not shown.
1 change: 1 addition & 0 deletions app/src/androidTest/assets/ldk-backup/seed.bin
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
n� ��J�L��m��Κ��L&����ǥ�4��~�
22 changes: 0 additions & 22 deletions app/src/androidTest/java/to/bitkit/ExampleInstrumentedTest.kt

This file was deleted.

38 changes: 38 additions & 0 deletions app/src/androidTest/java/to/bitkit/LdkMigrationTest.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package to.bitkit

import android.content.Context
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.platform.app.InstrumentationRegistry
import org.junit.Test
import org.junit.runner.RunWith
import to.bitkit.ext.readAsset
import to.bitkit.ldk.LightningService
import to.bitkit.ldk.MigrationService
import kotlin.test.assertTrue

@RunWith(AndroidJUnit4::class)
class LdkMigrationTest {
private val mnemonic = "pool curve feature leader elite dilemma exile toast smile couch crane public"

private val context: Context by lazy { InstrumentationRegistry.getInstrumentation().context }
private val appContext: Context by lazy { InstrumentationRegistry.getInstrumentation().targetContext }

@Test
fun nodeShouldStartFromBackupAfterMigration() {
val seed = context.readAsset("ldk-backup/seed.bin")
val manager = context.readAsset("ldk-backup/manager.bin")
val monitor = context.readAsset("ldk-backup/monitor.bin")

MigrationService(appContext).migrate(seed, manager, listOf(monitor))

with(LightningService()) {
init(mnemonic)
start()

assertTrue { nodeId == "02cd08b7b375e4263849121f9f0ffb2732a0b88d0fb74487575ac539b374f45a55" }
assertTrue { channels.isNotEmpty() }

stop()
}
}
}
2 changes: 2 additions & 0 deletions app/src/main/java/to/bitkit/App.kt
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ internal class App : Application(), Configuration.Provider {
override fun onCreate() {
super.onCreate()
currentActivity = CurrentActivity().also { registerActivityLifecycleCallbacks(it) }

Env.LdkStorage.init(filesDir.absolutePath)
}

override fun onTerminate() {
Expand Down
Loading