- Calls keep going with the app in the background: a foreground service (CallService.kt, driven from lib/matrix/call_service.dart) declares the microphone, the camera while it's on and the screen while it's shared. Its notification (CallStyle) shows the call's length, opens the call and hangs up. Swiping the app away ends the call. - Screen sharing on Android: consent, then media projection on the service, then LiveKit publishes a screen-share track. A shared screen replaces the sharer's camera on their tile, shown whole and unmirrored; stopping it from Android's controls stops the share. - Read receipts per thread (MSC3771): an open thread sends receipts with thread_id, "Read" under replies comes from receipts in the thread, and threads with unread replies get a dot on "N replies" and in the list. Not tested on a device yet. README updated. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
81 lines
2.4 KiB
Kotlin
81 lines
2.4 KiB
Kotlin
import java.util.Properties
|
|
|
|
plugins {
|
|
id("com.android.application")
|
|
// The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins.
|
|
id("dev.flutter.flutter-gradle-plugin")
|
|
}
|
|
|
|
// Release signing comes from android/key.properties (not committed); without
|
|
// it a release build is signed with the debug key, so `flutter run --release`
|
|
// still works on a development machine.
|
|
val keyProperties = Properties().apply {
|
|
val file = rootProject.file("key.properties")
|
|
if (file.exists()) file.inputStream().use { load(it) }
|
|
}
|
|
|
|
android {
|
|
namespace = "io.github.dariuszjaniak.warp"
|
|
compileSdk = flutter.compileSdkVersion
|
|
ndkVersion = flutter.ndkVersion
|
|
|
|
compileOptions {
|
|
// flutter_local_notifications uses java.time on older Android versions.
|
|
isCoreLibraryDesugaringEnabled = true
|
|
sourceCompatibility = JavaVersion.VERSION_17
|
|
targetCompatibility = JavaVersion.VERSION_17
|
|
}
|
|
|
|
defaultConfig {
|
|
applicationId = "io.github.dariuszjaniak.warp"
|
|
minSdk = flutter.minSdkVersion
|
|
targetSdk = flutter.targetSdkVersion
|
|
versionCode = flutter.versionCode
|
|
versionName = flutter.versionName
|
|
}
|
|
|
|
signingConfigs {
|
|
if (keyProperties.isNotEmpty()) {
|
|
create("release") {
|
|
storeFile = file(keyProperties.getProperty("storeFile"))
|
|
storePassword = keyProperties.getProperty("storePassword")
|
|
keyAlias = keyProperties.getProperty("keyAlias")
|
|
keyPassword = keyProperties.getProperty("keyPassword")
|
|
}
|
|
}
|
|
}
|
|
|
|
buildTypes {
|
|
release {
|
|
signingConfig = if (keyProperties.isNotEmpty()) {
|
|
signingConfigs.getByName("release")
|
|
} else {
|
|
signingConfigs.getByName("debug")
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
kotlin {
|
|
compilerOptions {
|
|
jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_17
|
|
}
|
|
}
|
|
|
|
dependencies {
|
|
coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.1.5")
|
|
// The ongoing call notification (CallService).
|
|
implementation("androidx.core:core-ktx:1.17.0")
|
|
}
|
|
|
|
// UnifiedPush's connector depends on Tink's JVM artifact and
|
|
// flutter_secure_storage on its Android one: the same classes twice. Keep
|
|
// the Android build.
|
|
configurations.all {
|
|
exclude(group = "com.google.crypto.tink", module = "tink")
|
|
}
|
|
|
|
flutter {
|
|
source = "../.."
|
|
}
|