Skip to content

Refactor: remove isAvailable(), make build() return Skill<*>?#415

Draft
mretallack wants to merge 6 commits into
DicioTeam:mainfrom
mretallack:refactor/remove-isAvailable-race-condition
Draft

Refactor: remove isAvailable(), make build() return Skill<*>?#415
mretallack wants to merge 6 commits into
DicioTeam:mainfrom
mretallack:refactor/remove-isAvailable-race-condition

Conversation

@mretallack
Copy link
Copy Markdown

Eliminates the race condition where a skill could be deemed available under one locale but then built/executed under a different locale after a language change.

By merging the availability check into build() and returning null when the skill cannot be constructed, there is no longer a window between checking availability and building the skill where state can change.

  • Remove SkillInfo.isAvailable() abstract method
  • Change SkillInfo.build() return type from Skill<> to Skill<>?
  • Update all 15 SkillInfo implementations to return null if unavailable
  • Update SkillHandler to use mapNotNull for building skills
  • Update SkillSettingsScreen to use build() != null
  • Update test mocks and preview providers

Addresses the root cause of the NPE in #412 at the architecture level.

Eliminates the race condition where a skill could be deemed available
under one locale but then built/executed under a different locale after
a language change.

By merging the availability check into build() and returning null when
the skill cannot be constructed, there is no longer a window between
checking availability and building the skill where state can change.

- Remove SkillInfo.isAvailable() abstract method
- Change SkillInfo.build() return type from Skill<*> to Skill<*>?
- Update all 15 SkillInfo implementations to return null if unavailable
- Update SkillHandler to use mapNotNull for building skills
- Update SkillSettingsScreen to use build() != null
- Update test mocks and preview providers

Addresses the root cause of the NPE in DicioTeam#412 at the architecture level.
Copy link
Copy Markdown
Collaborator

@Stypox Stypox left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you! I left some minor comments

Comment thread app/src/main/kotlin/org/stypox/dicio/eval/SkillHandler.kt Outdated
Comment thread app/src/main/kotlin/org/stypox/dicio/eval/SkillHandler.kt Outdated
Comment thread app/src/main/kotlin/org/stypox/dicio/eval/SkillHandler.kt Outdated
Comment thread app/src/main/kotlin/org/stypox/dicio/eval/SkillHandler.kt Outdated
Comment thread app/src/main/kotlin/org/stypox/dicio/settings/SkillSettingsScreen.kt Outdated
Comment thread app/src/main/kotlin/org/stypox/dicio/skills/calculator/CalculatorInfo.kt Outdated
Comment thread app/src/main/kotlin/org/stypox/dicio/skills/flashlight/FlashlightInfo.kt Outdated
Comment thread app/src/main/kotlin/org/stypox/dicio/skills/joke/JokeSkill.kt Outdated
mretallack and others added 5 commits May 12, 2026 21:37
- Remove buildSkillFromInfo helper, inline fallback build
- CalculatorSkill: accept operators as constructor param, no runtime !!
- JokeSkill: accept resolved locale as constructor param, no runtime !!
- TelephoneInfo/TimerInfo: use ?: return null pattern, no !!
- FlashlightInfo: remove @SuppressLint("NewApi")
- SkillSettingsScreen: source availability from enabledSkillsInfo via
  view model instead of calling build() in composable
enabledSkillsInfo only contains skills that are enabled AND available.
A skill disabled by the user would incorrectly appear as unavailable
(greyed out). Now disabled skills are assumed available since we cannot
determine availability without building them.
// enabledSkillsInfo contains skills that are both enabled AND available.
// A skill is "available" if:
// - it's in enabledSkillsInfo (enabled + buildable), OR
// - it's disabled by the user (we can't tell availability from the list,
Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Stypox I hope this explains the logic,

@mretallack
Copy link
Copy Markdown
Author

Thank you! I left some minor comments

@Stypox thanks, new commits pushed, if you want to have a quick look to see its the right direction.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants