From eebb3a589d6adb4a59a4fe7fcc26b7d07b8e5527 Mon Sep 17 00:00:00 2001 From: Reinout Meliesie Date: Thu, 22 Jan 2026 19:29:45 +0100 Subject: [PATCH] Reformat to use more standard Android code style Follows stock Android Studio styles for Kotlin and XML except that we use an indent of two and allow up to three consecutive empty lines. --- app/build.gradle.kts | 126 +++---- app/src/main/AndroidManifest.xml | 34 +- .../com/kernelmaft/zanbur/common/app-state.kt | 44 +-- .../com/kernelmaft/zanbur/common/config.kt | 24 +- .../com/kernelmaft/zanbur/common/ontology.kt | 16 +- .../zanbur/network/exception-printer.kt | 6 +- .../com/kernelmaft/zanbur/network/mqtt.kt | 64 ++-- .../kernelmaft/zanbur/network/zigbee2mqtt.kt | 27 +- .../com/kernelmaft/zanbur/ui/components.kt | 82 +++-- .../com/kernelmaft/zanbur/ui/compose-state.kt | 32 +- .../com/kernelmaft/zanbur/ui/main-activity.kt | 67 ++-- .../java/com/kernelmaft/zanbur/ui/theme.kt | 47 +-- .../res/drawable/ic_launcher_background.xml | 334 +++++++++--------- .../res/drawable/ic_launcher_foreground.xml | 56 +-- .../main/res/mipmap-anydpi/ic_launcher.xml | 6 +- .../res/mipmap-anydpi/ic_launcher_round.xml | 6 +- settings.gradle.kts | 22 +- 17 files changed, 512 insertions(+), 481 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index a50eaa1..5bd858d 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -1,85 +1,85 @@ -import java.io.FileInputStream -import java.util.Properties -import org.gradle.kotlin.dsl.android import org.jetbrains.kotlin.gradle.dsl.JvmTarget import org.jetbrains.kotlin.gradle.tasks.KotlinCompile +import java.io.FileInputStream +import java.util.Properties -val keystoreProperties = Properties () -keystoreProperties . load ( FileInputStream ( rootProject . file ("keystore.properties") ) ) +val keystoreProperties = Properties() +keystoreProperties.load(FileInputStream(rootProject.file("keystore.properties"))) plugins { - id ("com.android.application") . version ("9.0.0") - id ("org.jetbrains.kotlin.plugin.compose") . version ("2.3.0") - id ("org.jetbrains.kotlin.plugin.serialization") . version ("2.3.0") + id("com.android.application").version("9.0.0") + id("org.jetbrains.kotlin.plugin.compose").version("2.3.0") + id("org.jetbrains.kotlin.plugin.serialization").version("2.3.0") } android { - namespace = "com.kernelmaft.zanbur" - compileSdk = 36 + namespace = "com.kernelmaft.zanbur" + compileSdk = 36 - defaultConfig { - applicationId = "com.kernelmaft.zanbur" - minSdk = 36 - targetSdk = 36 - versionCode = 1 - versionName = "1.0" - } + defaultConfig { + applicationId = "com.kernelmaft.zanbur" + minSdk = 36 + targetSdk = 36 + versionCode = 1 + versionName = "1.0" + } - signingConfigs { - create ("kernelmaft") { - keyAlias = "kernelmaft" - keyPassword = keystoreProperties ["keyPassword"] as String - storeFile = file ( keystoreProperties ["storeFile"] as String ) - storePassword = keystoreProperties ["storePassword"] as String - } - } + signingConfigs { + create("kernelmaft") { + keyAlias = "kernelmaft" + keyPassword = keystoreProperties["keyPassword"] as String + storeFile = file(keystoreProperties["storeFile"] as String) + storePassword = keystoreProperties["storePassword"] as String + } + } - buildTypes { - debug { - signingConfig = signingConfigs . getByName ("kernelmaft") - } - release { - isMinifyEnabled = true - isShrinkResources = true - signingConfig = signingConfigs . getByName ("kernelmaft") - } - } - compileOptions { - // Required even though we don't have any Java sources because it needs to match Kotlin's JVM version - targetCompatibility = JavaVersion . VERSION_25 - } - buildFeatures { - compose = true - } + buildTypes { + debug { + signingConfig = signingConfigs.getByName("kernelmaft") + } + release { + isMinifyEnabled = true + isShrinkResources = true + signingConfig = signingConfigs.getByName("kernelmaft") + } + } + compileOptions { + // Required even though we don't have any Java sources because it needs to match Kotlin's JVM + // version. + targetCompatibility = JavaVersion.VERSION_25 + } + buildFeatures { + compose = true + } } kotlin { - compilerOptions { - jvmTarget = JvmTarget . JVM_25 - } + compilerOptions { + jvmTarget = JvmTarget.JVM_25 + } } dependencies { - // Android runtime libraries - implementation ( "com.google.android.material:material:1.13.0" ) - implementation ( "androidx.activity:activity-compose:1.12.2" ) - implementation ( "androidx.core:core-ktx:1.17.0" ) - implementation ( "androidx.compose.material3:material3:1.4.0" ) - implementation ( "androidx.compose.ui:ui:1.10.1" ) - implementation ( "androidx.compose.ui:ui-graphics:1.10.1" ) - debugImplementation ( "androidx.compose.ui:ui-tooling:1.10.1" ) - implementation ( "androidx.lifecycle:lifecycle-runtime-ktx:2.10.0" ) - implementation ( "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.10.2" ) - implementation ( "org.jetbrains.kotlinx:kotlinx-serialization-json:1.10.0" ) - // Other libraries - implementation ( "io.github.davidepianca98:kmqtt-common:1.0.0" ) - implementation ( "io.github.davidepianca98:kmqtt-client:1.0.0" ) + // Android runtime libraries. + implementation("com.google.android.material:material:1.13.0") + implementation("androidx.activity:activity-compose:1.12.2") + implementation("androidx.core:core-ktx:1.17.0") + implementation("androidx.compose.material3:material3:1.4.0") + implementation("androidx.compose.ui:ui:1.10.1") + implementation("androidx.compose.ui:ui-graphics:1.10.1") + debugImplementation("androidx.compose.ui:ui-tooling:1.10.1") + implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.10.0") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.10.2") + implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.10.0") + // Other libraries. + implementation("io.github.davidepianca98:kmqtt-common:1.0.0") + implementation("io.github.davidepianca98:kmqtt-client:1.0.0") } -tasks . withType ( KotlinCompile :: class ) . all { - compilerOptions { - freeCompilerArgs . addAll ("-opt-in=kotlin.ExperimentalUnsignedTypes") - } +tasks.withType(KotlinCompile::class).all { + compilerOptions { + freeCompilerArgs.addAll("-opt-in=kotlin.ExperimentalUnsignedTypes") + } } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 76919a9..e26b188 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,26 +1,26 @@ - + - - + + - + - + - - - - + + + + - + - + diff --git a/app/src/main/java/com/kernelmaft/zanbur/common/app-state.kt b/app/src/main/java/com/kernelmaft/zanbur/common/app-state.kt index 6abdb42..86a896b 100644 --- a/app/src/main/java/com/kernelmaft/zanbur/common/app-state.kt +++ b/app/src/main/java/com/kernelmaft/zanbur/common/app-state.kt @@ -2,30 +2,32 @@ package com.kernelmaft.zanbur.common -enum class ChangeSource { Local , Remote } +enum class ChangeSource { Local, Remote } -typealias CurrentSceneSubscriber = ( Group , Scene , ChangeSource ) -> Unit -typealias GroupAddedSubscriber = ( Group , ChangeSource ) -> Unit +typealias CurrentSceneSubscriber = (Group, Scene, ChangeSource) -> Unit +typealias GroupAddedSubscriber = (Group, ChangeSource) -> Unit object AppState { - private val currentSceneSubscribers : MutableList = mutableListOf () - private val groupAddedSubscribers : MutableList = mutableListOf () + private val currentSceneSubscribers: MutableList = mutableListOf() + private val groupAddedSubscribers: MutableList = mutableListOf() - fun setCurrentScene ( group : Group , newScene : Scene , source : ChangeSource ) { - for ( subscriber in currentSceneSubscribers ) { - subscriber ( group , newScene , source ) - } - } - fun subscribeToCurrentScene ( subscriber : CurrentSceneSubscriber ) { - currentSceneSubscribers . add (subscriber) - } + fun setCurrentScene(group: Group, newScene: Scene, source: ChangeSource) { + for (subscriber in currentSceneSubscribers) { + subscriber(group, newScene, source) + } + } - fun addGroup ( newGroup : Group , source : ChangeSource ) { - for ( subscriber in groupAddedSubscribers ) { - subscriber ( newGroup , source ) - } - } - fun subscribeToGroupAdded ( subscriber : GroupAddedSubscriber ) { - groupAddedSubscribers . add (subscriber) - } + fun subscribeToCurrentScene(subscriber: CurrentSceneSubscriber) { + currentSceneSubscribers.add(subscriber) + } + + fun addGroup(newGroup: Group, source: ChangeSource) { + for (subscriber in groupAddedSubscribers) { + subscriber(newGroup, source) + } + } + + fun subscribeToGroupAdded(subscriber: GroupAddedSubscriber) { + groupAddedSubscribers.add(subscriber) + } } diff --git a/app/src/main/java/com/kernelmaft/zanbur/common/config.kt b/app/src/main/java/com/kernelmaft/zanbur/common/config.kt index 0fb9d9f..3b9fdf0 100644 --- a/app/src/main/java/com/kernelmaft/zanbur/common/config.kt +++ b/app/src/main/java/com/kernelmaft/zanbur/common/config.kt @@ -3,16 +3,18 @@ package com.kernelmaft.zanbur.common object Config { - const val MQTT_SERVER_HOST = "merovech.kernelmaft.com" - const val MQTT_SERVER_PORT = 1883 - const val MQTT_TOPIC = "zigbee2mqtt" + const val MQTT_SERVER_HOST = "merovech.kernelmaft.com" + const val MQTT_SERVER_PORT = 1883 + const val MQTT_TOPIC = "zigbee2mqtt" - val groups = listOf ( - Group ( 0 , "All lights" , listOf ( - Scene ( 0 , "Warm" ) , - Scene ( 1 , "Warm dim" ) , - Scene ( 2 , "Warm dim with purple" ) , - Scene ( 100 , "All off" ) , - ) ) - ) + val groups = listOf( + Group( + 0, "All lights", listOf( + Scene(0, "Warm"), + Scene(1, "Warm dim"), + Scene(2, "Warm dim with purple"), + Scene(100, "All off"), + ) + ) + ) } diff --git a/app/src/main/java/com/kernelmaft/zanbur/common/ontology.kt b/app/src/main/java/com/kernelmaft/zanbur/common/ontology.kt index 86e8a1c..c6451c1 100644 --- a/app/src/main/java/com/kernelmaft/zanbur/common/ontology.kt +++ b/app/src/main/java/com/kernelmaft/zanbur/common/ontology.kt @@ -2,14 +2,14 @@ package com.kernelmaft.zanbur.common -data class Group ( - val id : Int , - val name : String , - val scenes : List , - val currentScene : Scene ? = null , +data class Group( + val id: Int, + val name: String, + val scenes: List, + val currentScene: Scene? = null, ) -data class Scene ( - val id : Int , - val name : String , +data class Scene( + val id: Int, + val name: String, ) diff --git a/app/src/main/java/com/kernelmaft/zanbur/network/exception-printer.kt b/app/src/main/java/com/kernelmaft/zanbur/network/exception-printer.kt index cd8b172..31d9f26 100644 --- a/app/src/main/java/com/kernelmaft/zanbur/network/exception-printer.kt +++ b/app/src/main/java/com/kernelmaft/zanbur/network/exception-printer.kt @@ -4,7 +4,7 @@ import kotlinx.coroutines.CoroutineExceptionHandler -val exceptionPrinter = CoroutineExceptionHandler { _ , throwable -> - throwable . printStackTrace () - throw throwable +val exceptionPrinter = CoroutineExceptionHandler { _, throwable -> + throwable.printStackTrace() + throw throwable } diff --git a/app/src/main/java/com/kernelmaft/zanbur/network/mqtt.kt b/app/src/main/java/com/kernelmaft/zanbur/network/mqtt.kt index 1710834..f42428e 100644 --- a/app/src/main/java/com/kernelmaft/zanbur/network/mqtt.kt +++ b/app/src/main/java/com/kernelmaft/zanbur/network/mqtt.kt @@ -1,45 +1,45 @@ package com.kernelmaft.zanbur.network -import com.kernelmaft.zanbur.common.Config.MQTT_SERVER_HOST -import com.kernelmaft.zanbur.common.Config.MQTT_SERVER_PORT -import com.kernelmaft.zanbur.common.Config.MQTT_TOPIC -import io.github.davidepianca98.* -import io.github.davidepianca98.mqtt.* -import io.github.davidepianca98.mqtt.MQTTVersion.* -import io.github.davidepianca98.mqtt.packets.Qos.* -import io.github.davidepianca98.mqtt.packets.mqtt.* -import kotlinx.coroutines.* -import kotlinx.coroutines.Dispatchers.IO -import kotlinx.serialization.json.* +import com.kernelmaft.zanbur.common.Config +import io.github.davidepianca98.MQTTClient +import io.github.davidepianca98.mqtt.MQTTVersion +import io.github.davidepianca98.mqtt.Subscription +import io.github.davidepianca98.mqtt.packets.Qos +import io.github.davidepianca98.mqtt.packets.mqtt.MQTTPublish +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.serialization.json.Json -typealias MqttPublishHandler = ( MQTTPublish , Json ) -> Unit +typealias MqttPublishHandler = (MQTTPublish, Json) -> Unit object MqttClient { - private var client : MQTTClient ? = null - private var coroutineScope : CoroutineScope ? = null - private val publishHandlers : MutableList = mutableListOf () + private var client: MQTTClient? = null + private var coroutineScope: CoroutineScope? = null + private val publishHandlers: MutableList = mutableListOf() - fun run ( coroutineScope : CoroutineScope ) { - this . coroutineScope = coroutineScope - val json = Json { ignoreUnknownKeys = true } + fun run(coroutineScope: CoroutineScope) { + this.coroutineScope = coroutineScope + val json = Json { ignoreUnknownKeys = true } - coroutineScope . launch ( IO + exceptionPrinter ) { - client = MQTTClient ( MQTT5 , MQTT_SERVER_HOST , MQTT_SERVER_PORT , null ) { - for ( handler in publishHandlers ) handler ( it , json ) - } - client !! . subscribe ( listOf ( Subscription ( MQTT_TOPIC + "/#" ) ) ) + coroutineScope.launch(Dispatchers.IO + exceptionPrinter) { + client = + MQTTClient(MQTTVersion.MQTT5, Config.MQTT_SERVER_HOST, Config.MQTT_SERVER_PORT, null) { + for (handler in publishHandlers) handler(it, json) + } + client!!.subscribe(listOf(Subscription(Config.MQTT_TOPIC + "/#"))) - client !! . run () - } - } + client!!.run() + } + } - fun addPublishHandler ( handler : MqttPublishHandler ) = publishHandlers . add (handler) + fun addPublishHandler(handler: MqttPublishHandler) = publishHandlers.add(handler) - fun publish ( topic : String , payload : UByteArray ) { - coroutineScope !! . launch ( IO + exceptionPrinter ) { - client !! . publish ( false , AT_MOST_ONCE , topic , payload ) - } - } + fun publish(topic: String, payload: UByteArray) { + coroutineScope!!.launch(Dispatchers.IO + exceptionPrinter) { + client!!.publish(false, Qos.AT_MOST_ONCE, topic, payload) + } + } } diff --git a/app/src/main/java/com/kernelmaft/zanbur/network/zigbee2mqtt.kt b/app/src/main/java/com/kernelmaft/zanbur/network/zigbee2mqtt.kt index e59269f..451a587 100644 --- a/app/src/main/java/com/kernelmaft/zanbur/network/zigbee2mqtt.kt +++ b/app/src/main/java/com/kernelmaft/zanbur/network/zigbee2mqtt.kt @@ -1,20 +1,23 @@ package com.kernelmaft.zanbur.network -import com.kernelmaft.zanbur.common.* -import com.kernelmaft.zanbur.common.Config.MQTT_TOPIC -import kotlinx.serialization.* -import kotlinx.serialization.json.* +import com.kernelmaft.zanbur.common.Config +import com.kernelmaft.zanbur.common.Group +import com.kernelmaft.zanbur.common.Scene +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.Json -fun publishSceneChange ( group : Group , newScene : Scene ) { - val topic = MQTT_TOPIC + "/" + group . name + "/set" - val packet = Json . encodeToString ( SceneRecallPacket ( newScene . id ) ) - . toByteArray () - . asUByteArray () - MqttClient . publish ( topic , packet ) +fun publishSceneChange(group: Group, newScene: Scene) { + val topic = Config.MQTT_TOPIC + "/" + group.name + "/set" + val packet = Json.encodeToString(SceneRecallPacket(newScene.id)) + .toByteArray() + .asUByteArray() + MqttClient.publish(topic, packet) } -@Serializable private data class SceneRecallPacket ( - @SerialName ("scene_recall") val sceneRecall : Int , +@Serializable +private data class SceneRecallPacket( + @SerialName("scene_recall") val sceneRecall: Int, ) diff --git a/app/src/main/java/com/kernelmaft/zanbur/ui/components.kt b/app/src/main/java/com/kernelmaft/zanbur/ui/components.kt index 03fc6ac..bc84722 100644 --- a/app/src/main/java/com/kernelmaft/zanbur/ui/components.kt +++ b/app/src/main/java/com/kernelmaft/zanbur/ui/components.kt @@ -1,46 +1,62 @@ package com.kernelmaft.zanbur.ui -import androidx.compose.foundation.layout.* -import androidx.compose.foundation.layout.Arrangement.Center -import androidx.compose.material3.* +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.ColumnScope +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Button +import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.ButtonDefaults.buttonColors import androidx.compose.material3.ButtonDefaults.filledTonalButtonColors -import androidx.compose.material3.ButtonDefaults.shape -import androidx.compose.runtime.* -import androidx.compose.ui.* -import androidx.compose.ui.Alignment.Companion.CenterHorizontally -import com.kernelmaft.zanbur.common.* +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import com.kernelmaft.zanbur.common.Group +import com.kernelmaft.zanbur.common.Scene -@Composable fun AppFrame ( content : @Composable () -> Unit ) { - ZanburTheme { - Scaffold { scaffoldPadding -> - CenteringColumn ( Modifier . padding (scaffoldPadding) . fillMaxSize () ) { - content () - } - } - } +@Composable +fun AppFrame(content: @Composable () -> Unit) { + ZanburTheme { + Scaffold { scaffoldPadding -> + CenteringColumn( + Modifier + .padding(scaffoldPadding) + .fillMaxSize() + ) { + content() + } + } + } } -@Composable fun SceneSwitcher ( group : Group , onSwitch : (Scene) -> Unit ) { - CenteringColumn { - Text ( group . name ) - Spacer ( Modifier . height ( compactSpacing ) ) +@Composable +fun SceneSwitcher(group: Group, onSwitch: (Scene) -> Unit) { + CenteringColumn { + Text(group.name) + Spacer(Modifier.height(compactSpacing)) - for ( scene in group . scenes ) { - val colors = - if ( scene . id == group . currentScene ?. id ) buttonColors () - else filledTonalButtonColors () + for (scene in group.scenes) { + val colors = + if (scene.id == group.currentScene?.id) buttonColors() + else filledTonalButtonColors() - Button ( { onSwitch (scene) } , Modifier . fillMaxWidth () , true , shape , colors ) { - Text ( scene . name ) - } - } - } + Button({ onSwitch(scene) }, Modifier.fillMaxWidth(), true, ButtonDefaults.shape, colors) { + Text(scene.name) + } + } + } } -@Composable fun CenteringColumn ( - modifier : Modifier = Modifier , - content : @Composable ColumnScope . () -> Unit , -) = Column ( modifier , Center , CenterHorizontally , content ) +@Composable +fun CenteringColumn( + modifier: Modifier = Modifier, + content: @Composable ColumnScope.() -> Unit, +) = Column(modifier, Arrangement.Center, Alignment.CenterHorizontally, content) diff --git a/app/src/main/java/com/kernelmaft/zanbur/ui/compose-state.kt b/app/src/main/java/com/kernelmaft/zanbur/ui/compose-state.kt index 212f254..521cb5a 100644 --- a/app/src/main/java/com/kernelmaft/zanbur/ui/compose-state.kt +++ b/app/src/main/java/com/kernelmaft/zanbur/ui/compose-state.kt @@ -1,22 +1,26 @@ package com.kernelmaft.zanbur.ui -import androidx.compose.runtime.* -import com.kernelmaft.zanbur.common.* +import androidx.compose.runtime.MutableState +import androidx.compose.runtime.mutableStateOf +import com.kernelmaft.zanbur.common.AppState +import com.kernelmaft.zanbur.common.Group -fun createGroupsComposeState () : MutableState < List > { - val groups : MutableState < List > = mutableStateOf ( emptyList () ) +fun createGroupsComposeState(): MutableState> { + val groups: MutableState> = mutableStateOf(emptyList()) - AppState . subscribeToGroupAdded { newGroup , _ -> - groups . value = groups . value . plus (newGroup) - } - AppState . subscribeToCurrentScene { group , newScene , source -> - groups . value = groups . value . map { when ( it . id ) { - group . id -> it . copy ( currentScene = newScene ) - else -> it - } } - } + AppState.subscribeToGroupAdded { newGroup, _ -> + groups.value = groups.value.plus(newGroup) + } + AppState.subscribeToCurrentScene { group, newScene, source -> + groups.value = groups.value.map { + when (it.id) { + group.id -> it.copy(currentScene = newScene) + else -> it + } + } + } - return groups + return groups } diff --git a/app/src/main/java/com/kernelmaft/zanbur/ui/main-activity.kt b/app/src/main/java/com/kernelmaft/zanbur/ui/main-activity.kt index 147fd0c..8a83396 100644 --- a/app/src/main/java/com/kernelmaft/zanbur/ui/main-activity.kt +++ b/app/src/main/java/com/kernelmaft/zanbur/ui/main-activity.kt @@ -1,43 +1,46 @@ package com.kernelmaft.zanbur.ui -import android.os.* -import androidx.activity.compose.* -import androidx.compose.foundation.layout.* -import androidx.compose.ui.* -import androidx.compose.ui.unit.* -import androidx.lifecycle.* -import com.kernelmaft.zanbur.common.* -import com.kernelmaft.zanbur.common.ChangeSource.* -import com.kernelmaft.zanbur.network.* +import android.os.Bundle +import androidx.activity.compose.setContent +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.width +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import androidx.lifecycle.lifecycleScope +import com.kernelmaft.zanbur.common.AppState +import com.kernelmaft.zanbur.common.ChangeSource +import com.kernelmaft.zanbur.common.Config +import com.kernelmaft.zanbur.network.MqttClient +import com.kernelmaft.zanbur.network.publishSceneChange -class MainActivity : EdgeToEdgeActivity () { - override fun onCreate ( savedInstanceState : Bundle ? ) { - super . onCreate (savedInstanceState) +class MainActivity : EdgeToEdgeActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) - val groups = createGroupsComposeState () + val groups = createGroupsComposeState() - AppState . subscribeToCurrentScene { group , newScene , source -> - if ( source == Local ) { - publishSceneChange ( group , newScene ) - } - } + AppState.subscribeToCurrentScene { group, newScene, source -> + if (source == ChangeSource.Local) { + publishSceneChange(group, newScene) + } + } - Config . groups . forEach { AppState . addGroup ( it , Remote ) } + Config.groups.forEach { AppState.addGroup(it, ChangeSource.Remote) } - setContent { - AppFrame { - Column ( Modifier . width ( 300 . dp ) ) { - groups . value . forEach { group -> - SceneSwitcher (group) { newScene -> - AppState . setCurrentScene ( group , newScene , Local ) - } - } - } - } - } + setContent { + AppFrame { + Column(Modifier.width(300.dp)) { + groups.value.forEach { group -> + SceneSwitcher(group) { newScene -> + AppState.setCurrentScene(group, newScene, ChangeSource.Local) + } + } + } + } + } - MqttClient . run (lifecycleScope) - } + MqttClient.run(lifecycleScope) + } } diff --git a/app/src/main/java/com/kernelmaft/zanbur/ui/theme.kt b/app/src/main/java/com/kernelmaft/zanbur/ui/theme.kt index 0da4c53..d10ca38 100644 --- a/app/src/main/java/com/kernelmaft/zanbur/ui/theme.kt +++ b/app/src/main/java/com/kernelmaft/zanbur/ui/theme.kt @@ -1,34 +1,35 @@ package com.kernelmaft.zanbur.ui -import android.os.* -import androidx.activity.* -import androidx.compose.foundation.* -import androidx.compose.material3.* -import androidx.compose.material3.MaterialTheme.shapes -import androidx.compose.material3.MaterialTheme.typography -import androidx.compose.runtime.* -import androidx.compose.ui.platform.* -import androidx.compose.ui.unit.* +import android.os.Bundle +import androidx.activity.ComponentActivity +import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.dynamicDarkColorScheme +import androidx.compose.material3.dynamicLightColorScheme +import androidx.compose.runtime.Composable +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.unit.dp -val compactSpacing = 16 . dp +val compactSpacing = 16.dp -@Composable fun ZanburTheme ( content : @Composable () -> Unit ) { - val colorScheme = run { - if ( isSystemInDarkTheme () ) - dynamicDarkColorScheme ( LocalContext . current ) - else - dynamicLightColorScheme ( LocalContext . current ) - } +@Composable +fun ZanburTheme(content: @Composable () -> Unit) { + val colorScheme = run { + if (isSystemInDarkTheme()) + dynamicDarkColorScheme(LocalContext.current) + else + dynamicLightColorScheme(LocalContext.current) + } - MaterialTheme ( colorScheme, shapes , typography , content ) + MaterialTheme(colorScheme, MaterialTheme.shapes, MaterialTheme.typography, content) } -open class EdgeToEdgeActivity : ComponentActivity () { - override fun onCreate ( savedInstanceState : Bundle ? ) { - super . onCreate (savedInstanceState) +open class EdgeToEdgeActivity : ComponentActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) - actionBar ?. hide () - } + actionBar?.hide() + } } diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml index 4e12b43..140f829 100644 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -1,170 +1,170 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + android:width="108dp" + android:height="108dp" + android:viewportWidth="108" + android:viewportHeight="108"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml index c6aee64..5c3bfcd 100644 --- a/app/src/main/res/drawable/ic_launcher_foreground.xml +++ b/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -1,30 +1,30 @@ - - - - - - - - - + xmlns:aapt="http://schemas.android.com/aapt" + android:width="108dp" + android:height="108dp" + android:viewportWidth="108" + android:viewportHeight="108"> + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi/ic_launcher.xml b/app/src/main/res/mipmap-anydpi/ic_launcher.xml index 52ac069..5ad9ce1 100644 --- a/app/src/main/res/mipmap-anydpi/ic_launcher.xml +++ b/app/src/main/res/mipmap-anydpi/ic_launcher.xml @@ -1,6 +1,6 @@ - - - + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi/ic_launcher_round.xml index 52ac069..5ad9ce1 100644 --- a/app/src/main/res/mipmap-anydpi/ic_launcher_round.xml +++ b/app/src/main/res/mipmap-anydpi/ic_launcher_round.xml @@ -1,6 +1,6 @@ - - - + + + \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index 3a6c6fe..df2c9e1 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,16 +1,16 @@ pluginManagement { - repositories { - google () - mavenCentral () - gradlePluginPortal () - } + repositories { + google() + mavenCentral() + gradlePluginPortal() + } } dependencyResolutionManagement { - repositories { - google () - mavenCentral () - } + repositories { + google() + mavenCentral() + } } -rootProject . name = "Zanbur" -include (":app") +rootProject.name = "Zanbur" +include(":app")