Welcome to the documentation pages of the AdOv of openCX!
A Simple and User Friendly App to provide the best possible schedule organization and adaptation to timetable changes
Has it ever happened to you getting to a talk in a conference and finding out it was postponed?
Our app, AdOv, allows you to check the event schedule and it gives the staff the opportunity to change it in case of a setback, sending a notification to every user on the conference. Enjoy the extra minutes of coffee break while still showing up on time to the next session!
Check Agenda
Actor. Attendee
Description. The Attendee can check the conference's agenda
Preconditions and Postconditions. The Attendee needs to go to the agenda page from a Menu
Normal Flow
Alternative flows and exceptions
Check Notifications
Actor. Attendee
Description. The attendee can receive notifications and be updated without opening the app
Preconditions and Postconditions. The attendee only needs to turn on the phone screen to see the notification
Normal Flow
Alternative flows and exceptions
Reschedule Talk
Actor. Conference host
Description. The conference host can send a notification to the attendees when reschedules a talk
Preconditions and Postconditions. The conference host needs to sign in as a staff member and go to the edit talks tab, reschedule the talk, and submit the changes.
Normal Flow
Alternative flows and exceptions
Change Room
Actor. Conference host
Description. The conference host can send a notification to the attendees when the room of a talk is changed
Preconditions and Postconditions. The conference host needs to sign in as a staff member and go to the edit talks tab, make the room change and submit the changes
Normal Flow
Alternative flows and exceptions
List:
Conference
Timetable
Talk
Receive notifications
Send notifications
Sign in
Home page
The high-level logical structure of our code follows the Model-View-Controller Architectural Pattern, also known as the MVC Pattern.
Cloud Firestore
It takes the form of a cloud-based NoSQL database server used for storing and syncing data. It's a high-performance database that supports automatic scaling. Besides, it is quite easy to use and very reliable. One of the unique features is the syncing of data across multiple client apps using realtime listeners, used in our app.
Firebase Cloud Functions
One of our goals is to send a notification when a important event happens, such as adding a new talk to the database, removing a talk, or editing the details of a talk, and as we are using Firestore to store the data the best option would be to implement the Firebase Cloud Functions. Cloud Functions for Firebase is a serverless framework that lets us automatically run back-end code in response to events triggered by Firebase features and HTTPS requests. The code is written in JavaScript and it is stored in Google's could running in a managed environment.
Firebase Cloud Messaging
Changing information on the database triggers the cloud functions, and those functions send a push notification to devices register to a said topic. We register every user on the moment they open the app for the first time to a topic called Talks
. Therefore, whenever a talk is edited, added or removed, every user connected will receive a notification about that event.
We started off by designing the UI on Figma (these UI prototypes can be found on the user stories' issues), then the question was what the best technology to implement our App, Flutter was the unanimous choice in a set of some technologies such as pure Android (Kotlin) and React Native.
Our approach was a bit of "from the inside out", we developed from the Talk Details Screen to the Welcome Screen.
On the early stages of the app we didn't have a database connection, our data was static, so at a point the question was: "What database architecture should we chose?", and the answer was Firebase Firestore, as described in the previous section. Firestore was chosen in a set of options such as internal SQLite Database and Firebase Realtime Database. Manipulating the data was probably the most challenging task, but as it is a popular new technology, there's a lot of guides and community support on the Web, which made the process a bit easier, but still challenging, as we are going to demonstrate a bit on the next section.
On our Home Screen we present a brief of the Conference, information like number of talks, number of days (Conference duration), the next talk, sponsors, and some details about the conference itself. So one thing we wanted is to count the number of talks, and the total number of days. Well, counting the number of talks wasn't so difficult, but counting the number of days was a bit challenging, as we need to return a set of days from all talks. We developed a method to do this in a simple way, here's a snippet:
await collectionReference.get().then((querySnapshot) {
Set<DateTime> days = Set();
querySnapshot.docs.forEach((element) {
days.add(DateTime(
element.data()["year"], element.data()["month"], element.data()["day"],
));
});
conferenceRef.update({"days": days.length});
});
This is performed in the back-end and async from the main app. But the main challenge was to get the next talk. This was a interesting feature, we implemented the schedule to highlight the next talk, and also, the next talk is present as a widget on the Home Screen. The method to get the next talk can be found on Talk.dart called getNextTalk
.
For testing we used the framework flutter_gherkin
to ensure that our application is working as intended it's key aspects.
The features to be tested are the following:
We decided to test this features because they were the ones that have the most amount of user input and are the most error-prone.
This test has 4 possible scenarios:
To verify that the user can enter the app from the Welcome Screen, he can tap anywhere on the screen, except for the login button, to enter the app and go to the Home Screen
After beeing logged in, an administrator can log out by going to the sidebar and pressing the "log out" button
If a user wants to check the schedule, he needs to go to the Home Screen, open the sidebar, select the "schedule" button and the app takes him to the Schedule screen.
For change management we used Feature Branches and Pull Requests linked to Issues. Those Issues were assigned to Milestones, one for each Iteration. This has proven to be very helpful to keep everything organized and the product increment was easier to evaluate based on the Milestones.
For Project Management we used Github Projects, automated with Issues and Pull Requests for on-open and review progress, as we established a minimum of 2 member's review to merge a Pull Request, so we all know what's happening and avoid unawareness. You can find the Issues here.