FEUP-ESOF-2020-21 / open-cx-t4g1-grupo-1

open-cx-t4g1-grupo-1 created by GitHub Classroom
4 stars 1 forks source link

openCX-cx-t4g1-grupo-1 Development Report Flutter CI

Welcome to the documentation pages of the AdOv of openCX!

Team Members


Product Vision

A Simple and User Friendly App to provide the best possible schedule organization and adaptation to timetable changes


Elevator Pitch

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!


Requirements

Use case diagram

Check Agenda

Check Notifications

Reschedule Talk

Change Room

User stories

List:

  1. Conference

  2. Timetable

  3. Talk

  4. Receive notifications

  5. Send notifications

  6. Sign in

  7. Home page

Domain model

domain-model


Architecture and Design

Logical architecture

logical-architecture-diagram

The high-level logical structure of our code follows the Model-View-Controller Architectural Pattern, also known as the MVC Pattern.

Physical architecture

Prototype

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.


Implementation

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.


Test

For testing we used the framework flutter_gherkin to ensure that our application is working as intended it's key aspects.

Testing plan

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.

Test Case Specification

Logging in as an Administrator

This test has 4 possible scenarios:

Entering the app as a User

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

Login out as an Administrator

After beeing logged in, an administrator can log out by going to the sidebar and pressing the "log out" button

Checking the Schedule

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.


Configuration and change management

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.


Project management

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.


Evolution - contributions to open-cx