forked from fritob/Camper-Monitor
Damit steht der erste Teil vollständig: Protokoll, Funk und Ablage übersetzen sich, die 50 Prüfungen laufen. Die Funkschicht folgt der iOS-Fassung samt allem, was wir uns dort erst erarbeiten mussten. Ein eigener Thread für alles, was Bluetooth anfasst; Android ruft Scan- und GATT-Rückmeldungen auf Binder-Threads auf. Die Wartesperre nach Fehlschlägen, die zwischen einem Abbruch einer stehenden Verbindung und einem echten Fehlschlag unterscheidet. Stellbefehle, die aufgehoben statt verworfen werden, wenn die Kühlbox gerade weg ist. Die Zwanzig-Byte-Grenze beim Schreiben an die Kühlbox. Die stabile Reihenfolge der Kandidaten, damit nicht der Zufall die Schreibart bestimmt. Vier Dinge sind auf Android anders und im Quelltext vermerkt: Die Herstellerdaten kommen ohne die zwei Bytes der Company-ID - die steht im Schlüssel der Tabelle. Sie werden wieder davorgesetzt, damit derselbe Rahmen ankommt wie unter iOS und dieselben Prüfungen gelten. Notify muss über einen Deskriptor eingeschaltet werden; das Einschalten auf unserer Seite allein genügt nicht. Geräte werden über ihre MAC-Adresse angesprochen statt über eine systemvergebene Kennung - iOS gibt die Adresse gar nicht heraus. Die Victron-Schlüssel liegen in app-privater Ablage statt im Schlüsselbund. Das schützt gegen andere Apps, ist aber nicht hardwaregestützt. Ohne zusätzliche Bibliothek gibt es unter Android kein gleichwertiges Gegenstück. Als Nächstes die Oberfläche. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
61 lines
1.7 KiB
Kotlin
61 lines
1.7 KiB
Kotlin
plugins {
|
|
id("com.android.application")
|
|
id("org.jetbrains.kotlin.android")
|
|
id("org.jetbrains.kotlin.plugin.compose")
|
|
}
|
|
|
|
android {
|
|
namespace = "de.fritob.campermonitor"
|
|
compileSdk = 35
|
|
|
|
defaultConfig {
|
|
applicationId = "de.fritob.campermonitor"
|
|
// Android 8: älter lohnt nicht, dort fehlt zu viel an Bluetooth LE.
|
|
minSdk = 26
|
|
targetSdk = 35
|
|
versionCode = 1
|
|
versionName = "1.0"
|
|
}
|
|
|
|
buildTypes {
|
|
release {
|
|
isMinifyEnabled = false
|
|
}
|
|
}
|
|
|
|
compileOptions {
|
|
sourceCompatibility = JavaVersion.VERSION_17
|
|
targetCompatibility = JavaVersion.VERSION_17
|
|
}
|
|
|
|
kotlinOptions {
|
|
jvmTarget = "17"
|
|
}
|
|
|
|
buildFeatures {
|
|
compose = true
|
|
}
|
|
|
|
sourceSets["main"].java.srcDirs("src/main/kotlin")
|
|
}
|
|
|
|
dependencies {
|
|
implementation(project(":protocol"))
|
|
|
|
val composeBom = platform("androidx.compose:compose-bom:2024.12.01")
|
|
implementation(composeBom)
|
|
implementation("androidx.compose.material3:material3")
|
|
implementation("androidx.compose.material:material-icons-extended")
|
|
implementation("androidx.compose.ui:ui")
|
|
implementation("androidx.compose.ui:ui-tooling-preview")
|
|
debugImplementation("androidx.compose.ui:ui-tooling")
|
|
|
|
implementation("androidx.core:core-ktx:1.15.0")
|
|
implementation("androidx.activity:activity-compose:1.9.3")
|
|
implementation("androidx.lifecycle:lifecycle-runtime-compose:2.8.7")
|
|
implementation("androidx.navigation:navigation-compose:2.8.5")
|
|
|
|
// Die Ablage der Geräte und Profile nutzt org.json aus Android selbst -
|
|
// eine weitere Bibliothek lohnt für eine Handvoll Felder nicht.
|
|
}
|