Sprint 4 ‐ Deliverable - Curi-Grupo24/curi_app GitHub Wiki

Resume

This wiki serves as a central repository for all technical documentation related to the Curi project. Here you'll find detailed information on implemented features, user stories addressed (represented by BQs), collected data, and various technical strategies employed throughout the development process.

The wiki is organized by sprint, providing a clear view of progress made during each development cycle. Additionally, sections dedicated to value proposition, revenue model and micro-optimization strategies offer valuable insights into the project's goals and technical considerations. This collects all the development process of the project through the Mobile Apps Development course.


Value Proposition

These value proposition includes customer-centric thinking, strategic alignment, and innovation, that will, ultimately, contribute to the success and sustainability of our business. These value proposition are also deeply tied to the PAS (Problem, Alternative, Solution), because it identifies the problems, Identify the Customer Needs with the alternative we can understand the existing solution and opportunity to differentiate from the rivals and with the solution we can highlight the unique selling points with that in mind the value proposition model must include the insights we get when we did the PAS for our app:

Value proposal for a student taking a tutorship/ giving a tutorship:

poster Value proposition canvas simple white (2)

Revenue Model

We implemented a payment gateway for which we can have a percentage of each payment, this is already implemented on the app.

Implemented Features

The following section comprenhends the view and explanation of the different features implemented throught each sprint of the course. In it, we will find the general description and app visualization that will help the reader to understand the implementation, and the behaviour, of the features.

List of features

  1. Register account - has error controls on each input and as our user-target are the sstudents at Universidad de Los Andes we only accept studends with uniandes e-mail. And it has implemented internt connection errors.
  2. Login - Has error control on the inputs and control if the username or password are wrong and internet connection error.
  3. Forgot Password Flow - has implemented error for input and sends and e-mail for password recovery and internet connection error management.
  4. Get user info on dashboard: All of them will show the users name as greeting.
  • For new accounts the dashboard will show the option to register classes and enroll as a monitor.
  • For users with classes will show the classes registered by the user and theoption to enroll as a monitor.
  • For users that have classes as tutor and as student will show two different lists of each type of classes registered.
  • For administrator user will show the option to see all the tutors candidatures and the option to register new classes for the app.
  1. Get all the students classes. - Has internet connection error management.
  2. Add new class as student. - Has implemented the error when a student has already register a class, has internet connection error management.
  3. delete classes as student. - Has internet connection error management and error for when a student has already deleted a class.
  4. Filter all available classes by name, semester, type and career which the class is teached. - it is managed by caché so it won't loose info for filtering when it has no internet connection.
  5. Filter all my classes as student by name, semester, type and career which the class is teached. - it is managed by caché so it won't loose info for filtering when it has no internet connection.
  6. Get all the classes available on the app to be able to register to one. Has internet connection failure
  7. Get my tutors classes and if the tutor has not been accepted yet at the moment of selecting a class will show a static page saying they have to wait for acceptance.
  8. Filter classes to be elligible to enroll as a tutor, if a tutor has already registered the class as student it will show a warning of not being able to be a tutor on a class he is already a student.
  9. Enroll as a tutor flow (it is a survey). has internet connection failure management and has an error management for when the user has not completet the whole survey.
  10. Register event to the calendar. - has internet connection failure.
  11. Get the information of a class once the student has selected it (it brings the available tutors for each class) if the class has no tutors available it will show no tutors.
  12. Add a tutor to favorites. it is managed by cache
  13. Get the information of the tutor. it has internet connection failure and if the user already entered the page it has manage by cache for seeing the information once more on a different tutor.
  14. Chat with tutor (functional live chat). - Has internet conenction failure, also, the messages sent are managed by cache so the information sent wont be loose if I have no internet conenction.
  15. Payment Gateway
  16. Notifications of an upcoming tutorship
  17. Change profile Picture by using the camera or the gallery. - manage internet conection failure.
  18. For an Administrator user: Get all the available caandidatures for tutoring. - Has internet conenction failure. Once the list is charged it has manage by cache.
  19. For an Adminisrator user: accept a candidature. has internet connection failure.

Implemented BQs

Business Questions (BQs) play a crucial role in app development. By clearly defining BQs, developers can design solutions that directly address the core business needs. We have outlined various BQs, along with detailed descriptions and visualizations of their implemented solutions.

Question Type Explanation Visualization
Which hour is the most scheduled? 3 We are evaluating the critical time of the day in which the app is being used the most by analyzing the main feature. It let us see the need of scalability
Which filter is the most used for searching for tutors? 3 We are analyzing how useful this feature is in order to improve/modify it so we can improve UX
What is the most scheduled tutorship of the month? 4 With this data we can build information about what students are looking for in a certain period of the semester, so we can identify patterns and take advantage from this info
What is the mean of clicks a person does to enroll as a tutor? 2 To let the person know how long the process to enrol as a tutor is, the App shows how many steps are left till the process completition
Was my class added to my classes list after adding it? 2 Focused on the daily usage of the App, the question let us provide the user appropriate fixes on bugs on the add class feature
was my application as tutor sended after applying as tutor? 2 The validation process takes part away from the users view, the App displays the confirmation of the users application, also if afterwards the user wants to access the class, then he will see a View that warnings he to wait until the moment of acceptance.
Is there any tutor that has rating above 4.0 on the class I want? 2 Each tutor has a rating based on his/her tutorships. When the profile of the tutor is visited, this rating is shared to the viwer TutorRating
What is the percentage of sessions taken that have not presented errors in the last week? 1 We need to be aware of the crashes the App presents, that is the reason we implemented Firebase Crashlytics to visualize the percentaje of sessions that has crashed per week image
Event with the highest number of users who have done it 3 An important part of how the users see our App is the way the main features are being used. We need to understand what are the priorities and what kind of features the clients are using the most to provide a better service out of this events (features) image
What devices is the App running from? 4 Fragmentation is relevant for the App to get into a wide market. We use Firebase Analytics to get this information so we can provide support to a different Android OS versions image
Is there a way to ensure that I wont miss my appointment? 2 Users are the center of the project, we want to ensure they are having the best results with their investments. The App notifies when the meeting is 10 minutes left so the user will not loose it WhatsApp Image 2024-04-26 at 11 53 24 PM
Has the launch of Feature X led to a statistically significant increase in average user session time, potentially indicating improved user engagement? 5 (2/3/4) This single BQ helps evaluate user experience (UX) by gauging engagement with the new feature. Increased session time suggests users are finding it valuable, while a lack of change or decrease might indicate a need for improvement. This information will be used to set agreements with third party companies to get inversionists image

Micro-Optimization Strategies

Optimizing app performance is an ongoing process. This section details the micro-optimization strategies implemented in this project. We'll explore the techniques used to identify performance bottlenecks and improve efficiency. This might include optimizing code for specific use cases, reducing memory usage, or leveraging efficient data structures. The section will showcase the results of these optimizations, highlighting the improvements in performance metrics like speed and resource consumption.

Performance analysis pre micro-optimizations, Profiling tool

In this part we are going to focus on three main scenarios, Authenticate, Profile, and the dashboard.

  1. Authenticate scenario:

In this scenario, we can see that the performance in this flow is pretty good as well as the memory management.

Performance:

image

Memory:

image

  1. Dashboard scenario:

The performance is great even though the amount of images that the device has to render is a lot it keeps everything with a good performance as well as the memory management

Performance: image

image

Memory:

image

  1. Profile scenario.

Performance:

image

Memory:

image

image

Micro-optimization design

Implementation

As we thought from the begginning of the developing of the app to make it as optimized as possible we include on our lintern things that would make our app as light as possible taking into account that flutter has some heavy widgets as Containers we limited the usage of those on the app. Here is the lintern we used on the developing of the app:

With these optimizations we ensure not only that our code follows the clean guidelines we wanted to, but also that our app will be as optimized as possible in calls to functions and on the heaviness of the widgets, each bullet was thought for making optimizations to our app, ensuring the lowest weight and each function call.

We used this optimizations since the very begginning of the developement of the app, so we were ensuring the optimization since the beginning of the proyect.

Eventual Connectivity Strategies

Mobile applications often operate in environments with varying connectivity levels. To ensure a seamless user experience, developers must consider strategies for eventual consistency, where data updates might not be immediately reflected across all devices. This section explores the approaches taken in this project to handle eventual connectivity and maintain data integrity.

We used a way to let the user know when they do not have internet connection and we separate ir in two ways, firstly we implemented an error that returns our firebase auth library, that way it will show a warning message like the one bellow:

https://github.com/Curi-Grupo24/ISIS3510_202410_Team24/assets/53884974/0cc713a9-0a99-45b0-9db3-d820bb77c900

Also, there could be a problem if the user is already logged into the application, so we implemented another warnings in case the user lost their internet connection already logged into the app, it shows an error message as the one bellow:

https://github.com/Curi-Grupo24/ISIS3510_202410_Team24/assets/53884974/00cd85e8-e6a2-43ca-b5d2-45f8cf3b07ca

We added ir to teh petitions we are making to firebase, that way it would not let to a dead state.

Local Storage Strategies

Local storage provides a mechanism for apps to persist data on the user's device. This section details the strategies employed in this project to leverage local storage for functionalities like caching frequently accessed data or maintaining user preferences even when offline. We'll explore the choices made regarding data types suitable for local storage and how these strategies enhance the app's performance and usability.

As there is some information we do not require to get to our DB, we thought we could save the information of the tutors a user decided to save to therir favoutites, so that way we are saving space in our DB's that does not give the organization that much of value because we already have the ratings of a user. Formaking this real we implemented a library that helps us to get access to the local storage of the device, it is called Share-Preferences, we know it is not a library that gives us encrypted or secure local storage and that the other apps we have on the device could access the information we store in there, but, as we are saving non-personal information there is no risky vulnerability in it. Furthermore, if we consider we could save more information, but, more sensitive information we could use Secure Storage, that gives us the opportunity of scape vulnerabilities for sensitive information.

Here is the visibility we implemented on the app for when we add a Tutor to our favs list on our local Storage:

https://github.com/Curi-Grupo24/ISIS3510_202410_Team24/assets/53884974/1a0627ca-de66-483c-818e-d69017e04787

We implemented it by using the following method using shared preferences:

Multi-threading Strategies

To achieve responsiveness and efficient background processing, this section explores the async programming techniques used in the Flutter project. We'll delve into how the app utilizes asynchronous methods to handle long-running or CPU-intensive tasks without hindering the user interface's fluidity. We'll also discuss any mechanisms used to manage concurrency and ensure data consistency when multiple asynchronous operations access shared resources.

The application uses concurrency to avoid blocking the main thread, as Flutter works as mono-Thread. This is implemented in the repositories implementation by using Future-async functions. This way, the application can complete other work while it waits for the results of this function. We use this type of functions on every repository implementation. This is an example of the way we used it:

We are using a total of 83 Future-async functions on our app in 45 different files. We did use the most Future funtions as Future<Either<dynamic, dynamic>> that helped us to receive one of two states, either Successfull state being Right, or an error state being left, an example of the usage we did is bellow:

In this example of the Forgot your password flow we are returning a Successfull State with a String in case we could send the e-mail of confirmation of changing the password or a state of Error with it's corresponding String that will later show to the user.

https://github.com/Curi-Grupo24/ISIS3510_202410_Team24/assets/53884974/e19ed1d7-8a64-4b7b-a6c7-83d90bfc7f58

Also, for making this usage of multi-threading we implemented a multi-bloc usage on the Home-Dashboard, that way we could see how the app is rendering loading each functionality separately:

https://github.com/Curi-Grupo24/ISIS3510_202410_Team24/assets/53884974/fdc77b7a-3570-4d9e-86d7-902bcd011ad0

Caching Strategies

To optimize performance and minimize network traffic, this section explores the caching strategies employed. We'll delve into the techniques used to store frequently accessed data locally, potentially leveraging caching libraries or frameworks. We'll discuss the chosen caching policies, such as least recently used (LRU) or time-based expiration, to determine which data is cached and for how long. Additionally, we'll explore the mechanisms used to invalidate cached data to ensure it remains current.

As we decided to implement BLoC on our solution, it gives us a state manager that leaves some information on caché so that the information we need to store on caché and having it first handed is available and easy to manage, this is thanks to the States we manage on each bloc, also there is a Flutter Native usage of states on StatefullWidgets were the state we are in that widget is stored on cache.

This is the way we use the states on BLoC:

In this example we are emiting states that since they don't change they are going to be stored on caché, having that information stored there is so usefull, for example in the view of searching for a new class, or filtering them.


Ethics video

Here is the link to the ethics video: LINK TO VIDEO