PhotoPulse is a Flutter-based mobile application for iOS and Android, developed specifically for my software engineering master's studies. The project was a key part of two courses: Advanced Mobile Programming, which delved into complex mobile development techniques and emerging technologies, and Advanced Application Development Based on Design Templates, focusing on sophisticated design patterns. Emphasis was placed on adhering to SOLID principles, ensuring that the app's design was robust, maintainable, and scalable. These courses provided deep insights into efficient app development strategies and the practical application of theoretical concepts.
- Login, register, verify email, reset password, log out, delete account, and login without an account.
- Various subscription packages (Free, Pro, Gold) with different features and limits, such as upload size and daily limits.
- Track and change their package once a day.
- Upload/edit posts, each consisting of a photo (from camera or gallery), title, description, hashtags, and location.
- Offers image processing options (resize, format change) during upload.
- Users can browse all uploaded posts.
- Download posts in their original format or with applied filters and modifications.
- Enables users to tag and share the location of their posts.
- Manages app permissions for accessing the camera, gallery, and location services.
- Incorporates map functionality for location-based features.
- Search for posts based on filters like hashtags, size, upload date, author, and location.
- Administrators can modify user profiles and packages, view user actions and statistics, and manage any user's posts.
- All user actions are logged, detailing who performed the operation and when. This is achieved through the use of Firebase Functions, which efficiently track and record user interactions in real-time, ensuring a robust and secure logging system.
- Change username, email, subscription package, password, language, and profile image.
- Architecture: The app follows Clean Architecture principles and integrates with Flutter Riverpod. The data layer manages data retrieval and storage, interfacing with databases and remote servers while maintaining a loose coupling with the domain layer for better organization and maintainability. The domain layer encompasses the business logic and core functionalities, acting as a bridge between the data layer and the presentation layer. Finally, the presentation layer is focused on user interface and interaction, utilizing widgets and other UI components to create an engaging and responsive user experience.
- State Management: Managed with Riverpod.
- Authentication: Implemented using Firebase Auth.
- Remote Database: Cloud Firestore.
- Photo Storage: Firebase Storage.
- Firebase Functions: Utilized for server-side logic, such as action logging, user management tasks, and automating back-end processes. Firebase functions are available on the 'firebase_functions' branch.
- Local Database: Isar.
- Map:
flutter_map
. - Environment Management: Utilizes
flavorizr
for different build environments andenvied
for environment variables. - Navigation: Handled by
go_router
. - UI Enhancements: Contains animations to enrich the user experience.
- Clone the repository.
- Navigate to the project directory.
- Run
flutter pub get
to install dependencies. - Connect with your Firebase project.
- Choose the desired build environment with
flavorizr
. - Run
flutter run
to start the application.