Welcome to the documentation pages of the Conf World of openCX!
- Business modeling
- Requirements
- Architecture and Design
- Implementation
- Test
- Configuration and change management
- Project management
So far, contributions are exclusively made by the initial team, but we hope to open them to the community, in all areas and topics: requirements, technologies, development, experimentation, testing, etc.
Please contact us!
Thank you!
- Bernardo António Magalhães Ferreira
- Diogo Ferreira de Sousa
- Diogo Samuel Gonçalves Fernandes
- Hugo Miguel Monteiro Guimarães
Finding a conference to attend and all its relevant information can be difficult to do in a fast, easy way. Conf World allows you to find the conferences you want that fit right into your schedule.
Have you ever felt that most conference finding apps struggle at keeping up with your tight schedule? That is because they not only have a final rendezvous date, but also many paper submission deadlines. Conf World is a mobile app capable of filtering conferences based upon a time interval and conferences types, allowing the user to completely bypass this issue.
-
Actor. User
-
Description. The user may be more interested in some conferences than others. Thus he is capable of saving conferences.
-
Preconditions. The user is navigating the world map.
-
Postconditions. After saving the conference, it will appear in the map with a yellow pinpoint.
-
Normal Flow.
- The user presses one conference on the map.
- The conference is not saved.
- The user presses the save conference button which appears next to the conference website hyperlink.
- The conference is saved.
-
Alternative Flow.
- The user presses one conference on the map.
- The conference is already saved.
- The user presses the save conference button which appears next to the conference website hyperlink.
- The conference is removed form the saved list.
-
Actor. User
-
Description. This use case exists so that the client can see where conferences are located.
-
Preconditions The client should be in the Main Menu.
-
Postconditions. The app will show the global map with many pinpoints, each one representing one conference.
-
Normal Flow.
- The client presses the Open Map button to open the world map.
- Now the user can search around the world for conferences
- When the user finds the desired conference (marked on the map with a pinpoint), the user can press it and view its information
- The user can click on the conference hyperlink to go to its website.
-
Actor. User
-
Description. The user can filter the conferences in order that only relevant ones appear. The user can filter them using the follow criteria.
-
Preconditions. The user should be in the Filter Conferences menu.
-
Postconditions. After using the filter, only certain conferences around the world will appear.
-
Preconditions. The user should press the button Filter by Type.
-
Normal Flow.
- The user selects the option that shows the conference types.
- On the map, the user will only see the conferences of that type.
-
Preconditions. The user should press the button Filter by Date.
-
Normal Flow.
- The user scrolls the sidebar, selecting the start and deadline date.
- The user selects the button Apply Date Filter.
- On the map, only conferences that occur between these two dates will appear.
- Preconditions. The user should press the button Saved Conferences.
- Normal Flow.
- The user selects the option to only show the saved conferences.
- Only the saved conferences will appear on the map.
-
As a user, I want to open up the map, so that I can see all the available conferences next to me.
User interface mockups.
Menu | Map |
---|---|
Acceptance tests.
Scenario:
Given There is a View Map button
When I tap the View Map button
Then The world map will open
And I will see all conferences represented by pinpoints
Value and effort.
Value: Must Have
Effort: L
Effort Estimation History (from oldest to newest): XL, L
As a user, I want to save a conference I wish to attend, so that I can mark it(save) on the map for easy access.
User interface mockups.
Save |
---|
Acceptance tests.
Scenario:
Given I have selected a conference on the map
And I am Logged In
When I tap the save conference button.
Then The app will save my conference in the cloud
And The conference pinpoint will have another color
Scenario:
Given I have selected a conference on the map
And I am Logged In
When I tap the save conference button
And the conference is already saved
Then The conference will be removed from my saved conference list
And The conference will appear with a regular color
Scenario:
Given I have selected a conference on the map
And I am not Logged In
When I tap the save conference button
Then The app will save my conference locally
And The conference pinpoint will have another color
Scenario:
Given I have selected a conference on the map
And I am not Logged In
When I tap the save conference button
And the conference is already saved
Then The conference will be removed from my saved conference list
And The conference will appear with a regular color
Value and effort.
Value: Should Have
Effort: L
Effort Estimation History (from oldest to newest): M, L
As a user, I want to access a conference’s details, so that I can see the available information about it.
User interface mockups.
Conference Information |
---|
Acceptance tests.
Scenario:
Given I have the conference pinpoint on my screen
When I tap a conference's pinpoint
Then I will be able to see all the information about it
Scenario:
Given I have the conference pinpoint on my screen
When I tap a conference's pinpoint
And I press the conference website URL
Then I will be redirected to the conference's website
Value and effort.
Value: Must Have
Effort: M
Effort Estimation History (from oldest to newest): M
As a user I want to select a timespan, so that I can see all available conferences in that timespan.
User interface mockups.
Filter Date |
---|
Acceptance tests.
Scenario:
Given I am in the Filter Conference Menu
When I tap the Date button
And Enter a timespan
Then The app will show me all conferences that occurr within that timespawn
Value and effort.
Value: Must Have
Effort: L
Effort Estimation History (from oldest to newest): L
As a user, I want to search for conferences that match my interests, so that I can better find what I'm looking for.
User interface mockups.
Filter Conferences | Filter by Type |
---|---|
Acceptance tests.
Scenario:
Given I am on the Filtering Menu
When I tap the Type button
And I select a conference type
Then The world map will only show pinpoints with conferences regarding the selected type
And I will be able to select the conference
Value and effort.
Value: Must Have
Effort: L
Effort Estimation History (from oldest to newest): M, L
As a user, I want to view my previously saved conferences.
User interface mockups.
Main Menu | Filter Conferences |
---|---|
Acceptance tests.
Scenario:
Given I am on the Filtering Menu
When I tap the Saved Conferences button
And I am logged in
Then The world map will only show pinpoints with saved conferences on the cloud
And I will be able to view my saved conferences
Scenario:
Given I am on the Filtering Menu
When I tap the Saved Conferences button
And I am not logged in
Then The world map will only show pinpoints with saved conferences locally
And I will be able to view my saved conferences
Scenario:
Given I am on the Main Menu
When I tap the My Saved Conferences button
And I am logged in
Then It will appear a list with conferences saved on the cloud
Scenario:
Given I am on the Main Menu
When I tap the My Saved Conferences button
And I am not logged in
Then It will appear a list with conferences saved locally
Scenario:
Given I am on the Saved Conferences menu
When I tap one conference
Then I will be redirected to the conference details on the map
Value and effort.
Value: Should Have
Effort: L
Effort Estimation History (from oldest to newest): M, L
Story #7
As a user, I want to log in, so that I can access my saved conferences.
User interface mockups.
Login | Acess saved conferences without login |
---|---|
Acceptance tests.
Scenario:
Given I am in the Main Menu
And I am not Logged In yet.
When I tap the Login button.
And Enter my credentials correctly.
And i press the submit button
Then The app will log me into my account
Scenario:
Given I am in the Main Menu
And I am not Logged In yet.
When I tap the Login button.
And Enter my credentials incorrectly
And I press the submit button
Then The app will ask for my credentials again
Scenario:
Given I am in the Main Menu
And I have no account.
When I tap the Login button.
Then the app will ask for my new credentials.
And i will be logged in.
Value and effort.
Value: Could Have
Effort: M
Effort Estimation History (from oldest to newest): M
The concepts regarding our application are quite simple. Our app consists of conferences spread around the World Map
and the user has filtering tools at his disposal that allow him to find the most fitting conferences. Each Conference
is represented on the world map by a Marker
.
Once the user has opened the Map
, it will render on a certain latitude
and longitude
, have some Markers
, and each represents one Conference
.
Also, the user can just look for specific conferences. In this case, he will apply a Filter
to the world map, but just one filter can be applied for the whole map at a time. The user can see the map without filters, seeing all the available conferences, or instead the user can filter by Date
, by Saved
conferences or by Type
, but just one at a time.
The architeture models of a big project can help newcomers to understand it better.
In order to develop this project, we decided to organize and structure our code using the MVC. The code is divided into three different packages:
- Controller
- View
- Model
The Controller processes the received information from user actions. These actions trigger changes both in the view (for example, changing the current screen displayed) and in the model (for example, when the user saves a conference).
Our View is responsible for the concrete display of the app to the user. It renders our widgets and different pages, like the homepage on the smartphone screen.
The Model contains all the application data. It represents stored entities managed by the controller, such as a Conference.
Our project's physical structure is very simple and relies in only one block. Since all of the app information is stored in a local database, our app will only execute queries to select, update and insert conferences on the SQLite database. We decided to use a local storage instead of a cloud storage because the lost data caused by changing devices is not significant. If the user changes their device, losing the saved conferences would not matter too much.
We chose to use SQLite database due to its simplicity and the good integration with flutter.
For the application prototype, we have created a video traversing through the possible menus and options of our app, triggering the expected app flows related to our User stories when pressing buttons.
At we started developing the app, we did it in a specific logical order, starting by implementing the world map and the conference pinpoints.
Then, we implemented the conference details. Afterwards, we created the main filters (filter by type, date and saved conferences) associated with the newly added details.
As a user, I want to open up the map, so that I can see all the available conferences next to me.
- Added Main Menu
- Added World Map
- Added pinpoints in World Map with conferences. This functionality is currently hard coded.
Sprint Effort: L
As a user, I want to access a conference’s details, so that I can see the available information about it.
- When user presses one conference, the user can see the information about it.
- There is a link that redirects the user to the webpage.
As a user, I want to search for conferences that match my interests, so that I can better find what I'm looking for.
- When a user goes to the filtering menu, he can filter by type.
- After choosing the filtered conference type, only conferences of that ype will appear on map.
- Conferences are now read from a JSON file.
Sprint Effort: L
As a user, I want to save a conference I wish to attend, so that I can mark it(save) on the map for easy access.
- When user presses one conference, the user can save the conference to favorites.
- The conference will now appear yellow on world map.
As a user, I want to view my previously saved conferences.
- When a user goes to the filtering menu, he can filter by saved conferences.
- The user now have a list with all conferences saved.
- Now, when user presses the go back button he is always redirected to the main menu.
- Changed colors of the app!
- Now things are stored in a local database using SQLite.
Sprint Effort: L
As a user I want to select a timespan, so that I can see all available conferences in that timespan.
- The user can select a timespan to search for conferences.
- Conferences are scrapped from the webpage Call 4 Papers
- Implemented Gherkin Acceptance Tests
- Finished Unit Tests
- Changed the theme and created a logo for the app
Sprint Effort: L
To ensure the application is working properly, we have decided to add unit tests and automated acceptance tests using gherkin.
We used the github issues to organize our project. If you want to see our implementation of user stories you can click here and choose the label User Stories
to see the issues that map for every user story.
Unit Tests are used to verify the expected output after the user interacts with the application and have been implemented using the flutter_test
dependency.
Acceptance Tests are used to verify the expected output through statements that we implemented as user stories that describe all of the actions the user must take to permform a task, and the result of those actions. These tests were implemented using Gherkin language, through the flutter_gherkin
dependency.
Both these tests involve a large ammount of work, however, they provide a long-term benefit to the project, making it easier to detect bugs in the future.
Implemented acceptance tests and their respective user story:
- Conference Details - User Story 3
- Filter Conferences By Type - User Story 5
- Open World Map - User Story 1
This acceptance tests where implemented in this pull request.
Implemented Unit Tests:
- See World Map
- See Saved Conferences
- Filter Conferences Button
- Filter Conferences by Type
- Filter Conferences by Date
- Filter Conferences by Saved Conferences
- See World Map Without Filters
- Default Navigation State
- Navigation between States
- Switching to Filter Conferences State
- Switching to Filter Conferences State and back to Home
This unit tests where implemented in this pull request.
There are still many tests that can be tested in the future. The planned features to be tested are the following:
- Saved Conferences local database persistent data storage.
- Pressing a Conference in Saved Conferences Menu redirects to the world map with the chosen conference centered.
We're actually running this tests automatically on github actions. However the pipeline running the gherkin acceptance tests are not running because they need an emulator to have a successfully run.
Configuration and change management are key activities to control change to, and maintain the integrity of, a project’s artifacts (code, models, documents).
For the purpose of ESOF, we will use a very simple approach, just to manage feature requests, bug fixes, and improvements, using GitHub issues and following the GitHub flow.
Also we configured a workflow using github actions to automatically run our unit tests and to build the apk.
Software project management is an art and science of planning and leading software projects, in which software projects are planned, implemented, monitored and controlled.
For this project, we are using Github Projects. You can see our board using the following link:
We feel that our app can integrate the Open-CX in the future, helping everyone finding conferences around the world that can fit in their schedules, combining it with other projects.