Skip to content

Commit 653d896

Browse files
committed
Debug implementation of a Calendar skill
for Stypox/dicio-numbers#12
1 parent 1d20e99 commit 653d896

File tree

10 files changed

+131
-1
lines changed

10 files changed

+131
-1
lines changed

app/src/main/kotlin/org/stypox/dicio/eval/SkillHandler.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import org.stypox.dicio.di.SkillContextInternal
1818
import org.stypox.dicio.settings.datastore.UserSettings
1919
import org.stypox.dicio.settings.datastore.UserSettingsModule
2020
import org.stypox.dicio.skills.calculator.CalculatorInfo
21+
import org.stypox.dicio.skills.calendar.CalendarInfo
2122
import org.stypox.dicio.skills.current_time.CurrentTimeInfo
2223
import org.stypox.dicio.skills.fallback.text.TextFallbackInfo
2324
import org.stypox.dicio.skills.listening.ListeningInfo
@@ -55,6 +56,7 @@ class SkillHandler @Inject constructor(
5556
JokeInfo,
5657
ListeningInfo(dataStore),
5758
TranslationInfo,
59+
CalendarInfo,
5860
)
5961

6062
// TODO add more fallback skills (e.g. search)
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package org.stypox.dicio.skills.calendar
2+
3+
import android.content.Context
4+
import android.os.Build
5+
import androidx.compose.foundation.layout.Column
6+
import androidx.compose.material.icons.Icons
7+
import androidx.compose.material.icons.filled.CalendarMonth
8+
import androidx.compose.runtime.Composable
9+
import androidx.compose.runtime.collectAsState
10+
import androidx.compose.runtime.getValue
11+
import androidx.compose.runtime.rememberCoroutineScope
12+
import androidx.compose.ui.graphics.vector.rememberVectorPainter
13+
import androidx.compose.ui.platform.LocalContext
14+
import androidx.compose.ui.res.stringResource
15+
import androidx.datastore.core.handlers.ReplaceFileCorruptionHandler
16+
import androidx.datastore.dataStore
17+
import androidx.datastore.migrations.SharedPreferencesMigration
18+
import kotlinx.coroutines.launch
19+
import org.dicio.skill.context.SkillContext
20+
import org.dicio.skill.skill.Skill
21+
import org.dicio.skill.skill.SkillInfo
22+
import org.stypox.dicio.R
23+
import org.stypox.dicio.sentences.Sentences
24+
import org.stypox.dicio.settings.ui.ListSetting
25+
import org.stypox.dicio.settings.ui.StringSetting
26+
27+
object CalendarInfo : SkillInfo("calendar") {
28+
override fun name(context: Context) =
29+
context.getString(R.string.skill_name_calendar)
30+
31+
override fun sentenceExample(context: Context) =
32+
context.getString(R.string.skill_sentence_example_calendar)
33+
34+
@Composable
35+
override fun icon() =
36+
rememberVectorPainter(Icons.Default.CalendarMonth)
37+
38+
override fun isAvailable(ctx: SkillContext): Boolean {
39+
return Sentences.Calendar[ctx.sentencesLanguage] != null && ctx.parserFormatter != null
40+
}
41+
42+
override fun build(ctx: SkillContext): Skill<*> {
43+
return CalendarSkill(CalendarInfo, Sentences.Calendar[ctx.sentencesLanguage]!!)
44+
}
45+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package org.stypox.dicio.skills.calendar
2+
3+
import androidx.compose.foundation.layout.Column
4+
import androidx.compose.runtime.Composable
5+
import org.dicio.skill.context.SkillContext
6+
import org.dicio.skill.skill.SkillOutput
7+
import org.stypox.dicio.io.graphical.Body
8+
import org.stypox.dicio.io.graphical.Headline
9+
import org.stypox.dicio.io.graphical.HeadlineSpeechSkillOutput
10+
import java.time.LocalDateTime
11+
12+
sealed interface CalendarOutput : SkillOutput {
13+
data class Success(
14+
val whenString: String,
15+
val whenDateTime: LocalDateTime,
16+
val whenBackToString: String,
17+
) : CalendarOutput {
18+
override fun getSpeechOutput(ctx: SkillContext): String =
19+
"Understood!"
20+
21+
@Composable
22+
override fun GraphicalOutput(ctx: SkillContext) {
23+
Column {
24+
Headline(getSpeechOutput(ctx))
25+
Body("I parsed: \"$whenString\",\nI understood: $whenDateTime,\nBack to string: \"$whenBackToString\"")
26+
}
27+
}
28+
}
29+
30+
data class FailedStringToDateTime(
31+
val whenString: String?
32+
) : CalendarOutput, HeadlineSpeechSkillOutput {
33+
override fun getSpeechOutput(ctx: SkillContext): String =
34+
"Could not understand date/time: \"$whenString\""
35+
}
36+
37+
data class FailedDateTimeToString(
38+
val whenDateTime: LocalDateTime
39+
) : CalendarOutput, HeadlineSpeechSkillOutput {
40+
override fun getSpeechOutput(ctx: SkillContext): String =
41+
"Could not turn date/time back to string: \"$whenDateTime\""
42+
}
43+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package org.stypox.dicio.skills.calendar
2+
3+
import org.dicio.skill.context.SkillContext
4+
import org.dicio.skill.skill.SkillInfo
5+
import org.dicio.skill.skill.SkillOutput
6+
import org.dicio.skill.standard.StandardRecognizerData
7+
import org.dicio.skill.standard.StandardRecognizerSkill
8+
import org.stypox.dicio.sentences.Sentences.Calendar
9+
10+
class CalendarSkill(correspondingSkillInfo: SkillInfo, data: StandardRecognizerData<Calendar>) :
11+
StandardRecognizerSkill<Calendar>(correspondingSkillInfo, data) {
12+
13+
override suspend fun generateOutput(ctx: SkillContext, inputData: Calendar): SkillOutput {
14+
val whenString = when (inputData) { is Calendar.Set -> inputData.`when` }
15+
?: return CalendarOutput.FailedStringToDateTime(null)
16+
val whenDateTime = try { ctx.parserFormatter?.extractDateTime(whenString)?.first }
17+
catch (_: Throwable) { null }
18+
?: return CalendarOutput.FailedStringToDateTime(whenString)
19+
val whenBackToString = try { ctx.parserFormatter?.niceDateTime(whenDateTime)?.get() }
20+
catch (_: Throwable) { null }
21+
?: return CalendarOutput.FailedStringToDateTime(whenString)
22+
return CalendarOutput.Success(whenString, whenDateTime, whenBackToString)
23+
}
24+
}

app/src/main/res/values/strings.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,4 +245,6 @@
245245
<string name="skill_weather_miles_per_hour">mph</string>
246246
<string name="failed_to_copy">Failed to copy to clipboard</string>
247247
<string name="skill_translation_auto">Auto</string>
248+
<string name="skill_name_calendar">Calendar</string>
249+
<string name="skill_sentence_example_calendar">Event 15th of July</string>
248250
</resources>
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
set:
2+
- event .when.
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
set:
2+
- evento .when.
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
set:
2+
- evento .when.

app/src/main/sentences/skill_definitions.yml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,3 +123,11 @@ skills:
123123
type: string
124124
- id: target
125125
type: string
126+
127+
- id: calendar
128+
specificity: high
129+
sentences:
130+
- id: set
131+
captures:
132+
- id: when
133+
type: string

settings.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ fun findInVersionCatalog(versionIdentifier: String): String {
6767
val includeGitRepos = listOf(
6868
IncludeGitRepo(
6969
name = "dicio-numbers",
70-
uri = "https://github.com/Stypox/dicio-numbers",
70+
uri = "https://github.com/sguinetti/dicio-numbers",
7171
projectPath = ":numbers",
7272
commit = findInVersionCatalog("dicioNumbers"),
7373
),

0 commit comments

Comments
 (0)