diff --git a/app/build.gradle b/app/build.gradle
index 4961bfb8..feb234ee 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -1,5 +1,6 @@
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-kapt'
dependencies {
implementation project(':speechutils:app')
@@ -13,6 +14,15 @@ dependencies {
// implementation 'androidx.activity:activity:1.4.0'
implementation 'androidx.dynamicanimation:dynamicanimation:1.0.0'
implementation 'com.google.android.material:material:1.12.0'
+ implementation 'androidx.activity:activity-compose:1.8.2'
+ implementation 'androidx.compose.ui:ui:1.5.4'
+ implementation 'androidx.compose.material3:material3:1.1.2'
+ implementation 'androidx.compose.ui:ui-tooling-preview:1.5.4'
+ debugImplementation 'androidx.compose.ui:ui-tooling:1.5.4'
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.6.2'
+ implementation 'androidx.room:room-ktx:2.6.1'
+ implementation 'androidx.room:room-runtime:2.6.1'
+ kapt 'androidx.room:room-compiler:2.6.1'
}
android {
@@ -66,6 +76,10 @@ android {
buildFeatures {
viewBinding true
+ compose true
+ }
+ composeOptions {
+ kotlinCompilerExtensionVersion '1.5.4'
}
lint {
// TODO: in the future check for Kotlin-Java interop
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 6c03189b..1daa3c7d 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -286,6 +286,11 @@ Also, failed to set the launchMode from the resource, INSTALL_PARSE_FAILED_UNEXP
android:exported="false"
android:label="@string/dialogTitleCombo"
android:parentActivityName=".activity.Preferences" />
+
) {
+ Surface(modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background) {
+ LazyColumn {
+ items(combos, key = { it.id }) { combo ->
+ Text(text = combo.longLabel)
+ }
+ }
+ }
+}
diff --git a/app/src/main/java/ee/ioc/phon/android/speak/db/AppDatabase.kt b/app/src/main/java/ee/ioc/phon/android/speak/db/AppDatabase.kt
new file mode 100644
index 00000000..b826d84b
--- /dev/null
+++ b/app/src/main/java/ee/ioc/phon/android/speak/db/AppDatabase.kt
@@ -0,0 +1,28 @@
+package ee.ioc.phon.android.speak.db
+
+import android.content.Context
+import androidx.room.Database
+import androidx.room.Room
+import androidx.room.RoomDatabase
+
+@Database(entities = [ComboEntity::class], version = 1)
+abstract class AppDatabase : RoomDatabase() {
+ abstract fun comboDao(): ComboDao
+
+ companion object {
+ @Volatile
+ private var INSTANCE: AppDatabase? = null
+
+ fun getDatabase(context: Context): AppDatabase {
+ return INSTANCE ?: synchronized(this) {
+ val instance = Room.databaseBuilder(
+ context.applicationContext,
+ AppDatabase::class.java,
+ "combos.db"
+ ).build()
+ INSTANCE = instance
+ instance
+ }
+ }
+ }
+}
diff --git a/app/src/main/java/ee/ioc/phon/android/speak/db/ComboDao.kt b/app/src/main/java/ee/ioc/phon/android/speak/db/ComboDao.kt
new file mode 100644
index 00000000..c1442265
--- /dev/null
+++ b/app/src/main/java/ee/ioc/phon/android/speak/db/ComboDao.kt
@@ -0,0 +1,23 @@
+package ee.ioc.phon.android.speak.db
+
+import androidx.room.Dao
+import androidx.room.Delete
+import androidx.room.Insert
+import androidx.room.Query
+import androidx.room.Update
+import kotlinx.coroutines.flow.Flow
+
+@Dao
+interface ComboDao {
+ @Query("SELECT * FROM combos ORDER BY position")
+ fun getAll(): Flow>
+
+ @Insert
+ suspend fun insert(combo: ComboEntity)
+
+ @Update
+ suspend fun update(combo: ComboEntity)
+
+ @Delete
+ suspend fun delete(combo: ComboEntity)
+}
diff --git a/app/src/main/java/ee/ioc/phon/android/speak/db/ComboEntity.kt b/app/src/main/java/ee/ioc/phon/android/speak/db/ComboEntity.kt
new file mode 100644
index 00000000..a39a1537
--- /dev/null
+++ b/app/src/main/java/ee/ioc/phon/android/speak/db/ComboEntity.kt
@@ -0,0 +1,14 @@
+package ee.ioc.phon.android.speak.db
+
+import androidx.room.Entity
+import androidx.room.PrimaryKey
+
+@Entity(tableName = "combos")
+data class ComboEntity(
+ @PrimaryKey(autoGenerate = true) val id: Int = 0,
+ val comboId: String,
+ val shortLabel: String,
+ val longLabel: String,
+ val enabled: Boolean = true,
+ val position: Int = 0
+)