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