- Audio description of the artworks (integrated -> icon to toggle);
- How to implement it?
- General Best Practices Jetpack Compose;
- Suggested path for wheelchairs:
- Drawn in the map
- Other useful things
- data (data layer)
- dataSource (interfaces of DB, API, ...)
- local (optional) (DB DAO, ...)
- entities (DB tables)
- DAOs (interfaces to access DB table)
- DB implementation (concrete implementation of Room DB)
- remote (optional)
- API interface (HTTP endpoints)
- DTOs (classes that maps the JSON responses into DTOs)
- local (optional) (DB DAO, ...)
- repository (concrete implementation of the "repository" interface)
- dataSource (interfaces of DB, API, ...)
- domain (domain layer)
- model (entities of the domain -> "decoupling" from entities of data layer)
- repository (interface of the repository class)
- useCases (classes that model != useCases) (each useCase should refer to a specific user action)
- presentation (presentation layer)
- components (contains all the composable functions)
- ViewModel
- {Feature}Screen ("container" for all the composables)
- {Feature}Event (sealed class which contains all the events that the user can do)
- {...}State (UI states)
- Language selection (?)
- Accessibility
- Night Mode
- ...
- Presentation (presentation):
- UI (compose) (column order): title, author, (audio description toggle), pictures (slideshow), description
- VM
- TextToSpeech (?)
- Model (entities) (data):
- Artwork
- Data source (repository) (data):
- Remote server (Retrofit) (fetch artwork data from the remote db)
- Room database (cache of fetched data)
- Use Cases (domain):
- GetArtworkUseCase (given an ID get the artwork's data)
- Presentation (presentation):
- UI (compose): Map:
- Room's perimeter
- Artworks' position
- Clickable icon
- Already seen: should fire "artwork view" feature (show the artwork data)
- Not seen yet: should provide a SPECIFIC path to reach it (?)
- GENERAL path to navigate the museum
- User position (point, ...)
- VM
- Should observe the beacon flow of the UseCase
- Should modify the uiState every time a new value "arrives" from the observed flow
- UiState = data_class (beaconId, alreadySeen)
- alreadySeen
- If "beacon" not seen yet -> automatic "navigation"
- If "beacon" already seen -> snackbar
- alreadySeen
- beaconVisited = ConcurrentLinkedQueue()
- Model (data):
- Beacon (id of the beacon)
- Data source (repository) (data):
- Interface (should be able to periodically provide info about close beacons)
- AltBeacon library (somehow)
- Should expose only a Flow<List> that emits a value periodically ("didRangeBeaconsInRegion" override)
- Use Cases (domain):
- GetCloserBeaconsUseCase
- (Other business logic to determine when you are closer to a beacon)
- beaconsMap = ConcurrentHashMap<UUID, BeaconMeasurementContainer>()
- Should expose only a Flow that emits a value every time the user is really close to the beacon
- GetCloserBeaconsUseCase
- UI (compose): Map: