Skip to content

Commit 30b90f9

Browse files
authored
fix: propagate iCloud Shared Album flag (#25060)
* fix: propagate iCloud Shared Album flag * chore: add migration
1 parent 1293e47 commit 30b90f9

4 files changed

Lines changed: 36 additions & 3 deletions

File tree

mobile/lib/domain/services/local_sync.service.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -360,6 +360,7 @@ extension on Iterable<PlatformAlbum> {
360360
name: e.name,
361361
updatedAt: tryFromSecondsSinceEpoch(e.updatedAt, isUtc: true) ?? DateTime.timestamp(),
362362
assetCount: e.assetCount,
363+
isIosSharedAlbum: e.isCloud,
363364
),
364365
).toList();
365366
}

mobile/lib/infrastructure/entities/local_album.entity.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ extension LocalAlbumEntityDataHelper on LocalAlbumEntityData {
3333
assetCount: assetCount,
3434
backupSelection: backupSelection,
3535
linkedRemoteAlbumId: linkedRemoteAlbumId,
36+
isIosSharedAlbum: isIosSharedAlbum,
3637
);
3738
}
3839
}

mobile/lib/utils/migration.dart

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ import 'package:isar/isar.dart';
3131
// ignore: import_rule_photo_manager
3232
import 'package:photo_manager/photo_manager.dart';
3333

34-
const int targetVersion = 19;
34+
const int targetVersion = 20;
3535

3636
Future<void> migrateDatabaseIfNeeded(Isar db, Drift drift) async {
3737
final hasVersion = Store.tryGet(StoreKey.version) != null;
@@ -86,6 +86,10 @@ Future<void> migrateDatabaseIfNeeded(Isar db, Drift drift) async {
8686
}
8787
}
8888

89+
if (version < 20 && Store.isBetaTimelineEnabled) {
90+
await _syncLocalAlbumIsIosSharedAlbum(drift);
91+
}
92+
8993
if (targetVersion >= 12) {
9094
await Store.put(StoreKey.version, targetVersion);
9195
return;
@@ -258,6 +262,25 @@ Future<bool> _populateLocalAssetTime(Drift db) async {
258262
}
259263
}
260264

265+
Future<void> _syncLocalAlbumIsIosSharedAlbum(Drift db) async {
266+
try {
267+
final nativeApi = NativeSyncApi();
268+
final albums = await nativeApi.getAlbums();
269+
await db.batch((batch) {
270+
for (final album in albums) {
271+
batch.update(
272+
db.localAlbumEntity,
273+
LocalAlbumEntityCompanion(isIosSharedAlbum: Value(album.isCloud)),
274+
where: (t) => t.id.equals(album.id),
275+
);
276+
}
277+
});
278+
dPrint(() => "[MIGRATION] Successfully updated isIosSharedAlbum for ${albums.length} albums");
279+
} catch (error) {
280+
dPrint(() => "[MIGRATION] Error while syncing local album isIosSharedAlbum: $error");
281+
}
282+
}
283+
261284
Future<void> migrateDeviceAssetToSqlite(Isar db, Drift drift) async {
262285
try {
263286
final isarDeviceAssets = await db.deviceAssetEntitys.where().findAll();

mobile/lib/widgets/backup/drift_album_info_list_tile.dart

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import 'package:fluttertoast/fluttertoast.dart';
44
import 'package:hooks_riverpod/hooks_riverpod.dart';
55
import 'package:immich_mobile/domain/models/album/local_album.model.dart';
66
import 'package:immich_mobile/extensions/build_context_extensions.dart';
7+
import 'package:immich_mobile/extensions/theme_extensions.dart';
78
import 'package:immich_mobile/providers/backup/backup_album.provider.dart';
89
import 'package:immich_mobile/providers/haptic_feedback.provider.dart';
910
import 'package:immich_mobile/routing/router.dart';
@@ -41,6 +42,13 @@ class DriftAlbumInfoListTile extends HookConsumerWidget {
4142
return Icon(Icons.circle, color: context.colorScheme.surfaceContainerHighest);
4243
}
4344

45+
Widget buildSubtitle() {
46+
return Text(
47+
album.isIosSharedAlbum ? '${album.assetCount} (iCloud Shared Album)' : album.assetCount.toString(),
48+
style: context.textTheme.labelLarge?.copyWith(color: context.colorScheme.onSurfaceSecondary),
49+
);
50+
}
51+
4452
return GestureDetector(
4553
onDoubleTap: () {
4654
ref.watch(hapticFeedbackProvider.notifier).selectionClick();
@@ -73,8 +81,8 @@ class DriftAlbumInfoListTile extends HookConsumerWidget {
7381
}
7482
},
7583
leading: buildIcon(),
76-
title: Text(album.name, style: const TextStyle(fontSize: 14, fontWeight: FontWeight.bold)),
77-
subtitle: Text(album.assetCount.toString()),
84+
title: Text(album.name, style: context.textTheme.titleSmall),
85+
subtitle: buildSubtitle(),
7886
trailing: IconButton(
7987
onPressed: () {
8088
context.pushRoute(LocalTimelineRoute(album: album));

0 commit comments

Comments
 (0)