From df922376eece7dccb98279fc48c8edf50b7bb8a5 Mon Sep 17 00:00:00 2001 From: Reinout Meliesie Date: Fri, 22 Nov 2024 22:30:02 +0100 Subject: [PATCH 01/10] Simplify resources --- app/src/main/AndroidManifest.xml | 9 +++------ app/src/main/res/values/strings.xml | 6 ------ app/src/main/res/values/themes.xml | 8 -------- 3 files changed, 3 insertions(+), 20 deletions(-) delete mode 100644 app/src/main/res/values/strings.xml delete mode 100644 app/src/main/res/values/themes.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1acccf6..5894132 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -4,17 +4,14 @@ + android:supportsRtl = "true" > + android:exported = "true" > diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml deleted file mode 100644 index 30feaa0..0000000 --- a/app/src/main/res/values/strings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - Zanbur - Zanbur - - diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml deleted file mode 100644 index ced7955..0000000 --- a/app/src/main/res/values/themes.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - From 5621e3b4acbfb3bab07abbec77e00fe80e8d36c9 Mon Sep 17 00:00:00 2001 From: Reinout Meliesie Date: Fri, 22 Nov 2024 23:11:04 +0100 Subject: [PATCH 02/10] Use null-safe functions in MainActivity.onCreate --- .../main/java/com/kernelmaft/zanbur/main.kt | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/com/kernelmaft/zanbur/main.kt b/app/src/main/java/com/kernelmaft/zanbur/main.kt index 769890f..6b65411 100644 --- a/app/src/main/java/com/kernelmaft/zanbur/main.kt +++ b/app/src/main/java/com/kernelmaft/zanbur/main.kt @@ -25,14 +25,10 @@ class MainActivity : EdgeToEdgeActivity () { lifecycleScope . launch (IO) { val prefs = dataStore . data . firstOrNull () - if ( prefs != null ) { - val savedSceneName = prefs [ stringPreferencesKey ("scene") ] - if ( savedSceneName != null ) { - val savedScene = AppState . groups [0] . scenes . find { it . name == savedSceneName } - if ( savedScene != null ) { - AppState . setCurrentScene ( 0 , savedScene ) - } - } + val savedSceneName = prefs ?. get ( stringPreferencesKey ("scene") ) + if ( savedSceneName != null ) { + val savedScene = AppState . groups [0] . scenes . find { it . name == savedSceneName } + savedScene ?. let { AppState . setCurrentScene ( 0 , it ) } } } @@ -40,9 +36,9 @@ class MainActivity : EdgeToEdgeActivity () { AppFrame { Column ( Modifier . width ( 300 . dp ) ) { groups . forEach { group -> - SceneSwitcher (group) { - AppState . setCurrentScene ( group . id , it ) - publishSceneChange ( group , it ) + SceneSwitcher (group) { newScene -> + AppState . setCurrentScene ( group . id , newScene ) + publishSceneChange ( group , newScene ) } } } From 80eb10f01881513961bc53adea966bcf1594fcfa Mon Sep 17 00:00:00 2001 From: Reinout Meliesie Date: Fri, 22 Nov 2024 23:42:24 +0100 Subject: [PATCH 03/10] Replace DataStore delegate magic with direct usage --- app/src/main/java/com/kernelmaft/zanbur/main.kt | 11 +++++++---- .../main/java/com/kernelmaft/zanbur/persistence.kt | 10 ---------- 2 files changed, 7 insertions(+), 14 deletions(-) delete mode 100644 app/src/main/java/com/kernelmaft/zanbur/persistence.kt diff --git a/app/src/main/java/com/kernelmaft/zanbur/main.kt b/app/src/main/java/com/kernelmaft/zanbur/main.kt index 6b65411..13339d4 100644 --- a/app/src/main/java/com/kernelmaft/zanbur/main.kt +++ b/app/src/main/java/com/kernelmaft/zanbur/main.kt @@ -6,6 +6,7 @@ import androidx.compose.foundation.layout.* import androidx.compose.runtime.* import androidx.compose.ui.* import androidx.compose.ui.unit.* +import androidx.datastore.preferences.* import androidx.datastore.preferences.core.* import androidx.lifecycle.* import kotlinx.coroutines.* @@ -15,13 +16,15 @@ import kotlinx.coroutines.flow.* class MainActivity : EdgeToEdgeActivity () { + val dataStore = PreferenceDataStoreFactory . create { preferencesDataStoreFile ("state") } + override fun onCreate ( savedInstanceState : Bundle ? ) { super . onCreate (savedInstanceState) Config . groups . forEach { AppState . addGroup (it) } - var groups by mutableStateOf ( AppState . groups ) - AppState . subscribe { groups = it } + val groups = mutableStateOf ( AppState . groups ) + AppState . subscribe { groups . value = it } lifecycleScope . launch (IO) { val prefs = dataStore . data . firstOrNull () @@ -35,7 +38,7 @@ class MainActivity : EdgeToEdgeActivity () { setContent { AppFrame { Column ( Modifier . width ( 300 . dp ) ) { - groups . forEach { group -> + groups . value . forEach { group -> SceneSwitcher (group) { newScene -> AppState . setCurrentScene ( group . id , newScene ) publishSceneChange ( group , newScene ) @@ -53,7 +56,7 @@ class MainActivity : EdgeToEdgeActivity () { val currentScene = AppState . groups [0] . currentScene if ( currentScene != null ) lifecycleScope . launch (IO) { - applicationContext . dataStore . edit { + dataStore . edit { it [ stringPreferencesKey ("scene") ] = currentScene . name } } diff --git a/app/src/main/java/com/kernelmaft/zanbur/persistence.kt b/app/src/main/java/com/kernelmaft/zanbur/persistence.kt deleted file mode 100644 index 9110f71..0000000 --- a/app/src/main/java/com/kernelmaft/zanbur/persistence.kt +++ /dev/null @@ -1,10 +0,0 @@ -package com.kernelmaft.zanbur - -import android.content.* -import androidx.datastore.core.* -import androidx.datastore.preferences.* -import androidx.datastore.preferences.core.* - - - -val Context . dataStore : DataStore by preferencesDataStore ("state") From 5bece30b4b636aa7117c19fc64eb3b2d370be27d Mon Sep 17 00:00:00 2001 From: Reinout Meliesie Date: Thu, 19 Dec 2024 14:05:45 +0100 Subject: [PATCH 04/10] Update dependencies, MQTT library finally has proper namespacing --- app/build.gradle.kts | 18 +++++++++--------- .../main/java/com/kernelmaft/zanbur/mqtt.kt | 10 +++++----- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index f29eafc..eca2e77 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -9,10 +9,10 @@ val keystoreProperties = Properties () keystoreProperties . load ( FileInputStream ( rootProject . file ("keystore.properties") ) ) plugins { - id ("com.android.application") . version ("8.7.2") - id ("org.jetbrains.kotlin.android") . version ("2.0.0") - id ("org.jetbrains.kotlin.plugin.compose") . version ("2.0.0") - id ("org.jetbrains.kotlin.plugin.serialization") . version ("2.0.0") + id ("com.android.application") . version ("8.7.3") + id ("org.jetbrains.kotlin.android") . version ("2.1.0") + id ("org.jetbrains.kotlin.plugin.compose") . version ("2.1.0") + id ("org.jetbrains.kotlin.plugin.serialization") . version ("2.1.0") } android { @@ -63,16 +63,16 @@ dependencies { implementation ( "androidx.activity" , "activity-compose" , "1.9.3" ) implementation ( "androidx.core" , "core-ktx" , "1.13.1" ) implementation ( "androidx.compose.material3" , "material3" , "1.3.1" ) - implementation ( "androidx.compose.ui" , "ui" , "1.7.5" ) - implementation ( "androidx.compose.ui" , "ui-graphics" , "1.7.5" ) - debugImplementation ( "androidx.compose.ui" , "ui-tooling" , "1.7.5" ) + implementation ( "androidx.compose.ui" , "ui" , "1.7.6" ) + implementation ( "androidx.compose.ui" , "ui-graphics" , "1.7.6" ) + debugImplementation ( "androidx.compose.ui" , "ui-tooling" , "1.7.6" ) implementation ( "androidx.datastore" , "datastore-preferences" , "1.1.1" ) implementation ( "androidx.lifecycle" , "lifecycle-runtime-ktx" , "2.8.7" ) implementation ( "org.jetbrains.kotlinx" , "kotlinx-coroutines-android" , "1.9.0" ) implementation ( "org.jetbrains.kotlinx" , "kotlinx-serialization-json" , "1.7.3" ) // Other libraries - implementation ( "io.github.davidepianca98" , "kmqtt-common" , "0.4.8" ) - implementation ( "io.github.davidepianca98" , "kmqtt-client" , "0.4.8" ) + implementation ( "io.github.davidepianca98" , "kmqtt-common-jvm" , "1.0.0" ) + implementation ( "io.github.davidepianca98" , "kmqtt-client-jvm" , "1.0.0" ) } tasks . withType ( KotlinCompile :: class ) . all { diff --git a/app/src/main/java/com/kernelmaft/zanbur/mqtt.kt b/app/src/main/java/com/kernelmaft/zanbur/mqtt.kt index 5d633ac..eda0cec 100644 --- a/app/src/main/java/com/kernelmaft/zanbur/mqtt.kt +++ b/app/src/main/java/com/kernelmaft/zanbur/mqtt.kt @@ -1,16 +1,16 @@ package com.kernelmaft.zanbur -import MQTTClient import com.kernelmaft.zanbur.Config.MQTT_SERVER_HOST import com.kernelmaft.zanbur.Config.MQTT_SERVER_PORT import com.kernelmaft.zanbur.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 mqtt.* -import mqtt.MQTTVersion.* -import mqtt.packets.Qos.* -import mqtt.packets.mqtt.* From 8413cf7ae7645b435126c6a42711f6c664ab9253 Mon Sep 17 00:00:00 2001 From: Reinout Meliesie Date: Thu, 19 Dec 2024 15:22:01 +0100 Subject: [PATCH 05/10] Reintroduce Compose State to AppState --- .../java/com/kernelmaft/zanbur/app-state.kt | 27 ++++++++++--------- .../main/java/com/kernelmaft/zanbur/main.kt | 11 +++----- 2 files changed, 18 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/com/kernelmaft/zanbur/app-state.kt b/app/src/main/java/com/kernelmaft/zanbur/app-state.kt index 52c4991..ae77a76 100644 --- a/app/src/main/java/com/kernelmaft/zanbur/app-state.kt +++ b/app/src/main/java/com/kernelmaft/zanbur/app-state.kt @@ -1,25 +1,26 @@ package com.kernelmaft.zanbur +import androidx.compose.runtime.* + object AppState { - val groups : List get () = groupsAsMutable - private var groupsAsMutable : List = emptyList () - - private val subscribers : MutableList < ( List ) -> Unit > = mutableListOf () - - fun subscribe ( subscriber : ( List ) -> Unit ) = subscribers . add (subscriber) - - fun addGroup ( group : Group ) { - groupsAsMutable += group - subscribers . forEach { it (groups) } - } + // The index of a group in this list is always equal to its ID + val groups : State < List > get () = groupsAsMutable + private val groupsAsMutable : MutableState < List > = mutableStateOf ( emptyList () ) fun setCurrentScene ( groupId : Int , scene : Scene ) { - groupsAsMutable = groupsAsMutable . mapIndexed { index , group -> + groupsAsMutable . value = groupsAsMutable . value . mapIndexed { index , group -> if ( index == groupId ) group . copy ( currentScene = scene ) else group } - subscribers . forEach { it (groups) } + } + + fun addGroup ( group : Group ) { + val newGroups = groupsAsMutable . value . toMutableList () + // Wow this is sooo much better than Java + if ( newGroups . getOrNull ( group . id ) != null ) newGroups . removeAt ( group . id ) + newGroups . add ( group . id , group ) + groupsAsMutable . value = newGroups } } diff --git a/app/src/main/java/com/kernelmaft/zanbur/main.kt b/app/src/main/java/com/kernelmaft/zanbur/main.kt index 13339d4..5e5a914 100644 --- a/app/src/main/java/com/kernelmaft/zanbur/main.kt +++ b/app/src/main/java/com/kernelmaft/zanbur/main.kt @@ -3,7 +3,6 @@ package com.kernelmaft.zanbur import android.os.* import androidx.activity.compose.* import androidx.compose.foundation.layout.* -import androidx.compose.runtime.* import androidx.compose.ui.* import androidx.compose.ui.unit.* import androidx.datastore.preferences.* @@ -23,14 +22,12 @@ class MainActivity : EdgeToEdgeActivity () { Config . groups . forEach { AppState . addGroup (it) } - val groups = mutableStateOf ( AppState . groups ) - AppState . subscribe { groups . value = it } - lifecycleScope . launch (IO) { val prefs = dataStore . data . firstOrNull () val savedSceneName = prefs ?. get ( stringPreferencesKey ("scene") ) if ( savedSceneName != null ) { - val savedScene = AppState . groups [0] . scenes . find { it . name == savedSceneName } + val savedScene = AppState . groups . value [0] . scenes + . find { it . name == savedSceneName } savedScene ?. let { AppState . setCurrentScene ( 0 , it ) } } } @@ -38,7 +35,7 @@ class MainActivity : EdgeToEdgeActivity () { setContent { AppFrame { Column ( Modifier . width ( 300 . dp ) ) { - groups . value . forEach { group -> + AppState . groups . value . forEach { group -> SceneSwitcher (group) { newScene -> AppState . setCurrentScene ( group . id , newScene ) publishSceneChange ( group , newScene ) @@ -54,7 +51,7 @@ class MainActivity : EdgeToEdgeActivity () { override fun onStop () { super . onStop () - val currentScene = AppState . groups [0] . currentScene + val currentScene = AppState . groups . value [0] . currentScene if ( currentScene != null ) lifecycleScope . launch (IO) { dataStore . edit { it [ stringPreferencesKey ("scene") ] = currentScene . name From 87eb947936aa5d339c664c8b11899d029ed9c369 Mon Sep 17 00:00:00 2001 From: Reinout Meliesie Date: Thu, 19 Dec 2024 18:49:22 +0100 Subject: [PATCH 06/10] Introduce subscription-based state, remove DataStore stopgap --- app/build.gradle.kts | 1 - .../java/com/kernelmaft/zanbur/app-state.kt | 33 +++++++++------- .../com/kernelmaft/zanbur/compose-state.kt | 21 ++++++++++ .../main/java/com/kernelmaft/zanbur/main.kt | 38 +++++-------------- 4 files changed, 49 insertions(+), 44 deletions(-) create mode 100644 app/src/main/java/com/kernelmaft/zanbur/compose-state.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index eca2e77..aa064e8 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -66,7 +66,6 @@ dependencies { implementation ( "androidx.compose.ui" , "ui" , "1.7.6" ) implementation ( "androidx.compose.ui" , "ui-graphics" , "1.7.6" ) debugImplementation ( "androidx.compose.ui" , "ui-tooling" , "1.7.6" ) - implementation ( "androidx.datastore" , "datastore-preferences" , "1.1.1" ) implementation ( "androidx.lifecycle" , "lifecycle-runtime-ktx" , "2.8.7" ) implementation ( "org.jetbrains.kotlinx" , "kotlinx-coroutines-android" , "1.9.0" ) implementation ( "org.jetbrains.kotlinx" , "kotlinx-serialization-json" , "1.7.3" ) diff --git a/app/src/main/java/com/kernelmaft/zanbur/app-state.kt b/app/src/main/java/com/kernelmaft/zanbur/app-state.kt index ae77a76..41e2d98 100644 --- a/app/src/main/java/com/kernelmaft/zanbur/app-state.kt +++ b/app/src/main/java/com/kernelmaft/zanbur/app-state.kt @@ -1,26 +1,31 @@ package com.kernelmaft.zanbur -import androidx.compose.runtime.* +enum class ChangeSource { Local , Remote } + +typealias CurrentSceneSubscriber = ( Group , Scene , ChangeSource ) -> Unit +typealias GroupAddedSubscriber = ( Group , ChangeSource ) -> Unit object AppState { - // The index of a group in this list is always equal to its ID - val groups : State < List > get () = groupsAsMutable - private val groupsAsMutable : MutableState < List > = mutableStateOf ( emptyList () ) + private val currentSceneSubscribers : MutableList = mutableListOf () + private val groupAddedSubscribers : MutableList = mutableListOf () - fun setCurrentScene ( groupId : Int , scene : Scene ) { - groupsAsMutable . value = groupsAsMutable . value . mapIndexed { index , group -> - if ( index == groupId ) group . copy ( currentScene = scene ) - else group + fun setCurrentScene ( group : Group , newScene : Scene , source : ChangeSource ) { + for ( subscriber in currentSceneSubscribers ) { + subscriber ( group , newScene , source ) } } + fun subscribeToCurrentScene ( subscriber : CurrentSceneSubscriber ) { + currentSceneSubscribers . add (subscriber) + } - fun addGroup ( group : Group ) { - val newGroups = groupsAsMutable . value . toMutableList () - // Wow this is sooo much better than Java - if ( newGroups . getOrNull ( group . id ) != null ) newGroups . removeAt ( group . id ) - newGroups . add ( group . id , group ) - groupsAsMutable . value = newGroups + 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/compose-state.kt b/app/src/main/java/com/kernelmaft/zanbur/compose-state.kt new file mode 100644 index 0000000..bd2a3e3 --- /dev/null +++ b/app/src/main/java/com/kernelmaft/zanbur/compose-state.kt @@ -0,0 +1,21 @@ +package com.kernelmaft.zanbur + +import androidx.compose.runtime.* + + + +fun createGroupsComposeState () : MutableState < List > { + val groups : MutableState < List > = 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 + } } + } + + return groups +} diff --git a/app/src/main/java/com/kernelmaft/zanbur/main.kt b/app/src/main/java/com/kernelmaft/zanbur/main.kt index 5e5a914..5d12e11 100644 --- a/app/src/main/java/com/kernelmaft/zanbur/main.kt +++ b/app/src/main/java/com/kernelmaft/zanbur/main.kt @@ -5,40 +5,31 @@ import androidx.activity.compose.* import androidx.compose.foundation.layout.* import androidx.compose.ui.* import androidx.compose.ui.unit.* -import androidx.datastore.preferences.* -import androidx.datastore.preferences.core.* import androidx.lifecycle.* -import kotlinx.coroutines.* -import kotlinx.coroutines.Dispatchers.IO -import kotlinx.coroutines.flow.* +import com.kernelmaft.zanbur.ChangeSource.* class MainActivity : EdgeToEdgeActivity () { - val dataStore = PreferenceDataStoreFactory . create { preferencesDataStoreFile ("state") } - override fun onCreate ( savedInstanceState : Bundle ? ) { super . onCreate (savedInstanceState) - Config . groups . forEach { AppState . addGroup (it) } + val groups = createGroupsComposeState () - lifecycleScope . launch (IO) { - val prefs = dataStore . data . firstOrNull () - val savedSceneName = prefs ?. get ( stringPreferencesKey ("scene") ) - if ( savedSceneName != null ) { - val savedScene = AppState . groups . value [0] . scenes - . find { it . name == savedSceneName } - savedScene ?. let { AppState . setCurrentScene ( 0 , it ) } + AppState . subscribeToCurrentScene { group , newScene , source -> + if ( source == Local ) { + publishSceneChange ( group , newScene ) } } + Config . groups . forEach { AppState . addGroup ( it , Remote ) } + setContent { AppFrame { Column ( Modifier . width ( 300 . dp ) ) { - AppState . groups . value . forEach { group -> + groups . value . forEach { group -> SceneSwitcher (group) { newScene -> - AppState . setCurrentScene ( group . id , newScene ) - publishSceneChange ( group , newScene ) + AppState . setCurrentScene ( group , newScene , Local ) } } } @@ -47,15 +38,4 @@ class MainActivity : EdgeToEdgeActivity () { MqttClient . run (lifecycleScope) } - - override fun onStop () { - super . onStop () - - val currentScene = AppState . groups . value [0] . currentScene - if ( currentScene != null ) lifecycleScope . launch (IO) { - dataStore . edit { - it [ stringPreferencesKey ("scene") ] = currentScene . name - } - } - } } From f8d8d8a7014c65dddbb7f5c1ce85427fa6c9b591 Mon Sep 17 00:00:00 2001 From: Reinout Meliesie Date: Thu, 19 Dec 2024 18:50:57 +0100 Subject: [PATCH 07/10] Rename main.kt to main-activity.kt --- .../main/java/com/kernelmaft/zanbur/{main.kt => main-activity.kt} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename app/src/main/java/com/kernelmaft/zanbur/{main.kt => main-activity.kt} (100%) diff --git a/app/src/main/java/com/kernelmaft/zanbur/main.kt b/app/src/main/java/com/kernelmaft/zanbur/main-activity.kt similarity index 100% rename from app/src/main/java/com/kernelmaft/zanbur/main.kt rename to app/src/main/java/com/kernelmaft/zanbur/main-activity.kt From 6fc401edc22433a1b884533cc9ddab05e415284d Mon Sep 17 00:00:00 2001 From: Reinout Meliesie Date: Thu, 19 Dec 2024 19:06:55 +0100 Subject: [PATCH 08/10] Reorganisation into subpackages --- app/src/main/AndroidManifest.xml | 2 +- .../java/com/kernelmaft/zanbur/{ => common}/app-state.kt | 2 +- .../java/com/kernelmaft/zanbur/{ => common}/config.kt | 2 +- .../java/com/kernelmaft/zanbur/{ => common}/ontology.kt | 2 +- .../main/java/com/kernelmaft/zanbur/{ => network}/mqtt.kt | 8 ++++---- .../com/kernelmaft/zanbur/{ => network}/zigbee2mqtt.kt | 5 +++-- .../java/com/kernelmaft/zanbur/{ => ui}/components.kt | 3 ++- .../java/com/kernelmaft/zanbur/{ => ui}/compose-state.kt | 3 ++- .../java/com/kernelmaft/zanbur/{ => ui}/main-activity.kt | 6 ++++-- app/src/main/java/com/kernelmaft/zanbur/{ => ui}/theme.kt | 2 +- 10 files changed, 20 insertions(+), 15 deletions(-) rename app/src/main/java/com/kernelmaft/zanbur/{ => common}/app-state.kt (96%) rename app/src/main/java/com/kernelmaft/zanbur/{ => common}/config.kt (92%) rename app/src/main/java/com/kernelmaft/zanbur/{ => common}/ontology.kt (83%) rename app/src/main/java/com/kernelmaft/zanbur/{ => network}/mqtt.kt (85%) rename app/src/main/java/com/kernelmaft/zanbur/{ => network}/zigbee2mqtt.kt (77%) rename app/src/main/java/com/kernelmaft/zanbur/{ => ui}/components.kt (94%) rename app/src/main/java/com/kernelmaft/zanbur/{ => ui}/compose-state.kt (87%) rename app/src/main/java/com/kernelmaft/zanbur/{ => ui}/main-activity.kt (84%) rename app/src/main/java/com/kernelmaft/zanbur/{ => ui}/theme.kt (96%) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5894132..90a24a3 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -10,7 +10,7 @@ android:supportsRtl = "true" > diff --git a/app/src/main/java/com/kernelmaft/zanbur/app-state.kt b/app/src/main/java/com/kernelmaft/zanbur/common/app-state.kt similarity index 96% rename from app/src/main/java/com/kernelmaft/zanbur/app-state.kt rename to app/src/main/java/com/kernelmaft/zanbur/common/app-state.kt index 41e2d98..6abdb42 100644 --- a/app/src/main/java/com/kernelmaft/zanbur/app-state.kt +++ b/app/src/main/java/com/kernelmaft/zanbur/common/app-state.kt @@ -1,4 +1,4 @@ -package com.kernelmaft.zanbur +package com.kernelmaft.zanbur.common diff --git a/app/src/main/java/com/kernelmaft/zanbur/config.kt b/app/src/main/java/com/kernelmaft/zanbur/common/config.kt similarity index 92% rename from app/src/main/java/com/kernelmaft/zanbur/config.kt rename to app/src/main/java/com/kernelmaft/zanbur/common/config.kt index ef1f384..3e4ddda 100644 --- a/app/src/main/java/com/kernelmaft/zanbur/config.kt +++ b/app/src/main/java/com/kernelmaft/zanbur/common/config.kt @@ -1,4 +1,4 @@ -package com.kernelmaft.zanbur +package com.kernelmaft.zanbur.common diff --git a/app/src/main/java/com/kernelmaft/zanbur/ontology.kt b/app/src/main/java/com/kernelmaft/zanbur/common/ontology.kt similarity index 83% rename from app/src/main/java/com/kernelmaft/zanbur/ontology.kt rename to app/src/main/java/com/kernelmaft/zanbur/common/ontology.kt index 4bec33e..86e8a1c 100644 --- a/app/src/main/java/com/kernelmaft/zanbur/ontology.kt +++ b/app/src/main/java/com/kernelmaft/zanbur/common/ontology.kt @@ -1,4 +1,4 @@ -package com.kernelmaft.zanbur +package com.kernelmaft.zanbur.common diff --git a/app/src/main/java/com/kernelmaft/zanbur/mqtt.kt b/app/src/main/java/com/kernelmaft/zanbur/network/mqtt.kt similarity index 85% rename from app/src/main/java/com/kernelmaft/zanbur/mqtt.kt rename to app/src/main/java/com/kernelmaft/zanbur/network/mqtt.kt index eda0cec..212d73a 100644 --- a/app/src/main/java/com/kernelmaft/zanbur/mqtt.kt +++ b/app/src/main/java/com/kernelmaft/zanbur/network/mqtt.kt @@ -1,8 +1,8 @@ -package com.kernelmaft.zanbur +package com.kernelmaft.zanbur.network -import com.kernelmaft.zanbur.Config.MQTT_SERVER_HOST -import com.kernelmaft.zanbur.Config.MQTT_SERVER_PORT -import com.kernelmaft.zanbur.Config.MQTT_TOPIC +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.* diff --git a/app/src/main/java/com/kernelmaft/zanbur/zigbee2mqtt.kt b/app/src/main/java/com/kernelmaft/zanbur/network/zigbee2mqtt.kt similarity index 77% rename from app/src/main/java/com/kernelmaft/zanbur/zigbee2mqtt.kt rename to app/src/main/java/com/kernelmaft/zanbur/network/zigbee2mqtt.kt index 0dc2d88..e59269f 100644 --- a/app/src/main/java/com/kernelmaft/zanbur/zigbee2mqtt.kt +++ b/app/src/main/java/com/kernelmaft/zanbur/network/zigbee2mqtt.kt @@ -1,6 +1,7 @@ -package com.kernelmaft.zanbur +package com.kernelmaft.zanbur.network -import com.kernelmaft.zanbur.Config.MQTT_TOPIC +import com.kernelmaft.zanbur.common.* +import com.kernelmaft.zanbur.common.Config.MQTT_TOPIC import kotlinx.serialization.* import kotlinx.serialization.json.* diff --git a/app/src/main/java/com/kernelmaft/zanbur/components.kt b/app/src/main/java/com/kernelmaft/zanbur/ui/components.kt similarity index 94% rename from app/src/main/java/com/kernelmaft/zanbur/components.kt rename to app/src/main/java/com/kernelmaft/zanbur/ui/components.kt index e2d54e9..03fc6ac 100644 --- a/app/src/main/java/com/kernelmaft/zanbur/components.kt +++ b/app/src/main/java/com/kernelmaft/zanbur/ui/components.kt @@ -1,4 +1,4 @@ -package com.kernelmaft.zanbur +package com.kernelmaft.zanbur.ui import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.Arrangement.Center @@ -9,6 +9,7 @@ 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.* diff --git a/app/src/main/java/com/kernelmaft/zanbur/compose-state.kt b/app/src/main/java/com/kernelmaft/zanbur/ui/compose-state.kt similarity index 87% rename from app/src/main/java/com/kernelmaft/zanbur/compose-state.kt rename to app/src/main/java/com/kernelmaft/zanbur/ui/compose-state.kt index bd2a3e3..212f254 100644 --- a/app/src/main/java/com/kernelmaft/zanbur/compose-state.kt +++ b/app/src/main/java/com/kernelmaft/zanbur/ui/compose-state.kt @@ -1,6 +1,7 @@ -package com.kernelmaft.zanbur +package com.kernelmaft.zanbur.ui import androidx.compose.runtime.* +import com.kernelmaft.zanbur.common.* diff --git a/app/src/main/java/com/kernelmaft/zanbur/main-activity.kt b/app/src/main/java/com/kernelmaft/zanbur/ui/main-activity.kt similarity index 84% rename from app/src/main/java/com/kernelmaft/zanbur/main-activity.kt rename to app/src/main/java/com/kernelmaft/zanbur/ui/main-activity.kt index 5d12e11..147fd0c 100644 --- a/app/src/main/java/com/kernelmaft/zanbur/main-activity.kt +++ b/app/src/main/java/com/kernelmaft/zanbur/ui/main-activity.kt @@ -1,4 +1,4 @@ -package com.kernelmaft.zanbur +package com.kernelmaft.zanbur.ui import android.os.* import androidx.activity.compose.* @@ -6,7 +6,9 @@ import androidx.compose.foundation.layout.* import androidx.compose.ui.* import androidx.compose.ui.unit.* import androidx.lifecycle.* -import com.kernelmaft.zanbur.ChangeSource.* +import com.kernelmaft.zanbur.common.* +import com.kernelmaft.zanbur.common.ChangeSource.* +import com.kernelmaft.zanbur.network.* diff --git a/app/src/main/java/com/kernelmaft/zanbur/theme.kt b/app/src/main/java/com/kernelmaft/zanbur/ui/theme.kt similarity index 96% rename from app/src/main/java/com/kernelmaft/zanbur/theme.kt rename to app/src/main/java/com/kernelmaft/zanbur/ui/theme.kt index 8a95cbc..0b882a2 100644 --- a/app/src/main/java/com/kernelmaft/zanbur/theme.kt +++ b/app/src/main/java/com/kernelmaft/zanbur/ui/theme.kt @@ -1,4 +1,4 @@ -package com.kernelmaft.zanbur +package com.kernelmaft.zanbur.ui import android.os.* import androidx.activity.* From db4973af258d226073917e0e5f3a75571c9ed041 Mon Sep 17 00:00:00 2001 From: Reinout Meliesie Date: Thu, 9 Jan 2025 17:39:13 +0100 Subject: [PATCH 09/10] Update to SDK 35 --- app/build.gradle.kts | 17 +++++++++-------- .../main/java/com/kernelmaft/zanbur/ui/theme.kt | 1 - 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index aa064e8..4b018c3 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -17,12 +17,12 @@ plugins { android { namespace = "com.kernelmaft.zanbur" - compileSdk = 34 + compileSdk = 35 defaultConfig { applicationId = "com.kernelmaft.zanbur" - minSdk = 31 - targetSdk = 34 + minSdk = 35 + targetSdk = 35 versionCode = 1 versionName = "1.0" } @@ -47,10 +47,11 @@ android { } } compileOptions { - targetCompatibility = JavaVersion . VERSION_11 + // Required even though we don't have any Java sources because it needs to match Kotlin's JVM version + targetCompatibility = JavaVersion . VERSION_23 } kotlinOptions { - jvmTarget = "11" + jvmTarget = "23" } buildFeatures { compose = true @@ -61,14 +62,14 @@ dependencies { // Android runtime libraries implementation ( "com.google.android.material" , "material" , "1.12.0" ) implementation ( "androidx.activity" , "activity-compose" , "1.9.3" ) - implementation ( "androidx.core" , "core-ktx" , "1.13.1" ) + implementation ( "androidx.core" , "core-ktx" , "1.15.0" ) implementation ( "androidx.compose.material3" , "material3" , "1.3.1" ) implementation ( "androidx.compose.ui" , "ui" , "1.7.6" ) implementation ( "androidx.compose.ui" , "ui-graphics" , "1.7.6" ) debugImplementation ( "androidx.compose.ui" , "ui-tooling" , "1.7.6" ) implementation ( "androidx.lifecycle" , "lifecycle-runtime-ktx" , "2.8.7" ) - implementation ( "org.jetbrains.kotlinx" , "kotlinx-coroutines-android" , "1.9.0" ) - implementation ( "org.jetbrains.kotlinx" , "kotlinx-serialization-json" , "1.7.3" ) + implementation ( "org.jetbrains.kotlinx" , "kotlinx-coroutines-android" , "1.10.1" ) + implementation ( "org.jetbrains.kotlinx" , "kotlinx-serialization-json" , "1.8.0" ) // Other libraries implementation ( "io.github.davidepianca98" , "kmqtt-common-jvm" , "1.0.0" ) implementation ( "io.github.davidepianca98" , "kmqtt-client-jvm" , "1.0.0" ) 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 0b882a2..0da4c53 100644 --- a/app/src/main/java/com/kernelmaft/zanbur/ui/theme.kt +++ b/app/src/main/java/com/kernelmaft/zanbur/ui/theme.kt @@ -29,7 +29,6 @@ open class EdgeToEdgeActivity : ComponentActivity () { override fun onCreate ( savedInstanceState : Bundle ? ) { super . onCreate (savedInstanceState) - enableEdgeToEdge () actionBar ?. hide () } } From 5410b4985fb1e024fd8e44d063a8875761adb5f9 Mon Sep 17 00:00:00 2001 From: Reinout Meliesie Date: Fri, 7 Feb 2025 11:41:48 +0100 Subject: [PATCH 10/10] Update dependencies --- app/build.gradle.kts | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 4b018c3..63a6902 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -9,10 +9,10 @@ val keystoreProperties = Properties () keystoreProperties . load ( FileInputStream ( rootProject . file ("keystore.properties") ) ) plugins { - id ("com.android.application") . version ("8.7.3") - id ("org.jetbrains.kotlin.android") . version ("2.1.0") - id ("org.jetbrains.kotlin.plugin.compose") . version ("2.1.0") - id ("org.jetbrains.kotlin.plugin.serialization") . version ("2.1.0") + id ("com.android.application") . version ("8.8.0") + id ("org.jetbrains.kotlin.android") . version ("2.1.10") + id ("org.jetbrains.kotlin.plugin.compose") . version ("2.1.10") + id ("org.jetbrains.kotlin.plugin.serialization") . version ("2.1.10") } android { @@ -61,18 +61,18 @@ android { dependencies { // Android runtime libraries implementation ( "com.google.android.material" , "material" , "1.12.0" ) - implementation ( "androidx.activity" , "activity-compose" , "1.9.3" ) + implementation ( "androidx.activity" , "activity-compose" , "1.10.0" ) implementation ( "androidx.core" , "core-ktx" , "1.15.0" ) implementation ( "androidx.compose.material3" , "material3" , "1.3.1" ) - implementation ( "androidx.compose.ui" , "ui" , "1.7.6" ) - implementation ( "androidx.compose.ui" , "ui-graphics" , "1.7.6" ) - debugImplementation ( "androidx.compose.ui" , "ui-tooling" , "1.7.6" ) + implementation ( "androidx.compose.ui" , "ui" , "1.7.7" ) + implementation ( "androidx.compose.ui" , "ui-graphics" , "1.7.7" ) + debugImplementation ( "androidx.compose.ui" , "ui-tooling" , "1.7.7" ) implementation ( "androidx.lifecycle" , "lifecycle-runtime-ktx" , "2.8.7" ) implementation ( "org.jetbrains.kotlinx" , "kotlinx-coroutines-android" , "1.10.1" ) implementation ( "org.jetbrains.kotlinx" , "kotlinx-serialization-json" , "1.8.0" ) // Other libraries - implementation ( "io.github.davidepianca98" , "kmqtt-common-jvm" , "1.0.0" ) - implementation ( "io.github.davidepianca98" , "kmqtt-client-jvm" , "1.0.0" ) + implementation ( "io.github.davidepianca98" , "kmqtt-common" , "1.0.0" ) + implementation ( "io.github.davidepianca98" , "kmqtt-client" , "1.0.0" ) } tasks . withType ( KotlinCompile :: class ) . all {