1
0
mirror of https://github.com/immich-app/immich.git synced 2024-12-25 10:43:13 +02:00

chore(mobile): Bump to Flutter 3.13 (#3767)

* Bump to Flutter 3.13.0

* Updates permission status

* Adds hidden to app livecycle state

* Updates and switches to WakelockPlus

* bump flutter version github action

* mobile test version

* fix format

* video player

* video uri

* ios test

* Update android target sdk requirement to PlayStore

---------

Co-authored-by: Alex Tran <Alex.Tran@conductix.com>
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
This commit is contained in:
martyfuhry 2023-08-18 18:52:40 -04:00 committed by GitHub
parent 98b72fdb9b
commit 6243bce46c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
57 changed files with 350 additions and 309 deletions

View File

@ -45,7 +45,7 @@ jobs:
uses: subosito/flutter-action@v2 uses: subosito/flutter-action@v2
with: with:
channel: "stable" channel: "stable"
flutter-version: "3.10.5" flutter-version: "3.13.0"
cache: true cache: true
- name: Create the Keystore - name: Create the Keystore

View File

@ -23,7 +23,7 @@ jobs:
uses: subosito/flutter-action@v2 uses: subosito/flutter-action@v2
with: with:
channel: "stable" channel: "stable"
flutter-version: "3.10.5" flutter-version: "3.13.0"
- name: Install dependencies - name: Install dependencies
run: dart pub get run: dart pub get

View File

@ -149,7 +149,7 @@ jobs:
uses: subosito/flutter-action@v2 uses: subosito/flutter-action@v2
with: with:
channel: "stable" channel: "stable"
flutter-version: "3.10.5" flutter-version: "3.13.0"
- name: Run tests - name: Run tests
working-directory: ./mobile working-directory: ./mobile
run: flutter test -j 1 run: flutter test -j 1

View File

@ -1,4 +1,4 @@
{ {
"flutterSdkVersion": "3.10.5", "flutterSdkVersion": "3.13.0",
"flavors": {} "flavors": {}
} }

View File

@ -52,7 +52,7 @@ android {
defaultConfig { defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId "app.alextran.immich" applicationId "app.alextran.immich"
minSdkVersion 23 minSdkVersion 26
targetSdkVersion 33 targetSdkVersion 33
versionCode flutterVersionCode.toInteger() versionCode flutterVersionCode.toInteger()
versionName flutterVersionName versionName flutterVersionName

View File

@ -56,7 +56,7 @@
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_MEDIA_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_MEDIA_LOCATION" />
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" /> <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />

View File

@ -33,7 +33,7 @@ PODS:
- FlutterMacOS - FlutterMacOS
- path_provider_ios (0.0.1): - path_provider_ios (0.0.1):
- Flutter - Flutter
- permission_handler_apple (9.0.4): - permission_handler_apple (9.1.1):
- Flutter - Flutter
- photo_manager (2.0.0): - photo_manager (2.0.0):
- Flutter - Flutter
@ -53,7 +53,7 @@ PODS:
- Flutter - Flutter
- video_player_avfoundation (0.0.1): - video_player_avfoundation (0.0.1):
- Flutter - Flutter
- wakelock (0.0.1): - wakelock_plus (0.0.1):
- Flutter - Flutter
DEPENDENCIES: DEPENDENCIES:
@ -78,7 +78,7 @@ DEPENDENCIES:
- sqflite (from `.symlinks/plugins/sqflite/ios`) - sqflite (from `.symlinks/plugins/sqflite/ios`)
- url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`) - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`)
- video_player_avfoundation (from `.symlinks/plugins/video_player_avfoundation/ios`) - video_player_avfoundation (from `.symlinks/plugins/video_player_avfoundation/ios`)
- wakelock (from `.symlinks/plugins/wakelock/ios`) - wakelock_plus (from `.symlinks/plugins/wakelock_plus/ios`)
SPEC REPOS: SPEC REPOS:
trunk: trunk:
@ -130,8 +130,8 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/url_launcher_ios/ios" :path: ".symlinks/plugins/url_launcher_ios/ios"
video_player_avfoundation: video_player_avfoundation:
:path: ".symlinks/plugins/video_player_avfoundation/ios" :path: ".symlinks/plugins/video_player_avfoundation/ios"
wakelock: wakelock_plus:
:path: ".symlinks/plugins/wakelock/ios" :path: ".symlinks/plugins/wakelock_plus/ios"
SPEC CHECKSUMS: SPEC CHECKSUMS:
connectivity_plus: 07c49e96d7fc92bc9920617b83238c4d178b446a connectivity_plus: 07c49e96d7fc92bc9920617b83238c4d178b446a
@ -141,26 +141,26 @@ SPEC CHECKSUMS:
flutter_native_splash: 52501b97d1c0a5f898d687f1646226c1f93c56ef flutter_native_splash: 52501b97d1c0a5f898d687f1646226c1f93c56ef
flutter_udid: 0848809dbed4c055175747ae6a45a8b4f6771e1c flutter_udid: 0848809dbed4c055175747ae6a45a8b4f6771e1c
flutter_web_auth: c25208760459cec375a3c39f6a8759165ca0fa4d flutter_web_auth: c25208760459cec375a3c39f6a8759165ca0fa4d
fluttertoast: eb263d302cc92e04176c053d2385237e9f43fad0 fluttertoast: fafc4fa4d01a6a9e4f772ecd190ffa525e9e2d9c
FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a
image_picker_ios: 4a8aadfbb6dc30ad5141a2ce3832af9214a705b5 image_picker_ios: 4a8aadfbb6dc30ad5141a2ce3832af9214a705b5
integration_test: 13825b8a9334a850581300559b8839134b124670 integration_test: 13825b8a9334a850581300559b8839134b124670
isar_flutter_libs: b69f437aeab9c521821c3f376198c4371fa21073 isar_flutter_libs: b69f437aeab9c521821c3f376198c4371fa21073
package_info_plus: 6c92f08e1f853dc01228d6f553146438dafcd14e package_info_plus: fd030dabf36271f146f1f3beacd48f564b0f17f7
path_provider_foundation: eaf5b3e458fc0e5fbb9940fb09980e853fe058b8 path_provider_foundation: 29f094ae23ebbca9d3d0cec13889cd9060c0e943
path_provider_ios: 14f3d2fd28c4fdb42f44e0f751d12861c43cee02 path_provider_ios: 14f3d2fd28c4fdb42f44e0f751d12861c43cee02
permission_handler_apple: 44366e37eaf29454a1e7b1b7d736c2cceaeb17ce permission_handler_apple: e76247795d700c14ea09e3a2d8855d41ee80a2e6
photo_manager: 4f6810b7dfc4feb03b461ac1a70dacf91fba7604 photo_manager: 4f6810b7dfc4feb03b461ac1a70dacf91fba7604
ReachabilitySwift: 985039c6f7b23a1da463388634119492ff86c825 ReachabilitySwift: 985039c6f7b23a1da463388634119492ff86c825
SAMKeychain: 483e1c9f32984d50ca961e26818a534283b4cd5c SAMKeychain: 483e1c9f32984d50ca961e26818a534283b4cd5c
share_plus: 056a1e8ac890df3e33cb503afffaf1e9b4fbae68 share_plus: 599aa54e4ea31d4b4c0e9c911bcc26c55e791028
shared_preferences_foundation: e2dae3258e06f44cc55f49d42024fd8dd03c590c shared_preferences_foundation: 5b919d13b803cadd15ed2dc053125c68730e5126
sqflite: 31f7eba61e3074736dff8807a9b41581e4f7f15a sqflite: 31f7eba61e3074736dff8807a9b41581e4f7f15a
Toast: 91b396c56ee72a5790816f40d3a94dd357abc196 Toast: 91b396c56ee72a5790816f40d3a94dd357abc196
url_launcher_ios: 08a3dfac5fb39e8759aeb0abbd5d9480f30fc8b4 url_launcher_ios: 08a3dfac5fb39e8759aeb0abbd5d9480f30fc8b4
video_player_avfoundation: 81e49bb3d9fb63dccf9fa0f6d877dc3ddbeac126 video_player_avfoundation: 81e49bb3d9fb63dccf9fa0f6d877dc3ddbeac126
wakelock: d0fc7c864128eac40eba1617cb5264d9c940b46f wakelock_plus: 8b09852c8876491e4b6d179e17dfe2a0b5f60d47
PODFILE CHECKSUM: 599d8aeb73728400c15364e734525722250a5382 PODFILE CHECKSUM: 599d8aeb73728400c15364e734525722250a5382
COCOAPODS: 1.12.1 COCOAPODS: 1.11.3

View File

@ -171,7 +171,7 @@
97C146E61CF9000F007C117D /* Project object */ = { 97C146E61CF9000F007C117D /* Project object */ = {
isa = PBXProject; isa = PBXProject;
attributes = { attributes = {
LastUpgradeCheck = 1300; LastUpgradeCheck = 1430;
ORGANIZATIONNAME = ""; ORGANIZATIONNAME = "";
TargetAttributes = { TargetAttributes = {
97C146ED1CF9000F007C117D = { 97C146ED1CF9000F007C117D = {

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "1300" LastUpgradeVersion = "1430"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"

View File

@ -139,6 +139,10 @@ class ImmichAppState extends ConsumerState<ImmichApp>
debugPrint("[APP STATE] detached"); debugPrint("[APP STATE] detached");
ref.read(appStateProvider.notifier).handleAppDetached(); ref.read(appStateProvider.notifier).handleAppDetached();
break; break;
case AppLifecycleState.hidden:
debugPrint("[APP STATE] hidden");
ref.read(appStateProvider.notifier).handleAppHidden();
break;
} }
} }

View File

@ -49,7 +49,7 @@ class AlbumThumbnailListTile extends StatelessWidget {
type: ThumbnailFormat.JPEG, type: ThumbnailFormat.JPEG,
), ),
httpHeaders: { httpHeaders: {
"Authorization": "Bearer ${Store.get(StoreKey.accessToken)}" "Authorization": "Bearer ${Store.get(StoreKey.accessToken)}",
}, },
cacheKey: getAlbumThumbNailCacheKey(album, type: ThumbnailFormat.JPEG), cacheKey: getAlbumThumbNailCacheKey(album, type: ThumbnailFormat.JPEG),
errorWidget: (context, url, error) => errorWidget: (context, url, error) =>
@ -105,9 +105,9 @@ class AlbumThumbnailListTile extends StatelessWidget {
style: TextStyle( style: TextStyle(
fontSize: 12, fontSize: 12,
), ),
).tr() ).tr(),
], ],
) ),
], ],
), ),
), ),

View File

@ -250,7 +250,7 @@ class AlbumViewerAppbar extends HookConsumerWidget
if (selected.isEmpty && if (selected.isEmpty &&
onAddPhotos != null && onAddPhotos != null &&
userId == album.ownerId) userId == album.ownerId)
...ownerActions ...ownerActions,
], ],
), ),
), ),

View File

@ -60,7 +60,7 @@ class LibraryPage extends HookConsumerWidget {
Widget buildSortButton() { Widget buildSortButton() {
final options = [ final options = [
"library_page_sort_created".tr(), "library_page_sort_created".tr(),
"library_page_sort_title".tr() "library_page_sort_title".tr(),
]; ];
return PopupMenuButton( return PopupMenuButton(
@ -87,7 +87,7 @@ class LibraryPage extends HookConsumerWidget {
color: selected ? Theme.of(context).primaryColor : null, color: selected ? Theme.of(context).primaryColor : null,
fontSize: 12.0, fontSize: 12.0,
), ),
) ),
], ],
), ),
); );

View File

@ -102,7 +102,7 @@ class SelectAdditionalUserForSharingPage extends HookConsumerWidget {
} else { } else {
sharedUsersList.value = { sharedUsersList.value = {
...sharedUsersList.value, ...sharedUsersList.value,
users[index] users[index],
}; };
} }
}, },
@ -135,7 +135,7 @@ class SelectAdditionalUserForSharingPage extends HookConsumerWidget {
"share_add", "share_add",
style: TextStyle(fontSize: 14, fontWeight: FontWeight.bold), style: TextStyle(fontSize: 14, fontWeight: FontWeight.bold),
).tr(), ).tr(),
) ),
], ],
), ),
body: suggestedShareUsers.when( body: suggestedShareUsers.when(

View File

@ -123,7 +123,7 @@ class SelectUserForSharingPage extends HookConsumerWidget {
} else { } else {
sharedUsersList.value = { sharedUsersList.value = {
...sharedUsersList.value, ...sharedUsersList.value,
users[index] users[index],
}; };
} }
}, },
@ -163,7 +163,7 @@ class SelectUserForSharingPage extends HookConsumerWidget {
// color: Theme.of(context).primaryColor, // color: Theme.of(context).primaryColor,
), ),
).tr(), ).tr(),
) ),
], ],
), ),
body: suggestedShareUsers.when( body: suggestedShareUsers.when(

View File

@ -160,7 +160,7 @@ class SharingPage extends HookConsumerWidget {
maxLines: 1, maxLines: 1,
).tr(), ).tr(),
), ),
) ),
], ],
), ),
); );

View File

@ -91,7 +91,7 @@ class ArchivePage extends HookConsumerWidget {
selectionEnabledHook.value = false; selectionEnabledHook.value = false;
} }
}, },
) ),
], ],
), ),
), ),
@ -124,7 +124,7 @@ class ArchivePage extends HookConsumerWidget {
), ),
if (selectionEnabledHook.value) buildBottomBar(), if (selectionEnabledHook.value) buildBottomBar(),
if (processing.value) if (processing.value)
const Center(child: ImmichLoadingIndicator()) const Center(child: ImmichLoadingIndicator()),
], ],
), ),
), ),

View File

@ -199,7 +199,7 @@ class ExifBottomSheet extends HookConsumerWidget {
Text( Text(
"${exifInfo!.latitude!.toStringAsFixed(4)}, ${exifInfo.longitude!.toStringAsFixed(4)}", "${exifInfo!.latitude!.toStringAsFixed(4)}, ${exifInfo.longitude!.toStringAsFixed(4)}",
style: const TextStyle(fontSize: 12), style: const TextStyle(fontSize: 12),
) ),
], ],
), ),
], ],

View File

@ -128,7 +128,7 @@ class TopControlAppBar extends HookConsumerWidget {
if (asset.isLocal && !asset.isRemote) buildUploadButton(), if (asset.isLocal && !asset.isRemote) buildUploadButton(),
if (asset.isRemote && !asset.isLocal) buildDownloadButton(), if (asset.isRemote && !asset.isLocal) buildDownloadButton(),
if (asset.isRemote) buildAddToAlbumButtom(), if (asset.isRemote) buildAddToAlbumButtom(),
buildMoreInfoButton() buildMoreInfoButton(),
], ],
); );
} }

View File

@ -11,7 +11,7 @@ import 'package:immich_mobile/shared/models/store.dart';
import 'package:immich_mobile/shared/ui/immich_loading_indicator.dart'; import 'package:immich_mobile/shared/ui/immich_loading_indicator.dart';
import 'package:photo_manager/photo_manager.dart'; import 'package:photo_manager/photo_manager.dart';
import 'package:video_player/video_player.dart'; import 'package:video_player/video_player.dart';
import 'package:wakelock/wakelock.dart'; import 'package:wakelock_plus/wakelock_plus.dart';
// ignore: must_be_immutable // ignore: must_be_immutable
class VideoViewerPage extends HookConsumerWidget { class VideoViewerPage extends HookConsumerWidget {
@ -136,16 +136,16 @@ class _VideoPlayerState extends State<VideoPlayer> {
videoPlayerController.addListener(() { videoPlayerController.addListener(() {
if (videoPlayerController.value.isInitialized) { if (videoPlayerController.value.isInitialized) {
if (videoPlayerController.value.isPlaying) { if (videoPlayerController.value.isPlaying) {
Wakelock.enable(); WakelockPlus.enable();
widget.onPlaying?.call(); widget.onPlaying?.call();
} else if (!videoPlayerController.value.isPlaying) { } else if (!videoPlayerController.value.isPlaying) {
Wakelock.disable(); WakelockPlus.disable();
widget.onPaused?.call(); widget.onPaused?.call();
} }
if (videoPlayerController.value.position == if (videoPlayerController.value.position ==
videoPlayerController.value.duration) { videoPlayerController.value.duration) {
Wakelock.disable(); WakelockPlus.disable();
widget.onVideoEnded(); widget.onVideoEnded();
} }
} }
@ -155,8 +155,8 @@ class _VideoPlayerState extends State<VideoPlayer> {
Future<void> initializePlayer() async { Future<void> initializePlayer() async {
try { try {
videoPlayerController = widget.file == null videoPlayerController = widget.file == null
? VideoPlayerController.network( ? VideoPlayerController.networkUrl(
widget.url!, Uri.parse(widget.url!),
httpHeaders: {"Authorization": "Bearer ${widget.jwtToken}"}, httpHeaders: {"Authorization": "Bearer ${widget.jwtToken}"},
) )
: VideoPlayerController.file(widget.file!); : VideoPlayerController.file(widget.file!);
@ -210,8 +210,7 @@ class _VideoPlayerState extends State<VideoPlayer> {
child: Center( child: Center(
child: Stack( child: Stack(
children: [ children: [
if (widget.placeholder != null) if (widget.placeholder != null) widget.placeholder!,
widget.placeholder!,
const Center( const Center(
child: ImmichLoadingIndicator(), child: ImmichLoadingIndicator(),
), ),

View File

@ -90,7 +90,7 @@ class BackgroundService {
requireUnmetered, requireUnmetered,
requireCharging, requireCharging,
triggerUpdateDelay, triggerUpdateDelay,
triggerMaxDelay triggerMaxDelay,
], ],
); );
return ok; return ok;

View File

@ -511,7 +511,7 @@ class BackupNotifier extends StateNotifier<BackUpState> {
state = state.copyWith( state = state.copyWith(
selectedAlbumsBackupAssetsIds: { selectedAlbumsBackupAssetsIds: {
...state.selectedAlbumsBackupAssetsIds, ...state.selectedAlbumsBackupAssetsIds,
deviceAssetId deviceAssetId,
}, },
allAssetsInDatabase: [...state.allAssetsInDatabase, deviceAssetId], allAssetsInDatabase: [...state.allAssetsInDatabase, deviceAssetId],
); );

View File

@ -174,7 +174,7 @@ class AlbumInfoCard extends HookConsumerWidget {
bottom: 10, bottom: 10,
right: 25, right: 25,
child: buildSelectedTextBox(), child: buildSelectedTextBox(),
) ),
], ],
), ),
), ),
@ -218,7 +218,7 @@ class AlbumInfoCard extends HookConsumerWidget {
}), }),
future: albumInfo.assetCount, future: albumInfo.assetCount,
), ),
) ),
], ],
), ),
), ),

View File

@ -212,7 +212,7 @@ class CurrentUploadingAssetInfoBox extends HookConsumerWidget {
Text( Text(
" ${uploadProgress.toStringAsFixed(0)}%", " ${uploadProgress.toStringAsFixed(0)}%",
style: const TextStyle(fontSize: 12), style: const TextStyle(fontSize: 12),
) ),
], ],
), ),
), ),

View File

@ -247,7 +247,7 @@ class BackupAlbumSelectionPage extends HookConsumerWidget {
child: Wrap( child: Wrap(
children: [ children: [
...buildSelectedAlbumNameChip(), ...buildSelectedAlbumNameChip(),
...buildExcludedAlbumNameChip() ...buildExcludedAlbumNameChip(),
], ],
), ),
), ),
@ -301,7 +301,7 @@ class BackupAlbumSelectionPage extends HookConsumerWidget {
.watch(backupProvider) .watch(backupProvider)
.availableAlbums .availableAlbums
.length .length
.toString() .toString(),
], ],
), ),
style: const TextStyle( style: const TextStyle(

View File

@ -26,7 +26,7 @@ import 'package:immich_mobile/shared/ui/confirm_dialog.dart';
import 'package:immich_mobile/shared/ui/immich_toast.dart'; import 'package:immich_mobile/shared/ui/immich_toast.dart';
import 'package:permission_handler/permission_handler.dart'; import 'package:permission_handler/permission_handler.dart';
import 'package:url_launcher/url_launcher.dart'; import 'package:url_launcher/url_launcher.dart';
import 'package:wakelock/wakelock.dart'; import 'package:wakelock_plus/wakelock_plus.dart';
class BackupControllerPage extends HookConsumerWidget { class BackupControllerPage extends HookConsumerWidget {
const BackupControllerPage({Key? key}) : super(key: key); const BackupControllerPage({Key? key}) : super(key: key);
@ -114,7 +114,7 @@ class BackupControllerPage extends HookConsumerWidget {
); );
return; return;
} }
Wakelock.enable(); WakelockPlus.enable();
const limit = 100; const limit = 100;
final toDelete = await ref final toDelete = await ref
.read(backupVerificationServiceProvider) .read(backupVerificationServiceProvider)
@ -140,7 +140,7 @@ class BackupControllerPage extends HookConsumerWidget {
); );
} }
} finally { } finally {
Wakelock.disable(); WakelockPlus.disable();
checkInProgress.value = false; checkInProgress.value = false;
} }
} }
@ -202,7 +202,7 @@ class BackupControllerPage extends HookConsumerWidget {
child: const Text('backup_controller_page_storage_format').tr( child: const Text('backup_controller_page_storage_format').tr(
args: [ args: [
backupState.serverInfo.diskUse, backupState.serverInfo.diskUse,
backupState.serverInfo.diskSize backupState.serverInfo.diskSize,
], ],
), ),
), ),
@ -256,7 +256,7 @@ class BackupControllerPage extends HookConsumerWidget {
), ),
), ),
), ),
) ),
], ],
), ),
), ),
@ -624,7 +624,7 @@ class BackupControllerPage extends HookConsumerWidget {
style: TextStyle(fontSize: 12), style: TextStyle(fontSize: 12),
).tr(), ).tr(),
buildSelectedAlbumName(), buildSelectedAlbumName(),
buildExcludedAlbumName() buildExcludedAlbumName(),
], ],
), ),
), ),
@ -776,7 +776,7 @@ class BackupControllerPage extends HookConsumerWidget {
const Divider(), const Divider(),
const CurrentUploadingAssetInfoBox(), const CurrentUploadingAssetInfoBox(),
if (!hasExclusiveAccess) buildBackgroundBackupInfo(), if (!hasExclusiveAccess) buildBackgroundBackupInfo(),
buildBackupButton() buildBackupButton(),
], ],
), ),
), ),

View File

@ -129,7 +129,7 @@ class FailedBackupStatusPage extends HookConsumerWidget {
], ],
), ),
), ),
) ),
], ],
), ),
), ),

View File

@ -83,7 +83,7 @@ class FavoritesPage extends HookConsumerWidget {
style: TextStyle(fontSize: 14), style: TextStyle(fontSize: 14),
), ),
onTap: processing.value ? null : unfavorite, onTap: processing.value ? null : unfavorite,
) ),
], ],
), ),
), ),
@ -108,7 +108,7 @@ class FavoritesPage extends HookConsumerWidget {
selectionActive: selectionEnabledHook.value, selectionActive: selectionEnabledHook.value,
listener: selectionListener, listener: selectionListener,
), ),
if (selectionEnabledHook.value) buildBottomBar() if (selectionEnabledHook.value) buildBottomBar(),
], ],
), ),
), ),

View File

@ -57,7 +57,7 @@ class GroupDividerTitle extends ConsumerWidget {
Icons.check_circle_outline_rounded, Icons.check_circle_outline_rounded,
color: Colors.grey, color: Colors.grey,
), ),
) ),
], ],
), ),
); );

View File

@ -89,7 +89,7 @@ class ImmichAssetGrid extends HookConsumerWidget {
perRow.value = 7 - scaleFactor.value.toInt(); perRow.value = 7 - scaleFactor.value.toInt();
} }
}; };
}) }),
}, },
child: ImmichAssetGridView( child: ImmichAssetGridView(
onRefresh: onRefresh, onRefresh: onRefresh,

View File

@ -225,7 +225,7 @@ class ImmichAssetGridViewState extends State<ImmichAssetGridView> {
right: i + 1 == num ? 0.0 : widget.margin, right: i + 1 == num ? 0.0 : widget.margin,
), ),
color: Colors.grey, color: Colors.grey,
) ),
], ],
); );
} }

View File

@ -155,7 +155,7 @@ class ControlBottomAppBar extends ConsumerWidget {
if (hasRemote) if (hasRemote)
const SliverToBoxAdapter( const SliverToBoxAdapter(
child: SizedBox(height: 200), child: SizedBox(height: 200),
) ),
], ],
), ),
); );

View File

@ -108,7 +108,7 @@ class ProfileDrawer extends HookConsumerWidget {
buildSignOutButton(), buildSignOutButton(),
], ],
), ),
const ServerInfoBox() const ServerInfoBox(),
], ],
), ),
); );

View File

@ -156,7 +156,7 @@ class ProfileDrawerHeader extends HookConsumerWidget {
Text( Text(
authState.userEmail, authState.userEmail,
style: Theme.of(context).textTheme.labelMedium, style: Theme.of(context).textTheme.labelMedium,
) ),
], ],
), ),
); );

View File

@ -221,7 +221,7 @@ class HomePage extends HookConsumerWidget {
namedArgs: { namedArgs: {
"album": album.name, "album": album.name,
"added": result.successfullyAdded.toString(), "added": result.successfullyAdded.toString(),
"failed": result.alreadyInAlbum.length.toString() "failed": result.alreadyInAlbum.length.toString(),
}, },
), ),
); );
@ -323,7 +323,7 @@ class HomePage extends HookConsumerWidget {
).tr(), ).tr(),
), ),
), ),
) ),
], ],
), ),
); );
@ -365,7 +365,7 @@ class HomePage extends HookConsumerWidget {
enabled: !processing.value, enabled: !processing.value,
selectionAssetState: selectionAssetState.value, selectionAssetState: selectionAssetState.value,
), ),
if (processing.value) const Center(child: ImmichLoadingIndicator()) if (processing.value) const Center(child: ImmichLoadingIndicator()),
], ],
), ),
); );

View File

@ -94,7 +94,7 @@ class ChangePasswordForm extends HookConsumerWidget {
), ),
], ],
), ),
) ),
], ],
), ),
), ),

View File

@ -110,7 +110,7 @@ class MemoryCard extends HookConsumerWidget {
left: 18.0, left: 18.0,
bottom: 18.0, bottom: 18.0,
child: buildTitle(), child: buildTitle(),
) ),
], ],
), ),
); );

View File

@ -153,6 +153,7 @@ class PermissionOnboardingPage extends HookConsumerWidget {
child = buildRequestPermission(); child = buildRequestPermission();
break; break;
case PermissionStatus.granted: case PermissionStatus.granted:
case PermissionStatus.provisional:
child = buildPermissionGranted(); child = buildPermissionGranted();
break; break;
case PermissionStatus.restricted: case PermissionStatus.restricted:
@ -183,7 +184,7 @@ class PermissionOnboardingPage extends HookConsumerWidget {
), ),
TextButton( TextButton(
child: const Text('permission_onboarding_log_out').tr(), child: const Text('permission_onboarding_log_out').tr(),
onPressed: () { onPressed: () {
ref.read(authenticationProvider.notifier).logout(); ref.read(authenticationProvider.notifier).logout();
AutoRouter.of(context).replace( AutoRouter.of(context).replace(
const LoginRoute(), const LoginRoute(),

View File

@ -44,7 +44,7 @@ class PartnerPage extends HookConsumerWidget {
Text("${u.firstName} ${u.lastName}"), Text("${u.firstName} ${u.lastName}"),
], ],
), ),
) ),
], ],
); );
}, },
@ -151,7 +151,7 @@ class PartnerPage extends HookConsumerWidget {
availableUsers.whenOrNull(data: (data) => addNewUsersHandler), availableUsers.whenOrNull(data: (data) => addNewUsersHandler),
icon: const Icon(Icons.person_add), icon: const Icon(Icons.person_add),
tooltip: "partner_page_add_partner".tr(), tooltip: "partner_page_add_partner".tr(),
) ),
], ],
), ),
body: buildUserList(partners), body: buildUserList(partners),

View File

@ -50,7 +50,7 @@ class CuratedPeopleRow extends StatelessWidget {
itemBuilder: (context, index) { itemBuilder: (context, index) {
final person = content[index]; final person = content[index];
final headers = { final headers = {
"Authorization": "Bearer ${Store.get(StoreKey.accessToken)}" "Authorization": "Bearer ${Store.get(StoreKey.accessToken)}",
}; };
return Padding( return Padding(
padding: const EdgeInsets.only(right: 18.0), padding: const EdgeInsets.only(right: 18.0),
@ -102,7 +102,7 @@ class CuratedPeopleRow extends StatelessWidget {
fontSize: 13.0, fontSize: 13.0,
), ),
), ),
) ),
], ],
), ),
), ),

View File

@ -39,7 +39,7 @@ class SearchSuggestionList extends ConsumerWidget {
color: Theme.of(context).primaryColor, color: Theme.of(context).primaryColor,
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
), ),
) ),
], ],
), ),
), ),

View File

@ -46,7 +46,7 @@ class ThumbnailWithInfo extends StatelessWidget {
imageUrl: imageUrl!, imageUrl: imageUrl!,
httpHeaders: { httpHeaders: {
"Authorization": "Authorization":
"Bearer ${Store.get(StoreKey.accessToken)}" "Bearer ${Store.get(StoreKey.accessToken)}",
}, },
errorWidget: (context, url, error) => errorWidget: (context, url, error) =>
const Icon(Icons.image_not_supported_outlined), const Icon(Icons.image_not_supported_outlined),

View File

@ -56,7 +56,7 @@ class PersonResultPage extends HookConsumerWidget {
style: TextStyle(fontWeight: FontWeight.bold), style: TextStyle(fontWeight: FontWeight.bold),
), ),
onTap: showEditNameDialog, onTap: showEditNameDialog,
) ),
], ],
), ),
); );
@ -134,7 +134,7 @@ class PersonResultPage extends HookConsumerWidget {
getFaceThumbnailUrl(personId), getFaceThumbnailUrl(personId),
headers: { headers: {
"Authorization": "Authorization":
"Bearer ${isar_store.Store.get(isar_store.StoreKey.accessToken)}" "Bearer ${isar_store.Store.get(isar_store.StoreKey.accessToken)}",
}, },
), ),
), ),

View File

@ -42,7 +42,7 @@ class SettingsPage extends HookConsumerWidget {
const AssetListSettings(), const AssetListSettings(),
const NotificationSetting(), const NotificationSetting(),
// const ExperimentalSettings(), // const ExperimentalSettings(),
const AdvancedSettings() const AdvancedSettings(),
], ],
).toList(), ).toList(),
], ],

View File

@ -75,7 +75,7 @@ part 'router.gr.dart';
AutoRoute(page: HomePage, guards: [AuthGuard, DuplicateGuard]), AutoRoute(page: HomePage, guards: [AuthGuard, DuplicateGuard]),
AutoRoute(page: SearchPage, guards: [AuthGuard, DuplicateGuard]), AutoRoute(page: SearchPage, guards: [AuthGuard, DuplicateGuard]),
AutoRoute(page: SharingPage, guards: [AuthGuard, DuplicateGuard]), AutoRoute(page: SharingPage, guards: [AuthGuard, DuplicateGuard]),
AutoRoute(page: LibraryPage, guards: [AuthGuard, DuplicateGuard]) AutoRoute(page: LibraryPage, guards: [AuthGuard, DuplicateGuard]),
], ],
transitionsBuilder: TransitionsBuilders.fadeIn, transitionsBuilder: TransitionsBuilders.fadeIn,
), ),

Binary file not shown.

View File

@ -21,6 +21,7 @@ enum AppStateEnum {
paused, paused,
resumed, resumed,
detached, detached,
hidden,
} }
class AppStateNotiifer extends StateNotifier<AppStateEnum> { class AppStateNotiifer extends StateNotifier<AppStateEnum> {
@ -84,6 +85,10 @@ class AppStateNotiifer extends StateNotifier<AppStateEnum> {
state = AppStateEnum.detached; state = AppStateEnum.detached;
ref.watch(manualUploadProvider.notifier).cancelBackup(); ref.watch(manualUploadProvider.notifier).cancelBackup();
} }
void handleAppHidden() {
state = AppStateEnum.hidden;
}
} }
final appStateProvider = final appStateProvider =

View File

@ -102,7 +102,7 @@ class LocalNotificationService {
cancelUploadActionID, cancelUploadActionID,
'Cancel', 'Cancel',
showsUserInterface: true, showsUserInterface: true,
) ),
] ]
: null, : null,
) )

View File

@ -16,7 +16,7 @@ class IgnorableChangeNotifier extends ChangeNotifier {
if (_ignorableListeners == null) { if (_ignorableListeners == null) {
AssertionError([ AssertionError([
'A $runtimeType was used after being disposed.', 'A $runtimeType was used after being disposed.',
'Once you have called dispose() on a $runtimeType, it can no longer be used.' 'Once you have called dispose() on a $runtimeType, it can no longer be used.',
]); ]);
} }
return true; return true;

View File

@ -15,7 +15,7 @@ class ShareDialog extends StatelessWidget {
margin: const EdgeInsets.only(top: 12), margin: const EdgeInsets.only(top: 12),
child: const Text('share_dialog_preparing') child: const Text('share_dialog_preparing')
.tr(), .tr(),
) ),
], ],
), ),
); );

View File

@ -62,7 +62,7 @@ class UserCircleAvatar extends ConsumerWidget {
image: NetworkImage( image: NetworkImage(
profileImageUrl, profileImageUrl,
headers: { headers: {
"Authorization": "Bearer ${Store.get(StoreKey.accessToken)}" "Authorization": "Bearer ${Store.get(StoreKey.accessToken)}",
}, },
), ),
fadeInDuration: const Duration(milliseconds: 200), fadeInDuration: const Duration(milliseconds: 200),

View File

@ -47,7 +47,7 @@ class AppLogDetailPage extends HookConsumerWidget {
size: 16.0, size: 16.0,
color: Theme.of(context).primaryColor, color: Theme.of(context).primaryColor,
), ),
) ),
], ],
), ),
Container( Container(
@ -106,7 +106,7 @@ class AppLogDetailPage extends HookConsumerWidget {
size: 16.0, size: 16.0,
color: Theme.of(context).primaryColor, color: Theme.of(context).primaryColor,
), ),
) ),
], ],
), ),
Container( Container(
@ -181,7 +181,7 @@ class AppLogDetailPage extends HookConsumerWidget {
if (logMessage.context1 != null) if (logMessage.context1 != null)
buildLogContext1(logMessage.context1.toString()), buildLogContext1(logMessage.context1.toString()),
if (logMessage.context2 != null) if (logMessage.context2 != null)
buildStackMessage(logMessage.context2.toString()) buildStackMessage(logMessage.context2.toString()),
], ],
), ),
), ),

View File

@ -148,7 +148,7 @@ class TabControllerPage extends HookConsumerWidget {
color: Theme.of(context).primaryColor, color: Theme.of(context).primaryColor,
), ),
), ),
) ),
], ],
); );
} }
@ -159,7 +159,7 @@ class TabControllerPage extends HookConsumerWidget {
const HomeRoute(), const HomeRoute(),
SearchRoute(), SearchRoute(),
const SharingRoute(), const SharingRoute(),
const LibraryRoute() const LibraryRoute(),
], ],
builder: (context, child, animation) { builder: (context, child, animation) {
final tabsRouter = AutoTabsRouter.of(context); final tabsRouter = AutoTabsRouter.of(context);

View File

@ -99,7 +99,7 @@ class VersionAnnouncementOverlay extends HookConsumerWidget {
text: text:
"version_announcement_overlay_text_3" "version_announcement_overlay_text_3"
.tr(), .tr(),
) ),
], ],
), ),
), ),
@ -126,7 +126,7 @@ class VersionAnnouncementOverlay extends HookConsumerWidget {
), ),
).tr(), ).tr(),
), ),
) ),
], ],
), ),
), ),

File diff suppressed because it is too large Load Diff

View File

@ -20,19 +20,19 @@ dependencies:
flutter_cache_manager: ^3.3.0 flutter_cache_manager: ^3.3.0
intl: ^0.18.0 intl: ^0.18.0
auto_route: ^5.0.1 auto_route: ^5.0.1
fluttertoast: ^8.0.8 fluttertoast: ^8.2.2
video_player: ^2.2.18 video_player: ^2.2.18
chewie: ^1.4.0 chewie: ^1.4.0
badges: ^2.0.2 badges: ^2.0.2
socket_io_client: ^2.0.0-beta.4-nullsafety.0 socket_io_client: ^2.0.0-beta.4-nullsafety.0
flutter_map: ^4.0.0 flutter_map: ^4.0.0
flutter_udid: ^2.0.0 flutter_udid: ^2.0.0
package_info_plus: ^3.1.2 package_info_plus: ^4.1.0
url_launcher: ^6.1.3 url_launcher: ^6.1.3
http: 0.13.5 http: 0.13.5
cancellation_token_http: ^1.1.0 cancellation_token_http: ^1.1.0
easy_localization: ^3.0.1 easy_localization: ^3.0.1
share_plus: ^6.3.0 share_plus: ^7.1.0
flutter_displaymode: ^0.4.0 flutter_displaymode: ^0.4.0
scrollable_positioned_list: ^0.3.4 scrollable_positioned_list: ^0.3.4
path: ^1.8.1 path: ^1.8.1
@ -48,7 +48,7 @@ dependencies:
device_info_plus: ^8.1.0 device_info_plus: ^8.1.0
connectivity_plus: ^4.0.1 connectivity_plus: ^4.0.1
crypto: ^3.0.3 # TODO remove once native crypto is used on iOS crypto: ^3.0.3 # TODO remove once native crypto is used on iOS
wakelock: ^0.6.2 wakelock_plus: ^1.1.1
flutter_local_notifications: ^15.1.0+1 flutter_local_notifications: ^15.1.0+1
openapi: openapi:

View File

@ -45,7 +45,7 @@ void main() {
AlbumSchema, AlbumSchema,
UserSchema, UserSchema,
StoreValueSchema, StoreValueSchema,
LoggerMessageSchema LoggerMessageSchema,
], ],
maxSizeMiB: 256, maxSizeMiB: 256,
directory: ".", directory: ".",