Sprint2 4. Implemented Features - ISIS3510-Group-27/Documentation GitHub Wiki
4. Implemented features
Flutter frontend (SENECApp-Frontend-Flutter)
Required features for sprint
| Requirement | Feature | Responsible |
|---|---|---|
| (a) Uses phone sensors | QR check-in: the camera scans the venue's QR code; GPS (with consent) confirms the student is within 500 m. Organizers show the QR from the event page; codes can also be typed. | Nicolas Salazar |
| (b) Answers type 2 BQs | Personalized recommendations (BQ2), Explore search and filters (BQ12, BQ13), "Free right now" suggestions (BQ3) | Nicolas Salazar |
| (c) Context-aware | "Free right now": events that fit the student's current or next free block, from their class schedule, the time of day and their location | Nicolas Salazar |
| (d) Smart feature | Learning recommender: the backend ranks groups with a logistic-regression model retrained nightly on its own results; the app shows why each group was picked | Nicolas Salazar |
| (e) Authentication | Firebase email/password sign-in for verified @uniandes.edu.co accounts (account creation, email verification, session restore, sign-out), plus a dev sign-in for local work |
Nicolas Salazar |
| (f) External services | Firebase Authentication and Firebase Cloud Messaging (push); the app's groups, events, recommendations, notifications, check-in, schedule and analytics use the SENECApp backend | Nicolas Salazar |
All features
| Feature | Description | Responsible |
|---|---|---|
| Project setup, theme and brand assets | Flutter project, colour palette, typography, app icons and images | Nicolas Salazar |
| Shared widgets | Cards, chips, badges, list tiles used across screens | Daniel Vargas |
| Navigation shell | Bottom navigation with a navigator per tab, system back handling | Jose Fonseca |
| App bootstrap | App state provider, theme and phone frame wiring, asset catalog loading, first widget tests | Jose Fonseca |
| Discover screen (UI) | Search field, category chips, featured carousel | Jose Fonseca |
| My RSOs screen (UI) | Memberships and semester summary | Jose Fonseca |
| Group detail screen (UI) | Cover, stats, about, events, members, join button | Daniel Vargas |
| Profile screen (UI) | Identity card, interests, account settings | Daniel Vargas |
| Notifications screen (UI) | Inbox with "Mark all read" | Daniel Vargas |
| Create RSO form (UI) | Proposal form with category picker and confirmation | Nicolas Salazar |
| Events screen (UI) | Upcoming events with "My RSOs" filter | Nicolas Salazar |
| Sign-in and session | Firebase sign-in, account creation, email verification, session restore, sign-out, profile from the backend | Nicolas Salazar |
| Backend connection | API client with tokens, device and session headers, token refresh and readable errors | Nicolas Salazar |
| Groups, events and notifications from the backend | Real data on every screen, with loading, error and pull-to-refresh states | Nicolas Salazar |
| Explore search and filters | Server-side search (debounced), sort, official only, upcoming events, interests, building | Nicolas Salazar |
| Save and join | Saves and joins sent with where the student came from; join form with optional note | Nicolas Salazar |
| Personalized recommendations | "Recommended for you" carousel with reasons, "See all" list, popular groups as fallback | Nicolas Salazar |
| "Free right now" | Location consent, GPS with fallbacks, free-block banner, suggestions with walking time | Nicolas Salazar |
| Class schedule | Add, edit and remove weekly classes | Nicolas Salazar |
| Event detail | Event page with host, time, place and check-in status | Nicolas Salazar |
| QR check-in | Camera scanner, GPS distance check, typed-code fallback, organizer QR | Nicolas Salazar |
| Analytics | Screen views with load times, errors, join form; offline queue sent in batches | Nicolas Salazar |
| Push notifications | Device registration, tapping a push opens its event or group, in-app banner, swipe to dismiss | Nicolas Salazar |
| Create RSO proposals | Real submission with optional interests; "Pending review" and "Not approved" statuses | Nicolas Salazar |
| Location consent setting | Turn location use on or off from Profile | Nicolas Salazar |
Additional event features (Jose Fonseca)
| Feature | Description | Responsible |
|---|---|---|
| Event search | Case-insensitive local search by title, organization and place, combining search words and sorting by start time. | Jose Fonseca |
| Event date filters | Any date, Today and Next 7 days (today plus six days), using local-day boundaries; date filters exclude cancelled events. | Jose Fonseca |
| Saved events | Save and unsave events persistently on the device, separated by student, with a Saved view in Events. | Jose Fonseca |
| Class conflict warning | Warns in event details when the event overlaps recurring classes from the existing schedule, interpreted in Bogota time; consecutive intervals do not conflict. | Jose Fonseca |
| Copy event details | Copies title, organization, date, time, place, cancellation status and description to the clipboard, with confirmation. | Jose Fonseca |
| Saved-event itinerary | Maximizes the number of complete non-overlapping saved events using earliest-finish selection. Excludes cancelled, already-started and invalid-duration events; does not account for travel time or classes. | Jose Fonseca |
Implementation: PR #11 - features jose, branch feature/Jose, commit c2795f2.
Verification before submission: flutter analyze passed, flutter test passed (118 tests), and git diff --check passed. These features use existing services and required no backend changes.
Leader tools and additional features (Daniel Vargas)
| Requirement | Feature | Description | Responsible |
|---|---|---|---|
| (a) Uses phone sensors | Outdoor mode | The ambient light sensor (read through MainActivity with an EventChannel) turns on stronger contrast, bold and slightly larger text in direct sunlight (QS8). It switches on after 3 s above 10,000 lux and off after 3 s below 3,000 lux, so shadows don't make it flicker. The sensor is only read while the app is open. Profile lets the student choose Auto, On or Off. |
Daniel Vargas |
| (b) Answers type 2 BQs | BQ3 when creating an event | The Create event screen shows group leaders the hours and campus buildings where free-block event suggestions get the most interaction (BQ3). Tapping one fills the start time and building of the form. Served by GET /groups/{id}/insights/audience, which reuses the BQ3 query for group admins. |
Daniel Vargas |
| (c) Context-aware | Leave-time reminder | On an event page, the student turns on a local notification that tells them when to leave. It counts the walk from their GPS position (if the event is within 3 hours and location is allowed) or from the building of their previous class, and waits for a class to end. No reminder if they are in class when the event starts. Planned again every time the app comes back to the foreground. Tapping it opens the event. | Daniel Vargas |
| (d) Smart feature | Suggested event times | "Your members can make it" proposes the 3 weekly times when most members are out of class, weighted by the attendance of the group's past events at that weekday and hour. Leaders only see how many members are free, never anyone's schedule. Served by GET /groups/{id}/insights/best-times. |
Daniel Vargas |
| (e) Authentication | Sign in with Microsoft | "Continue with Microsoft" signs in with the student's Uniandes Microsoft account through Firebase (MicrosoftAuthProvider, Uniandes tenant). Non-Uniandes accounts are rejected, and unverified ones go through the usual verification email. |
Daniel Vargas |
| (f) External services | Group cover photos (Firebase Storage) | Group admins change the cover photo from the camera or gallery. The photo is resized, uploaded to Firebase Storage and its URL saved with PATCH /groups/{id}. Uploaded photos take priority over the bundled art. |
Daniel Vargas |
Group admins see a new "You lead this group" section on the group page with Create event and Change cover photo.
Backend: app/services/insights.py, app/schemas/insights.py and app/api/routes/insights.py, with tests in tests/test_insights.py.
Verification: flutter analyze passed with no issues, flutter test passed (132 tests, including new ones for reminders, outdoor mode and leader tools), and the backend pytest passed (106 tests).
Implementation: PR #12 - feat(leader): leader tools, leave reminders, outdoor mode, Microsoft sign-in and group photos, branch feature/Daniel.
Backend (SENECApp-Backend)
Shared by both apps.
| Feature | Description |
|---|---|
| API and infrastructure | FastAPI app, PostgreSQL with SQLAlchemy and Alembic, Docker Compose, health checks |
| Authentication | Firebase ID-token verification restricted to verified @uniandes.edu.co accounts; dev tokens for local work; student profiles |
| Catalog and seed data | Categories, interests, campus buildings and 24 groups; ~12 weeks of simulated usage for the business questions |
| Groups and Explore | Search with filters, group profiles, saves, joins, group proposals with admin review |
| Events and check-in | Event listing and creation, QR codes for organizers, check-in with window and distance checks |
| Recommendations | Learning group recommender (nightly retraining) and "Free right now" event suggestions |
| Notifications | In-app inbox, open and dismiss, push through Firebase Cloud Messaging |
| Analytics | Client event ingestion, server-side tracking, the 14 business-question queries and the dashboard |
| Re-engagement experiment | Detection of declining groups and the randomized reminders-vs-messages experiment (BQ10) |
| Background jobs | Scheduled jobs for re-engagement and recommender training |
Contributors: Daniel Vergara, Camilo Castilla, Nicolas Salazar, Jose Manuel Fonseca, Daniel Vargas, Luciana Bacci.
Kotlin Frontend (SENECApp-Frontend-Kotlin)
Implemented Features: Camilo Castilla
| Feature | Description | Category | Responsible |
|---|---|---|---|
| Ambient light adaptive contrast | Changes the Discover palette based on the phone’s light sensor. | Sensor | Camilo Castilla |
| BQ3 interaction tracking | Links suggested event opens to recommendation requests so interactions can be analyzed by hour and building. | BQ Type 2 | Camilo Castilla |
| Free-now event suggestions | Suggests events that fit the student’s current free time and class schedule. | Context-aware | Camilo Castilla |
| Personalized group recommendations | Shows ranked groups and explains why each was suggested. | Smart feature | Camilo Castilla |
| Firebase login, session and password recovery | Supports verified university login, session restoration, password recovery and logout. | Authentication | Camilo Castilla |
| Backend organization search | Searches and filters student groups through the backend API. | External service | Camilo Castilla |
Implemented Features: Daniel Vergara
| Feature | Description | Category | Responsible |
|---|---|---|---|
| Shake to refresh event suggestions | Uses the accelerometer to refresh event suggestions when the phone is shaken. | Sensor | Daniel Vergara |
| Search filter and organization-open tracking for BQ12 | Records search filters and organization opens to analyze which filters lead to interactions. | BQ Type 2 | Daniel Vergara |
| Location aware nearby event suggestions | Uses location with consent to suggest nearby events, with a schedule fallback when location is unavailable. | Context-aware | Daniel Vergara |
| On-demand profile group recommendation | Requests a personalized group recommendation from the backend through the Profile screen. | Smart feature | Daniel Vergara |
| Firebase registration and email verification | Creates university accounts and supports verification emails, resend and verification checks. | Authentication | Daniel Vergara |
| Live upcoming events and membership filter | Loads upcoming events from the backend and filters events by the student’s group memberships. | External service | Daniel Vergara |
Implemented Features: Luciana Bacci
| Feature | Description | Category | Responsible |
|---|---|---|---|
| My RSOs from the backend | Shows the groups the student joined and the ones saved from Explore, loaded from the backend. Proposed groups appear with a "Pending review" badge until an administrator approves them. | External service | Luciana Bacci |
| Offline cache for My RSOs | Detects the connection state and, when the request fails, shows the last saved list with a notice that there is no connection. | Context-aware | Luciana Bacci |
| Save groups from Explore (BQ13) | Save and unsave button on the organization detail. It records the save with source=explore, next to the explore views already recorded, so groups can be compared by category. | BQ Type 2 | Luciana Bacci |
| QR and GPS event check-in | Scans the organizer's QR code with the camera and reads one GPS fix. | Sensor | Luciana Bacci |
| Group proposal with inferred interests | While the student types the name and description, the app suggests up to three interests as editable chips. If none are sent, the backend infers them. The proposal stays pending until approved. | Smart feature | Luciana Bacci |