diff --git a/.github/workflows/static_analysis.yml b/.github/workflows/static_analysis.yml index 7f1ce1988e..e11330d428 100644 --- a/.github/workflows/static_analysis.yml +++ b/.github/workflows/static_analysis.yml @@ -100,8 +100,9 @@ jobs: - name: Run dart format run: make format - - name: Run dart custom_lint - run: dart run custom_lint + # TODO: Re-enable after upgrading custom_lint + # - name: Run dart custom_lint + # run: dart run custom_lint # TODO: Use https://github.com/CQLabs/dcm-action - name: Run DCM diff --git a/mise.lock b/mise.lock index 112b1ca6eb..9aae0b9572 100644 --- a/mise.lock +++ b/mise.lock @@ -3,7 +3,7 @@ version = "3.8.2" backend = "asdf:dart" [tools.flutter] -version = "3.32.8-stable" +version = "3.35.3-stable" backend = "asdf:flutter" [tools."github:CQLabs/homebrew-dcm"] diff --git a/mise.toml b/mise.toml index ff9fa3895d..1ee34ad75d 100644 --- a/mise.toml +++ b/mise.toml @@ -1,6 +1,6 @@ [tools] node = "22.19.0" -flutter = "3.32.8" +flutter = "3.35.3" pnpm = "10.14.0" dart = "3.8.2" diff --git a/mobile/.fvmrc b/mobile/.fvmrc index 3ca65ffc7c..d8a11548fd 100644 --- a/mobile/.fvmrc +++ b/mobile/.fvmrc @@ -1,3 +1,3 @@ { - "flutter": "3.32.8" + "flutter": "3.35.3" } \ No newline at end of file diff --git a/mobile/.vscode/settings.json b/mobile/.vscode/settings.json index 9a9fb67ce3..0c2f2c29cc 100644 --- a/mobile/.vscode/settings.json +++ b/mobile/.vscode/settings.json @@ -1,8 +1,8 @@ { - "dart.flutterSdkPath": ".fvm/versions/3.32.8", + "dart.flutterSdkPath": ".fvm/versions/3.35.3", "dart.lineLength": 120, "[dart]": { - "editor.rulers": [120], + "editor.rulers": [120] }, "search.exclude": { "**/.fvm": true diff --git a/mobile/analysis_options.yaml b/mobile/analysis_options.yaml index c26e1c6649..c04e1dafdc 100644 --- a/mobile/analysis_options.yaml +++ b/mobile/analysis_options.yaml @@ -43,8 +43,9 @@ analyzer: - lib/**/*.g.dart - lib/**/*.drift.dart - plugins: - - custom_lint + # TODO: Re-enable after upgrading custom_lint + # plugins: + # - custom_lint custom_lint: debug: true diff --git a/mobile/ios/Flutter/AppFrameworkInfo.plist b/mobile/ios/Flutter/AppFrameworkInfo.plist index 7c56964006..1dc6cf7652 100644 --- a/mobile/ios/Flutter/AppFrameworkInfo.plist +++ b/mobile/ios/Flutter/AppFrameworkInfo.plist @@ -21,6 +21,6 @@ CFBundleVersion 1.0 MinimumOSVersion - 12.0 + 13.0 diff --git a/mobile/ios/Podfile.lock b/mobile/ios/Podfile.lock index 09bd36022b..502fd9008f 100644 --- a/mobile/ios/Podfile.lock +++ b/mobile/ios/Podfile.lock @@ -253,7 +253,7 @@ SPEC CHECKSUMS: DKImagePickerController: 946cec48c7873164274ecc4624d19e3da4c1ef3c DKPhotoGallery: b3834fecb755ee09a593d7c9e389d8b5d6deed60 file_picker: a0560bc09d61de87f12d246fc47d2119e6ef37be - Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 + Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467 flutter_local_notifications: ad39620c743ea4c15127860f4b5641649a988100 flutter_native_splash: c32d145d68aeda5502d5f543ee38c192065986cf flutter_secure_storage: 1ed9476fba7e7a782b22888f956cce43e2c62f13 diff --git a/mobile/lib/pages/album/album_options.page.dart b/mobile/lib/pages/album/album_options.page.dart index e659340f26..20d4dbd325 100644 --- a/mobile/lib/pages/album/album_options.page.dart +++ b/mobile/lib/pages/album/album_options.page.dart @@ -169,7 +169,7 @@ class AlbumOptionsPage extends HookConsumerWidget { album.activityEnabled = value; } }, - activeColor: activityEnabled.value ? context.primaryColor : context.themeData.disabledColor, + activeThumbColor: activityEnabled.value ? context.primaryColor : context.themeData.disabledColor, dense: true, title: Text( "comments_and_likes", diff --git a/mobile/lib/pages/library/shared_link/shared_link_edit.page.dart b/mobile/lib/pages/library/shared_link/shared_link_edit.page.dart index c78a9d5138..8b66bb231f 100644 --- a/mobile/lib/pages/library/shared_link/shared_link_edit.page.dart +++ b/mobile/lib/pages/library/shared_link/shared_link_edit.page.dart @@ -112,7 +112,7 @@ class SharedLinkEditPage extends HookConsumerWidget { return SwitchListTile.adaptive( value: showMetadata.value, onChanged: newShareLink.value.isEmpty ? (value) => showMetadata.value = value : null, - activeColor: colorScheme.primary, + activeThumbColor: colorScheme.primary, dense: true, title: Text("show_metadata", style: themeData.textTheme.labelLarge?.copyWith(fontWeight: FontWeight.bold)).tr(), ); @@ -122,7 +122,7 @@ class SharedLinkEditPage extends HookConsumerWidget { return SwitchListTile.adaptive( value: allowDownload.value, onChanged: newShareLink.value.isEmpty ? (value) => allowDownload.value = value : null, - activeColor: colorScheme.primary, + activeThumbColor: colorScheme.primary, dense: true, title: Text( "allow_public_user_to_download", @@ -135,7 +135,7 @@ class SharedLinkEditPage extends HookConsumerWidget { return SwitchListTile.adaptive( value: allowUpload.value, onChanged: newShareLink.value.isEmpty ? (value) => allowUpload.value = value : null, - activeColor: colorScheme.primary, + activeThumbColor: colorScheme.primary, dense: true, title: Text( "allow_public_user_to_upload", @@ -148,7 +148,7 @@ class SharedLinkEditPage extends HookConsumerWidget { return SwitchListTile.adaptive( value: editExpiry.value, onChanged: newShareLink.value.isEmpty ? (value) => editExpiry.value = value : null, - activeColor: colorScheme.primary, + activeThumbColor: colorScheme.primary, dense: true, title: Text( "change_expiration_time", diff --git a/mobile/lib/presentation/pages/drift_album_options.page.dart b/mobile/lib/presentation/pages/drift_album_options.page.dart index b8dcbd91f9..7f49a1ff79 100644 --- a/mobile/lib/presentation/pages/drift_album_options.page.dart +++ b/mobile/lib/presentation/pages/drift_album_options.page.dart @@ -208,7 +208,7 @@ class DriftAlbumOptionsPage extends HookConsumerWidget { activityEnabled.value = value; await ref.read(remoteAlbumProvider.notifier).setActivityStatus(album.id, value); }, - activeColor: activityEnabled.value ? context.primaryColor : context.themeData.disabledColor, + activeThumbColor: activityEnabled.value ? context.primaryColor : context.themeData.disabledColor, dense: true, title: Text( "comments_and_likes", diff --git a/mobile/lib/presentation/widgets/images/image_provider.dart b/mobile/lib/presentation/widgets/images/image_provider.dart index dd87d2f228..ab5ead5ca5 100644 --- a/mobile/lib/presentation/widgets/images/image_provider.dart +++ b/mobile/lib/presentation/widgets/images/image_provider.dart @@ -96,7 +96,7 @@ mixin CancellableImageProviderMixin on CancellableImageProvide final operation = cachedOperation; if (operation != null) { - this.cachedOperation = null; + cachedOperation = null; operation.cancel(); } } diff --git a/mobile/lib/widgets/map/map_settings/map_settings_list_tile.dart b/mobile/lib/widgets/map/map_settings/map_settings_list_tile.dart index 51567eff15..e97875fd90 100644 --- a/mobile/lib/widgets/map/map_settings/map_settings_list_tile.dart +++ b/mobile/lib/widgets/map/map_settings/map_settings_list_tile.dart @@ -13,7 +13,7 @@ class MapSettingsListTile extends StatelessWidget { @override Widget build(BuildContext context) { return SwitchListTile.adaptive( - activeColor: context.primaryColor, + activeThumbColor: context.primaryColor, title: Text(title, style: context.textTheme.labelLarge?.copyWith(fontWeight: FontWeight.bold)).tr(), value: selected, onChanged: onChanged, diff --git a/mobile/lib/widgets/photo_view/src/core/photo_view_core.dart b/mobile/lib/widgets/photo_view/src/core/photo_view_core.dart index a8d53e5106..d21b49f020 100644 --- a/mobile/lib/widgets/photo_view/src/core/photo_view_core.dart +++ b/mobile/lib/widgets/photo_view/src/core/photo_view_core.dart @@ -350,8 +350,8 @@ class PhotoViewCoreState extends State final computedScale = useImageScale ? 1.0 : scale; final matrix = Matrix4.identity() - ..translate(value.position.dx, value.position.dy) - ..scale(computedScale) + ..translateByDouble(value.position.dx, value.position.dy, 0, 1.0) + ..scaleByDouble(computedScale, computedScale, computedScale, 1.0) ..rotateZ(value.rotation); final Widget customChildLayout = CustomSingleChildLayout( diff --git a/mobile/lib/widgets/search/search_filter/media_type_picker.dart b/mobile/lib/widgets/search/search_filter/media_type_picker.dart index 589ce6262b..e0e34b654e 100644 --- a/mobile/lib/widgets/search/search_filter/media_type_picker.dart +++ b/mobile/lib/widgets/search/search_filter/media_type_picker.dart @@ -13,40 +13,19 @@ class MediaTypePicker extends HookWidget { Widget build(BuildContext context) { final selectedMediaType = useState(filter ?? AssetType.other); - return ListView( - shrinkWrap: true, - children: [ - RadioListTile( - key: const Key("all"), - title: const Text("all").tr(), - value: AssetType.other, - onChanged: (value) { - selectedMediaType.value = value!; - onSelect(value); - }, - groupValue: selectedMediaType.value, - ), - RadioListTile( - key: const Key("image"), - title: const Text("image").tr(), - value: AssetType.image, - onChanged: (value) { - selectedMediaType.value = value!; - onSelect(value); - }, - groupValue: selectedMediaType.value, - ), - RadioListTile( - key: const Key("video"), - title: const Text("video").tr(), - value: AssetType.video, - onChanged: (value) { - selectedMediaType.value = value!; - onSelect(value); - }, - groupValue: selectedMediaType.value, - ), - ], + return RadioGroup( + onChanged: (value) { + selectedMediaType.value = value!; + onSelect(value); + }, + groupValue: selectedMediaType.value, + child: Column( + children: [ + RadioListTile(key: const Key("all"), title: const Text("all").tr(), value: AssetType.other), + RadioListTile(key: const Key("image"), title: const Text("image").tr(), value: AssetType.image), + RadioListTile(key: const Key("video"), title: const Text("video").tr(), value: AssetType.video), + ], + ), ); } } diff --git a/mobile/lib/widgets/settings/beta_timeline_list_tile.dart b/mobile/lib/widgets/settings/beta_timeline_list_tile.dart index 9a3b4f5c96..326d6c49d1 100644 --- a/mobile/lib/widgets/settings/beta_timeline_list_tile.dart +++ b/mobile/lib/widgets/settings/beta_timeline_list_tile.dart @@ -62,7 +62,7 @@ class BetaTimelineListTile extends ConsumerWidget { trailing: Switch.adaptive( value: betaTimelineValue, onChanged: onSwitchChanged, - activeColor: context.primaryColor, + activeThumbColor: context.primaryColor, ), onTap: () => onSwitchChanged(!betaTimelineValue), ), diff --git a/mobile/lib/widgets/settings/preference_settings/primary_color_setting.dart b/mobile/lib/widgets/settings/preference_settings/primary_color_setting.dart index ddf2cc6215..22c9154981 100644 --- a/mobile/lib/widgets/settings/preference_settings/primary_color_setting.dart +++ b/mobile/lib/widgets/settings/preference_settings/primary_color_setting.dart @@ -115,7 +115,7 @@ class PrimaryColorSetting extends HookConsumerWidget { child: SwitchListTile.adaptive( contentPadding: const EdgeInsets.symmetric(vertical: 6, horizontal: 20), dense: true, - activeColor: context.primaryColor, + activeThumbColor: context.primaryColor, tileColor: context.colorScheme.surfaceContainerHigh, shape: const RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(15))), title: Text( diff --git a/mobile/lib/widgets/settings/settings_radio_list_tile.dart b/mobile/lib/widgets/settings/settings_radio_list_tile.dart index 95224e3f59..6b02a65159 100644 --- a/mobile/lib/widgets/settings/settings_radio_list_tile.dart +++ b/mobile/lib/widgets/settings/settings_radio_list_tile.dart @@ -9,7 +9,7 @@ class SettingsRadioGroup { } class SettingsRadioListTile extends StatelessWidget { - final List groups; + final List> groups; final T groupBy; final void Function(T?) onRadioChanged; @@ -17,21 +17,23 @@ class SettingsRadioListTile extends StatelessWidget { @override Widget build(BuildContext context) { - return Column( - children: groups - .map( - (g) => RadioListTile( - contentPadding: const EdgeInsets.symmetric(horizontal: 20), - dense: true, - activeColor: context.primaryColor, - title: Text(g.title, style: context.textTheme.bodyLarge?.copyWith(fontWeight: FontWeight.w500)), - value: g.value, - groupValue: groupBy, - onChanged: onRadioChanged, - controlAffinity: ListTileControlAffinity.trailing, - ), - ) - .toList(), + return RadioGroup( + groupValue: groupBy, + onChanged: onRadioChanged, + child: Column( + children: groups + .map( + (g) => RadioListTile( + contentPadding: const EdgeInsets.symmetric(horizontal: 20), + dense: true, + activeColor: context.primaryColor, + title: Text(g.title, style: context.textTheme.bodyLarge?.copyWith(fontWeight: FontWeight.w500)), + value: g.value, + controlAffinity: ListTileControlAffinity.trailing, + ), + ) + .toList(), + ), ); } } diff --git a/mobile/lib/widgets/settings/settings_switch_list_tile.dart b/mobile/lib/widgets/settings/settings_switch_list_tile.dart index d51e2eb2ca..f5d6dfd05a 100644 --- a/mobile/lib/widgets/settings/settings_switch_list_tile.dart +++ b/mobile/lib/widgets/settings/settings_switch_list_tile.dart @@ -40,7 +40,7 @@ class SettingsSwitchListTile extends StatelessWidget { selectedTileColor: enabled ? null : context.themeData.disabledColor, value: valueNotifier.value, onChanged: onSwitchChanged, - activeColor: enabled ? context.primaryColor : context.themeData.disabledColor, + activeThumbColor: enabled ? context.primaryColor : context.themeData.disabledColor, dense: true, secondary: icon != null ? Icon(icon!, color: valueNotifier.value ? context.primaryColor : null) : null, title: Text( diff --git a/mobile/pubspec.lock b/mobile/pubspec.lock index 35513cca35..92e2a56172 100644 --- a/mobile/pubspec.lock +++ b/mobile/pubspec.lock @@ -1064,26 +1064,26 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "6bb818ecbdffe216e81182c2f0714a2e62b593f4a4f13098713ff1685dfb6ab0" + sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" url: "https://pub.dev" source: hosted - version: "10.0.9" + version: "11.0.2" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573 + sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" url: "https://pub.dev" source: hosted - version: "3.0.9" + version: "3.0.10" leak_tracker_testing: dependency: transitive description: name: leak_tracker_testing - sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" + sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "3.0.2" lints: dependency: transitive description: @@ -1877,10 +1877,10 @@ packages: dependency: transitive description: name: test_api - sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd + sha256: "522f00f556e73044315fa4585ec3270f1808a4b186c936e612cab0b565ff1e00" url: "https://pub.dev" source: hosted - version: "0.7.4" + version: "0.7.6" thumbhash: dependency: "direct main" description: @@ -2037,10 +2037,10 @@ packages: dependency: transitive description: name: vector_math - sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b url: "https://pub.dev" source: hosted - version: "2.1.4" + version: "2.2.0" vm_service: dependency: transitive description: @@ -2171,4 +2171,4 @@ packages: version: "3.1.3" sdks: dart: ">=3.8.0 <4.0.0" - flutter: ">=3.32.8" + flutter: ">=3.35.3" diff --git a/mobile/pubspec.yaml b/mobile/pubspec.yaml index bb9c459f3f..bd8817ce06 100644 --- a/mobile/pubspec.yaml +++ b/mobile/pubspec.yaml @@ -6,7 +6,7 @@ version: 1.142.1+3015 environment: sdk: '>=3.8.0 <4.0.0' - flutter: 3.32.8 + flutter: 3.35.3 isar_version: &isar_version 3.1.8 diff --git a/server/Dockerfile.dev b/server/Dockerfile.dev index 1db03bc844..644d605f48 100644 --- a/server/Dockerfile.dev +++ b/server/Dockerfile.dev @@ -56,7 +56,7 @@ RUN if [ "$(dpkg --print-architecture)" = "arm64" ]; then \ # Flutter SDK # https://flutter.dev/docs/development/tools/sdk/releases?tab=linux ENV FLUTTER_CHANNEL="stable" -ENV FLUTTER_VERSION="3.32.8" +ENV FLUTTER_VERSION="3.35.3" ENV FLUTTER_HOME=/flutter ENV PATH=${PATH}:${FLUTTER_HOME}/bin