Skip to content
CAI
Software that uses CAICheck a score

fibelatti/raffler-kotlin

45.5

Weak · 21 September 2026

6k

lines of production code

Kotlin

primary language

4

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

This system is an Android application designed for generating random selections and managing participatory events. It provides users with tools for quick decision-making, lottery number generation, and creating custom raffles with multiple interaction modes, including roulette, grouping, and voting. The app features a modern architecture utilizing Room for local persistence and Dagger2 for dependency injection, supporting a rich set of user interactions and data management.

Features

Add new quick decision feature

Users can now add a new quick decision by selecting from a list of custom raffles. This change introduces the AddNewQuickDecisionFragment, which displays a RecyclerView of custom raffles, allowing users to choose one to be added as a quick decision.

app/src/main/kotlin/com/fibelatti/raffler/features/quickdecision/presentation/addnew · high confidence

Added Custom Raffle Grouping Fragment

A new CustomRaffleGroupingFragment has been introduced to handle the UI for grouping custom raffles. This fragment manages the layout and logic for organizing raffle items into groups based on quantity or item-specific quantities, displaying the resulting groups in a list with dynamic color gradients.

app/src/main/kotlin/com/fibelatti/raffler/features/myraffles/presentation/grouping · high confidence

Added Custom Raffle Random Winners Fragment

Introduced a new UI component for the random winners flow in custom raffles. The new \CustomRaffleRandomWinnersFragment\ handles the selection of random winners, displaying the resulting list with a color gradient and managing user interactions such as triggering the random draw and handling quantity validation errors.

app/src/main/kotlin/com/fibelatti/raffler/features/myraffles/presentation/randomwinners · high confidence

Added combination feature for creating custom raffle pairs

Users can now combine two custom raffles to generate a new combined raffle. This change introduces the \CustomRaffleCombinationFragment\ which allows users to select a second raffle to pair with an existing one, view the resulting combinations in a list, and handle any quantity errors that may arise during the combination process.

app/src/main/kotlin/com/fibelatti/raffler/features/myraffles/presentation/combination · high confidence

Adds Quick Decision screen with new adapter and delegate implementation

The app introduces a new Quick Decision feature, implemented via a new QuickDecisionAdapter and its corresponding QuickDecisionDelegateAdapter. The adapter manages item rendering by delegating to specialized delegate adapters for 'Add New' and 'Quick Decision' model types, enabling users to view and interact with quick decision items in the list.

app/src/main/kotlin/com/fibelatti/raffler/features/quickdecision/presentation/adapter · high confidence

Adds custom raffle modes: combination, grouping, random winners, and voting

Users can now create and manage custom raffles with multiple interaction modes. A new 'combination' mode allows combining two custom raffles to generate paired results. A 'grouping' mode distributes items into random groups, while a 'random winners' mode selects a specific number of winners from the list. Additionally, a 'voting' mode has been introduced, allowing users to create polls with PIN protection and view real-time results with tie-breaking logic. The 'my raffles' list now displays these custom raffles, and the details screen supports selecting items, remembering raffled items, and switching between these new raffle modes.

. · high confidence

Adds custom raffle roulette interface

Introduces the CustomRaffleRouletteFragment, a new UI component that manages the roulette-style selection process for custom raffles. This fragment handles the visual feedback, animations, and user interactions for spinning the roulette, including starting, stopping, and displaying the selected item.

app/src/main/kotlin/com/fibelatti/raffler/features/myraffles/presentation/roulette · high confidence

Adds data layer for custom raffles and voting

The app now supports creating, saving, and deleting custom raffles and their associated items, as well as managing voting data for them. This new data layer introduces \CustomRaffleDataSource\ and \CustomRaffleVotingDataSource\ classes that handle persistence via Room database interactions, allowing users to manage their own raffles and voting preferences within the app.

app/src/main/kotlin/com/fibelatti/raffler/features/myraffles/data · high confidence

Adds lottery screen implementation

The app now includes a new lottery feature, introducing a LotteryFragment and its associated LotteryAdapter to display generated numbers in a grid layout. The interface allows users to input a total quantity and a raffle quantity (both limited to a maximum of 999), with error handling for invalid inputs. A dismissible hint is also shown to guide the user.

app/src/main/kotlin/com/fibelatti/raffler/features/lottery · high confidence

Adds support for custom raffles and voting

The app now supports creating and managing custom raffles, including a new data layer with repositories for storing and retrieving custom raffle details and associated voting data. A new use case formats voting results into a structured list of view types, enabling users to see ranked voting outcomes with titles for first, second, and third place, as well as handling ties and empty states.

app/src/main/kotlin/com/fibelatti/raffler/features/myraffles · high confidence

Introduced custom raffle voting flow

Added new fragments and view models to support a custom raffle voting feature, including a start screen for PIN entry and a menu screen for casting votes and viewing results.

app/src/main/kotlin/com/fibelatti/raffler/features/myraffles/presentation/voting · high confidence

Introduced new UI components for custom raffle voting

Added a new adapter and fragment to handle the user interface for casting votes in a custom raffle. The new CustomRaffleVotingVoteFragment displays a list of voting options and presents a confirmation dialog when a user selects an option, ensuring the user confirms their choice before the vote is submitted.

app/src/main/kotlin/com/fibelatti/raffler/features/myraffles/presentation/voting/vote · high confidence

Introduces Home activity with in-app update support and bottom navigation

The app now features a new Home activity that serves as the main entry point, integrating a bottom navigation bar that dynamically shows or hides based on the current fragment. This activity also initializes in-app update checks, displaying a snackbar notification when an update is ready to install. The home screen now supports navigation to quick decision, lottery, my raffles, and preferences fragments.

app/src/main/kotlin/com/fibelatti/raffler/features/home · high confidence

Introduces QuickDecision data layer with Room persistence and JSON fallback

The QuickDecisionDataSource class is added to manage quick decision data, implementing the QuickDecisionRepository interface. It uses AndroidX Room for local database operations (getAllQuickDecisions, getQuickDecisionById, deleteQuickDecisionById, addQuickDecisions) and falls back to loading data from a local JSON asset file if the database is empty. The implementation leverages a custom Result type for error handling and includes a data transfer object mapper for converting between database entities and domain models.

app/src/main/kotlin/com/fibelatti/raffler/features/quickdecision/data · high confidence

Introduces QuickDecisionRepository interface for managing quick decisions

The QuickDecisionRepository interface is added to the quick decision feature, providing methods to retrieve all quick decisions, fetch a specific decision by its ID, delete a decision by ID, and add multiple decisions using varargs. All methods return a Result type, indicating that the repository handles potential errors through a functional result wrapper rather than throwing exceptions.

app/src/main/kotlin/com/fibelatti/raffler/features/quickdecision · high confidence

Introduces new UI for displaying custom raffle voting results

The app now displays voting results using a new set of presentation components (adapter, fragment, and delegate adapters) that render a title header and a list of results with animated progress bars. This change implements the visual and interactive layer for the voting results screen, including handling tie-breaker scenarios and random decision flows.

app/src/main/kotlin/com/fibelatti/raffler/features/myraffles/presentation/voting/results · high confidence

Introduces the Quick Decision feature with swipe-to-dismiss and animated results

Users can now generate and view quick decisions. The Quick Decision screen displays a list of decisions with a grid layout, allowing users to add new ones or navigate to create a custom raffle. Selecting a decision navigates to a result screen that displays the outcome with a fade-in animation. The result screen supports a swipe-down gesture to dismiss the view, providing a more intuitive way to return to the previous screen.

app/src/main/kotlin/com/fibelatti/raffler/features/quickdecision/presentation · high confidence

Architecture

Introduces new dependency injection and persistence architecture

The app's core now features a comprehensive Dagger2-based dependency injection system, introducing \AppComponent\ and \ActivityComponent\ to manage object graph creation and provide scoped instances. This change introduces a new Room-based persistence layer, replacing the previous storage mechanisms with \AppDatabase\ and associated Data Access Objects (DAOs) for quick decisions, custom raffles, and preferences. Additionally, the update adds a \CurrentInstallSharedPreferences\ class to track the current installation state and migrate legacy data, alongside new extension functions for context, graphics, and live data to support the new architecture.

app/src/main/kotlin · high confidence

Behavioural changes

2 commits (0 fixes) modifying keystore

A change to existing behaviour in keystore — 2 commits, 1 file.

keystore · medium confidence · unverified

Build system and CI configuration overhaul

The project's continuous integration has been migrated from Travis CI to GitHub Actions, and the Gradle wrapper script has been updated to use Bash instead of the POSIX shell. Additionally, the project's license has been updated to the full text of the Apache License 2.0, and the Detekt configuration has been significantly expanded to include new rules and stricter thresholds.

(repo-wide) · high confidence

Configure JUnit 5 test lifecycle to per-class

A new configuration file for JUnit 5 has been added to the shared test resources, setting the default test instance lifecycle to 'per\_class'. This change means that each JUnit 5 test class will share a single test instance for all its test methods, rather than creating a new instance for each method, which can improve test performance and allow state to be shared across methods within the same class.

app/src/sharedTest/resources · high confidence

Custom raffle details screen refactored with new adapter and fragment

The CustomRaffleDetailsFragment and its associated adapter have been rewritten to use a new BaseAdapter implementation, replacing the previous ListAdapter-based approach. This change introduces a cleaner click handling mechanism for item selection and integrates with the new core library's view binding and navigation components. The fragment now explicitly manages state for raffle modes (roulette, random winners, grouping, combination, and voting) and displays dismissible hints, aligning with the broader app modernization.

app/src/main/kotlin/com/fibelatti/raffler/features/myraffles/presentation/customraffledetails · medium confidence

Enhanced ProGuard configuration with custom obfuscation dictionary

The app's ProGuard rules have been updated to include a custom obfuscation dictionary (proguard-dictionary.txt) for class, package, and method name obfuscation, alongside expanded keep rules for Kotlin, Coroutines, Material, and Gson libraries. This change improves the security and size of the release build by applying more aggressive and specific obfuscation and shrinking rules.

app · medium confidence

New common UI components for custom raffles

Added new presentation-layer components for the custom raffles feature: a bottom-sheet mode selector (CustomRaffleModes) that lets users choose between roulette, random winners, grouping, combination, and voting modes; a bottom-sheet list selector (CustomRaffleSelector) for picking a specific custom raffle; and two new adapters (CustomRaffleDraftedAdapter and CustomRaffleSelectorAdapter) that render raffle items using a shared BaseAdapter pattern. These changes introduce new UI interactions for selecting raffle types and individual raffles within the myraffles feature.

app/src/main/kotlin/com/fibelatti/raffler/features/myraffles/presentation/common · high confidence

Preferences data layer migrated to Room database

The preferences feature now uses a new data layer that persists user settings in a local Room database. The \PreferencesRepository\ and \PreferencesDataSource\ classes have been introduced to manage preference storage, including theme, language, and various hint dismissal states. This change ensures that user preferences are reliably saved and retrieved from the device's local storage rather than relying solely on in-memory or shared preferences for all settings.

app/src/main/kotlin/com/fibelatti/raffler/features/preferences/data · high confidence

Preferences screen restructured into dedicated sub-screens

The main preferences screen now serves as a hub, navigating to separate fragments for General, Lottery, and Custom Raffles settings. Users can now adjust app theme (Classic/Dark), language (English, Portuguese, Spanish), and lottery defaults (quantity limits) in their respective sections. The Custom Raffles section allows users to set a preferred raffle mode (Roulette, Random Winners, Grouping, Combination, Secret Voting) and toggle options like remembering raffled items or enabling roulette music.

app/src/main/kotlin/com/fibelatti/raffler/features/preferences/presentation · high confidence

Redesigns the custom raffle creation flow with improved keyboard and list management

The CreateCustomRaffleFragment and its associated adapter have been refactored to improve user interaction. The adapter now extends BaseAdapter for cleaner list handling. The fragment integrates keyboard visibility handling to prevent input field obscuration and manages item addition via both a dedicated button and keyboard submission. It also supports swipe-to-delete and swipe-to-edit actions on the raffle items list, and includes a confirmation dialog for deleting the entire raffle. These changes streamline the creation and editing of custom raffles.

app/src/main/kotlin/com/fibelatti/raffler/features/myraffles/presentation/createcustomraffle · medium confidence

Reworks the My Raffles list presentation with a new adapter and delegate architecture

The My Raffles screen now uses a new CustomRaffleAdapter and CustomRaffleDelegateAdapter to render the list of raffles. This change introduces a delegate-based adapter pattern that supports both custom raffle items and an 'add new' item, with click listeners wired to navigate to the create or details screens. The fragment has been updated to use this new adapter, handling data submission and UI state (hint/container visibility) accordingly.

app/src/main/kotlin/com/fibelatti/raffler/features/myraffles/presentation/list · medium confidence

Updated build configuration and dependencies for version 2.1.1

The buildSrc module was updated to version 2.1.1, which includes a bump in the application version code logic to support a build number, and a significant update to the dependency definitions. Key changes include upgrading the target and compile SDK versions to 29, updating Kotlin to 1.4.0 and Coroutines to 1.3.8, and migrating to AndroidX libraries (e.g., AppCompat 1.2.0, Material Design 1.2.0, Navigation 2.3.0). The test dependencies were also updated to include JUnit 5 and updated versions of Mockito and other testing libraries.

buildSrc · high confidence

Test coverage

Added Android instrumentation tests for persistence layer; Added tests for PreferencesDao; Added unit tests for AppConfig and removed obsolete Mockito configuration; Added unit tests for CustomRaffleDetailsViewModel; Added unit tests for LotteryViewModel; Added unit tests for PreferencesDataSource; Added unit tests for QuickDecisionDataSource; Adds shared test infrastructure for coroutine and ViewModel testing.

Dependencies

Migrates build scripts to Kotlin DSL and modernizes dependencies

The project's build configuration has been migrated from Groovy to Kotlin DSL (build.gradle.kts), and the Gradle wrapper has been updated to 4.10.2. The migration includes enabling AndroidX and Jetifier, updating the Kotlin compiler to target JVM 1.8, and modernizing the dependency management by replacing direct library references with a centralized \Dependencies\ object. Additionally, the build system now uses JUnit 5 for testing, integrates the Detekt static analysis tool via the Gradle plugin, and configures AndroidX test runners.

(dependencies) · medium confidence

Upgraded Gradle wrapper to version 6.4

The project's Gradle wrapper has been updated from version 4.4 to 6.4. This upgrade ensures that the build environment uses a more recent version of Gradle, which may bring performance improvements, new features, and compatibility with newer Java versions.

gradle · high confidence

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

How this codebase got here

This is the PUBLIC form of this artifact. Findings are listed in full, but the details of SECURITY findings — which rule fired, in which file, on which line, and how to fix it — are deliberately withheld, and any secret-scanner results are excluded entirely. Where detail is absent here it was REMOVED FOR PUBLICATION; it is not missing from the analysis. The complete artifact is available from the repository owner.

Score

  • CAI 54 → 46 (-8.9)
  • Rubric changed (rubric-2026.08.19 → rubric-2026.09.15) — scores are not directly comparable.

Lenses

  • Code Health 100 → 100 (+0.1)
  • Architecture 99 → 63 (-35.4)
  • Maturity 43 → 35 (-7.5)
  • Readiness 57 → 39 (-17.3)
  • Security 53 → 65 (+11.9)

Resolved (14)

  • Change coupling: PreferencesDataSource.kt ↔ PreferencesFragment.kt (app/src/main/kotlin/com/fibelatti/raffler/features/preferences/data/PreferencesDataSource.kt)
  • Change coupling: PreferencesDataSource.kt ↔ PreferencesViewModel.kt (app/src/main/kotlin/com/fibelatti/raffler/features/preferences/data/PreferencesDataSource.kt)
  • Coverage not included — suite not readable by the collector
  • Dependency hygiene not measured — dependency manifest found but not parsed for hygiene
  • Duplicated block (9 lines × 2) (app/src/main/kotlin/com/fibelatti/raffler/core/platform/recyclerview/RecyclerViewSwipeToDeleteCallback.kt)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • No exposed public API
  • Test reliability not included
  • single-maintainer — knowledge-concentration (bus factor) risk

New (19)

  • Change coupling: CreateCustomRaffleFragment.kt ↔ CreateCustomRaffleViewModel.kt (app/src/main/kotlin/com/fibelatti/raffler/features/myraffles/presentation/createcustomraffle/CreateCustomRaffleFragment.kt)
  • Dependency hygiene PARTLY measured — Maven/Gradle declarations read, no dependency graph resolved
  • Documentation: no installation or build instructions (README.md)
  • Documentation: no usage examples (README.md)
  • Duplicated block (12 lines × 2) (app/src/main/kotlin/com/fibelatti/raffler/core/platform/recyclerview/RecyclerViewSwipeToDeleteCallback.kt)
  • High secret: WD-SECRET-0004 (keystore/debug.keystore)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • Leaked secret: private-key-store (keystore/debug.keystore)
  • Medium: security finding (details withheld)
  • Medium: security finding (details withheld)
  • Medium: security finding (details withheld)
  • Medium: security finding (details withheld)
  • No ADRs found
  • No dependency advisory monitoring

Architecture

  • Containers 0 added · 0 removed · contexts 1 added · 1 removed · edges 0 added · 0 removed

Added bounded contexts (1)

  • app

Removed bounded contexts (1)

  • .

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

Survey your own repository

fibelatti/raffler-kotlin was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.

About this page

  • The score is its most recent published measurement, taken on 21 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
  • Measured at commit d92aa7f532a2c9efa1dbdd9654093fc3b419e51f — the exact code this score is about.
  • Scored under rubric-2026.09.15 — the same rubric and the same method as every other entry in this index.
  • Measured by watchdog.canine.dev using codehealth-analyzer preprod-fa71c66cabd8.