app_state.provider.dart 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. import 'package:hooks_riverpod/hooks_riverpod.dart';
  2. import 'package:immich_mobile/modules/album/providers/album.provider.dart';
  3. import 'package:immich_mobile/modules/album/providers/shared_album.provider.dart';
  4. import 'package:immich_mobile/modules/backup/background_service/background.service.dart';
  5. import 'package:immich_mobile/modules/backup/models/backup_state.model.dart';
  6. import 'package:immich_mobile/modules/backup/providers/backup.provider.dart';
  7. import 'package:immich_mobile/modules/backup/providers/ios_background_settings.provider.dart';
  8. import 'package:immich_mobile/modules/backup/providers/manual_upload.provider.dart';
  9. import 'package:immich_mobile/modules/login/providers/authentication.provider.dart';
  10. import 'package:immich_mobile/modules/memories/providers/memory.provider.dart';
  11. import 'package:immich_mobile/modules/onboarding/providers/gallery_permission.provider.dart';
  12. import 'package:immich_mobile/modules/settings/providers/notification_permission.provider.dart';
  13. import 'package:immich_mobile/shared/providers/asset.provider.dart';
  14. import 'package:immich_mobile/shared/providers/release_info.provider.dart';
  15. import 'package:immich_mobile/shared/providers/server_info.provider.dart';
  16. import 'package:immich_mobile/shared/providers/tab.provider.dart';
  17. import 'package:immich_mobile/shared/providers/websocket.provider.dart';
  18. import 'package:immich_mobile/shared/services/immich_logger.service.dart';
  19. import 'package:permission_handler/permission_handler.dart';
  20. enum AppStateEnum {
  21. active,
  22. inactive,
  23. paused,
  24. resumed,
  25. detached,
  26. hidden,
  27. }
  28. class AppStateNotiifer extends StateNotifier<AppStateEnum> {
  29. final Ref _ref;
  30. bool _wasPaused = false;
  31. AppStateNotiifer(this._ref) : super(AppStateEnum.active);
  32. AppStateEnum getAppState() {
  33. return state;
  34. }
  35. void handleAppResume() {
  36. state = AppStateEnum.resumed;
  37. // no need to resume because app was never really paused
  38. if (!_wasPaused) return;
  39. _wasPaused = false;
  40. final isAuthenticated = _ref.read(authenticationProvider).isAuthenticated;
  41. final permission = _ref.read(galleryPermissionNotifier);
  42. // Needs to be logged in and have gallery permissions
  43. if (isAuthenticated && (permission.isGranted || permission.isLimited)) {
  44. _ref.read(backupProvider.notifier).resumeBackup();
  45. _ref.read(backgroundServiceProvider).resumeServiceIfEnabled();
  46. _ref.read(serverInfoProvider.notifier).getServerVersion();
  47. switch (_ref.read(tabProvider)) {
  48. case TabEnum.home:
  49. _ref.read(assetProvider.notifier).getAllAsset();
  50. _ref.read(assetProvider.notifier).getPartnerAssets();
  51. case TabEnum.search:
  52. // nothing to do
  53. case TabEnum.sharing:
  54. _ref.read(assetProvider.notifier).getPartnerAssets();
  55. _ref.read(sharedAlbumProvider.notifier).getAllSharedAlbums();
  56. case TabEnum.library:
  57. _ref.read(albumProvider.notifier).getAllAlbums();
  58. }
  59. }
  60. _ref.read(websocketProvider.notifier).connect();
  61. _ref.read(releaseInfoProvider.notifier).checkGithubReleaseInfo();
  62. _ref
  63. .read(notificationPermissionProvider.notifier)
  64. .getNotificationPermission();
  65. _ref.read(galleryPermissionNotifier.notifier).getGalleryPermissionStatus();
  66. _ref.read(iOSBackgroundSettingsProvider.notifier).refresh();
  67. _ref.invalidate(memoryFutureProvider);
  68. }
  69. void handleAppInactivity() {
  70. state = AppStateEnum.inactive;
  71. // do not stop/clean up anything on inactivity: issued on every orientation change
  72. }
  73. void handleAppPause() {
  74. state = AppStateEnum.paused;
  75. _wasPaused = true;
  76. // Do not cancel backup if manual upload is in progress
  77. if (_ref.read(backupProvider.notifier).backupProgress !=
  78. BackUpProgressEnum.manualInProgress) {
  79. _ref.read(backupProvider.notifier).cancelBackup();
  80. }
  81. _ref.read(websocketProvider.notifier).disconnect();
  82. ImmichLogger().flush();
  83. }
  84. void handleAppDetached() {
  85. state = AppStateEnum.detached;
  86. // no guarantee this is called at all
  87. _ref.read(manualUploadProvider.notifier).cancelBackup();
  88. }
  89. void handleAppHidden() {
  90. state = AppStateEnum.hidden;
  91. // do not stop/clean up anything on inactivity: issued on every orientation change
  92. }
  93. }
  94. final appStateProvider =
  95. StateNotifierProvider<AppStateNotiifer, AppStateEnum>((ref) {
  96. return AppStateNotiifer(ref);
  97. });