|
|
|
@ -3,7 +3,7 @@
|
|
|
|
import 'dart:async';
|
|
|
|
import 'dart:async';
|
|
|
|
import 'dart:io';
|
|
|
|
import 'dart:io';
|
|
|
|
|
|
|
|
|
|
|
|
import 'package:flutter/widgets.dart';
|
|
|
|
import 'package:flutter/foundation.dart';
|
|
|
|
import 'package:immich_mobile/domain/models/store.model.dart';
|
|
|
|
import 'package:immich_mobile/domain/models/store.model.dart';
|
|
|
|
import 'package:immich_mobile/entities/album.entity.dart';
|
|
|
|
import 'package:immich_mobile/entities/album.entity.dart';
|
|
|
|
import 'package:immich_mobile/entities/android_device_asset.entity.dart';
|
|
|
|
import 'package:immich_mobile/entities/android_device_asset.entity.dart';
|
|
|
|
@ -17,6 +17,8 @@ import 'package:immich_mobile/infrastructure/entities/store.entity.dart';
|
|
|
|
import 'package:immich_mobile/infrastructure/entities/user.entity.dart';
|
|
|
|
import 'package:immich_mobile/infrastructure/entities/user.entity.dart';
|
|
|
|
import 'package:immich_mobile/utils/diff.dart';
|
|
|
|
import 'package:immich_mobile/utils/diff.dart';
|
|
|
|
import 'package:isar/isar.dart';
|
|
|
|
import 'package:isar/isar.dart';
|
|
|
|
|
|
|
|
// ignore: import_rule_photo_manager
|
|
|
|
|
|
|
|
import 'package:photo_manager/photo_manager.dart';
|
|
|
|
|
|
|
|
|
|
|
|
const int targetVersion = 10;
|
|
|
|
const int targetVersion = 10;
|
|
|
|
|
|
|
|
|
|
|
|
@ -69,14 +71,45 @@ Future<void> _migrateDeviceAsset(Isar db) async {
|
|
|
|
: (await db.iOSDeviceAssets.where().findAll())
|
|
|
|
: (await db.iOSDeviceAssets.where().findAll())
|
|
|
|
.map((i) => _DeviceAsset(assetId: i.id, hash: i.hash))
|
|
|
|
.map((i) => _DeviceAsset(assetId: i.id, hash: i.hash))
|
|
|
|
.toList();
|
|
|
|
.toList();
|
|
|
|
final localAssets = (await db.assets
|
|
|
|
|
|
|
|
.where()
|
|
|
|
final PermissionState ps = await PhotoManager.requestPermissionExtend();
|
|
|
|
.anyOf(ids, (query, id) => query.localIdEqualTo(id.assetId))
|
|
|
|
if (!ps.hasAccess) {
|
|
|
|
.findAll())
|
|
|
|
if (kDebugMode) {
|
|
|
|
.map((a) => _DeviceAsset(assetId: a.localId!, dateTime: a.fileModifiedAt))
|
|
|
|
debugPrint(
|
|
|
|
.toList();
|
|
|
|
"[MIGRATION] Photo library permission not granted. Skipping device asset migration.",
|
|
|
|
debugPrint("Device Asset Ids length - ${ids.length}");
|
|
|
|
);
|
|
|
|
debugPrint("Local Asset Ids length - ${localAssets.length}");
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
List<_DeviceAsset> localAssets = [];
|
|
|
|
|
|
|
|
final List<AssetPathEntity> paths =
|
|
|
|
|
|
|
|
await PhotoManager.getAssetPathList(onlyAll: true);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (paths.isEmpty) {
|
|
|
|
|
|
|
|
localAssets = (await db.assets
|
|
|
|
|
|
|
|
.where()
|
|
|
|
|
|
|
|
.anyOf(ids, (query, id) => query.localIdEqualTo(id.assetId))
|
|
|
|
|
|
|
|
.findAll())
|
|
|
|
|
|
|
|
.map(
|
|
|
|
|
|
|
|
(a) => _DeviceAsset(assetId: a.localId!, dateTime: a.fileModifiedAt),
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
.toList();
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
final AssetPathEntity albumWithAll = paths.first;
|
|
|
|
|
|
|
|
final int assetCount = await albumWithAll.assetCountAsync;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
final List<AssetEntity> allDeviceAssets =
|
|
|
|
|
|
|
|
await albumWithAll.getAssetListRange(start: 0, end: assetCount);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
localAssets = allDeviceAssets
|
|
|
|
|
|
|
|
.map((a) => _DeviceAsset(assetId: a.id, dateTime: a.modifiedDateTime))
|
|
|
|
|
|
|
|
.toList();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
debugPrint("[MIGRATION] Device Asset Ids length - ${ids.length}");
|
|
|
|
|
|
|
|
debugPrint("[MIGRATION] Local Asset Ids length - ${localAssets.length}");
|
|
|
|
ids.sort((a, b) => a.assetId.compareTo(b.assetId));
|
|
|
|
ids.sort((a, b) => a.assetId.compareTo(b.assetId));
|
|
|
|
localAssets.sort((a, b) => a.assetId.compareTo(b.assetId));
|
|
|
|
localAssets.sort((a, b) => a.assetId.compareTo(b.assetId));
|
|
|
|
final List<DeviceAssetEntity> toAdd = [];
|
|
|
|
final List<DeviceAssetEntity> toAdd = [];
|
|
|
|
@ -95,15 +128,27 @@ Future<void> _migrateDeviceAsset(Isar db) async {
|
|
|
|
return false;
|
|
|
|
return false;
|
|
|
|
},
|
|
|
|
},
|
|
|
|
onlyFirst: (deviceAsset) {
|
|
|
|
onlyFirst: (deviceAsset) {
|
|
|
|
debugPrint(
|
|
|
|
if (kDebugMode) {
|
|
|
|
'DeviceAsset not found in local assets: ${deviceAsset.assetId}',
|
|
|
|
debugPrint(
|
|
|
|
);
|
|
|
|
'[MIGRATION] Local asset not found in DeviceAsset: ${deviceAsset.assetId}',
|
|
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
}
|
|
|
|
},
|
|
|
|
},
|
|
|
|
onlySecond: (asset) {
|
|
|
|
onlySecond: (asset) {
|
|
|
|
debugPrint('Local asset not found in DeviceAsset: ${asset.assetId}');
|
|
|
|
if (kDebugMode) {
|
|
|
|
|
|
|
|
debugPrint(
|
|
|
|
|
|
|
|
'[MIGRATION] Local asset not found in DeviceAsset: ${asset.assetId}',
|
|
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
}
|
|
|
|
},
|
|
|
|
},
|
|
|
|
);
|
|
|
|
);
|
|
|
|
debugPrint("Total number of device assets migrated - ${toAdd.length}");
|
|
|
|
|
|
|
|
|
|
|
|
if (kDebugMode) {
|
|
|
|
|
|
|
|
debugPrint(
|
|
|
|
|
|
|
|
"[MIGRATION] Total number of device assets migrated - ${toAdd.length}",
|
|
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
await db.writeTxn(() async {
|
|
|
|
await db.writeTxn(() async {
|
|
|
|
await db.deviceAssetEntitys.putAll(toAdd);
|
|
|
|
await db.deviceAssetEntitys.putAll(toAdd);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|