Developer information
Technical Details
The code uses Provider for state-management because it is widely known by Flutter community, doesn't bring any unnecessary complexity to the codebase & is scalable/stable enough.
Most ChangeNotifiers are available as singletons, though de-coupled from each other. This is important to handle things like loading app configuration before runApp, handling background notification button actions & few other asynchronous operations performed outside the widget tree. By having singletons, we are able to avoid a strict dependency on the BuildContext & do certain things in a more performant way.
Current source tree has following files:
lib
│
├───api [API wrapper around Bluecherry DVR server.]
│ └──api.dart
│ └──ptz.dart [API related to Pan-Tilt-Zoom controls]
│
├───l10n [Tranlations]
│
├───models [model classes to serve & bind type-safe data together in various entities.]
│ ├───device.dart
│ ├───event.dart
│ ├───layout.dart
│ └───server.dart
│
├───providers [core business logic of the application.]
│ ├───desktop_view_provider.dart [stores, provides & caches desktop camera layout]
│ ├───downloads_provider.dart [manages events downloading and progress]
│ ├───events_playback_provider.dart [caches data about the events playback view]
│ ├───home_provider.dart [stores, provides & caches data about the home page]
│ ├───mobile_view_provider.dart [stores, provides & caches mobile camera layout etc.]
│ ├───server_provider.dart [stores, provides & caches multiple DVR servers added by the user.]
│ └───settings_provider.dart [stores, provides & caches various in-app configurations & settings.]
│ └───update_provider.dart [manages app updates and app status.]
│
├───utils [constant values, helper functions & theme-related stuff.]
│ ├───constants.dart
│ ├───extensions.dart
│ ├───methods.dart
│ ├───storage.dart
│ ├───theme.dart
│ ├───video_player.dart
│ └───window.dart
│
├───widgets [UI/UX & widgets used to display content.]
│
├───firebase_messaging_background_handler.dart [handles in-app notifications, snoozing, thumbnails etc. & other Firebase related hooks.]
├───firebase_options.dart [auto-generated firebase configuration.]
└───main.dart [entry-point of the application.]
Feel free to send any pull-requests to add any features you wish or fix any bugs you notice.