Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 5 additions & 8 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -97,12 +97,8 @@ protobuf {
generateProtoTasks {
all().forEach {
it.builtins {
create("kotlin") {
option("lite")
}
create("java") {
option("lite")
}
create("kotlin")
create("java")
}
}
}
Expand Down Expand Up @@ -163,8 +159,9 @@ dependencies {
testAnnotationProcessor(libs.hilt.android.compiler)

// Protobuf and Datastore
implementation(libs.protobuf.kotlin.lite)
implementation(libs.protobuf.java.lite)
implementation(libs.protobuf.kotlin)
implementation(libs.protobuf.java)
implementation(libs.protobuf.java.util)
implementation(libs.datastore)

// Navigation
Expand Down
4 changes: 3 additions & 1 deletion app/src/main/kotlin/org/stypox/dicio/error/UserAction.kt
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,7 @@ enum class UserAction(val message: String) : Parcelable {
GENERIC_EVALUATION("Evaluation"),
SKILL_EVALUATION("Skill evaluation"),
WAKE_DOWNLOADING("Downloading wake word model"),
WAKE_LOADING("Loading wake word model");
WAKE_LOADING("Loading wake word model"),
IMPORTING_CHECKLIST("Importing checklist"),
EXPORTING_CHECKLIST("Exporting checklist");
}
2 changes: 2 additions & 0 deletions app/src/main/kotlin/org/stypox/dicio/eval/SkillHandler.kt
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import org.stypox.dicio.di.SkillContextInternal
import org.stypox.dicio.settings.datastore.UserSettings
import org.stypox.dicio.settings.datastore.UserSettingsModule
import org.stypox.dicio.skills.calculator.CalculatorInfo
import org.stypox.dicio.skills.checklist.ChecklistInfo
import org.stypox.dicio.skills.current_time.CurrentTimeInfo
import org.stypox.dicio.skills.fallback.text.TextFallbackInfo
import org.stypox.dicio.skills.listening.ListeningInfo
Expand Down Expand Up @@ -55,6 +56,7 @@ class SkillHandler @Inject constructor(
JokeInfo,
ListeningInfo(dataStore),
TranslationInfo,
ChecklistInfo,
)

// TODO add more fallback skills (e.g. search)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.ArrowBack
import androidx.compose.material.icons.filled.DeleteSweep
import androidx.compose.material.icons.filled.Checklist
import androidx.compose.material.icons.filled.Extension
import androidx.compose.material.icons.filled.UploadFile
import androidx.compose.material3.ExperimentalMaterial3Api
Expand All @@ -31,6 +32,8 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.navigation.NavHost
import androidx.navigation.NavHostController
import org.stypox.dicio.R
import org.stypox.dicio.settings.datastore.InputDevice
import org.stypox.dicio.settings.datastore.Language
Expand All @@ -41,13 +44,15 @@ import org.stypox.dicio.settings.datastore.UserSettingsModule.Companion.newDataS
import org.stypox.dicio.settings.datastore.WakeDevice
import org.stypox.dicio.settings.ui.SettingsCategoryTitle
import org.stypox.dicio.settings.ui.SettingsItem
import org.stypox.dicio.ui.nav.ChecklistSettings
import org.stypox.dicio.ui.nav.SkillSettings
import org.stypox.dicio.ui.theme.AppTheme


@Composable
fun MainSettingsScreen(
navigationIcon: @Composable () -> Unit,
navigateToSkillSettings: () -> Unit,
navigationController: NavHostController?,
viewModel: MainSettingsViewModel = hiltViewModel(),
) {
Scaffold(
Expand All @@ -60,7 +65,7 @@ fun MainSettingsScreen(
}
) {
MainSettingsScreen(
navigateToSkillSettings = navigateToSkillSettings,
navigationController = navigationController,
viewModel = viewModel,
modifier = Modifier.padding(it),
)
Expand All @@ -69,7 +74,7 @@ fun MainSettingsScreen(

@Composable
private fun MainSettingsScreen(
navigateToSkillSettings: () -> Unit,
navigationController: NavHostController?,
viewModel: MainSettingsViewModel,
modifier: Modifier = Modifier,
) {
Expand Down Expand Up @@ -115,10 +120,19 @@ private fun MainSettingsScreen(
icon = Icons.Default.Extension,
description = stringResource(R.string.pref_skills_summary),
modifier = Modifier
.clickable(onClick = navigateToSkillSettings)
.clickable(onClick = { navigationController?.navigate(SkillSettings) })
.testTag("skill_settings_item")
)
}
item {
SettingsItem(
title = stringResource(R.string.checklists),
icon = Icons.Default.Checklist,
description = stringResource(R.string.skill_checklist_settings_description),
modifier = Modifier
.clickable(onClick = { navigationController?.navigate(ChecklistSettings) })
)
}

/* INPUT AND OUTPUT METHODS */
item { SettingsCategoryTitle(stringResource(R.string.pref_io)) }
Expand Down Expand Up @@ -208,7 +222,7 @@ private fun MainSettingsScreenPreview() {
color = MaterialTheme.colorScheme.background
) {
MainSettingsScreen(
navigateToSkillSettings = {},
navigationController = null,
viewModel = MainSettingsViewModel(
application = Application(),
wakeDeviceWrapper = null,
Expand All @@ -235,7 +249,7 @@ private fun MainSettingsScreenWithTopBarPreview() {
)
}
},
navigateToSkillSettings = {},
navigationController = null,
viewModel = MainSettingsViewModel(
application = Application(),
wakeDeviceWrapper = null,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package org.stypox.dicio.skills.checklist

import android.content.Context
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Checklist
import androidx.compose.runtime.Composable
import androidx.compose.ui.graphics.vector.rememberVectorPainter
import androidx.datastore.core.handlers.ReplaceFileCorruptionHandler
import androidx.datastore.dataStore
import org.dicio.skill.context.SkillContext
import org.dicio.skill.skill.Skill
import org.dicio.skill.skill.SkillInfo
import org.stypox.dicio.R
import org.stypox.dicio.sentences.Sentences

object ChecklistInfo : SkillInfo("checklist") {
override fun name(context: Context) =
context.getString(R.string.skill_name_checklist)

override fun sentenceExample(context: Context) =
context.getString(R.string.skill_sentence_example_checklist)

@Composable
override fun icon() =
rememberVectorPainter(Icons.Default.Checklist)

override fun isAvailable(ctx: SkillContext): Boolean {
return Sentences.Checklist[ctx.sentencesLanguage] != null &&
Sentences.UtilYesNo[ctx.sentencesLanguage] != null &&
ctx.parserFormatter != null
}

override fun build(ctx: SkillContext): Skill<*> {
return ChecklistSkill(ChecklistInfo, Sentences.Checklist[ctx.sentencesLanguage]!!)
}

// no need to use Hilt injection here, let DataStore take care of handling the singleton itself
internal val Context.checklistDataStore by dataStore(
fileName = "checklist.pb",
serializer = SkillSettingsChecklistSerializer,
corruptionHandler = ReplaceFileCorruptionHandler {
SkillSettingsChecklistSerializer.defaultValue
},
)
}
Loading