Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion mobile/android/app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@
android:pathPrefix="/albums/" />
<data
android:host="my.immich.app"
android:pathPrefix="/memories/" />
android:pathPrefix="/people/" />
<data
android:host="my.immich.app"
android:path="/memory" />
Expand Down
4 changes: 4 additions & 0 deletions mobile/lib/domain/services/people.service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@ class DriftPeopleService {

const DriftPeopleService(this._repository, this._personApiRepository);

Future<DriftPerson?> get(String personId) {
return _repository.get(personId);
}

Future<List<DriftPerson>> getAssetPeople(String assetId) {
return _repository.getAssetPeople(assetId);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,13 @@ class DriftPeopleRepository extends DriftDatabaseRepository {
final Drift _db;
const DriftPeopleRepository(this._db) : super(_db);

Future<DriftPerson?> get(String personId) async {
final query = _db.select(_db.personEntity)..where((row) => row.id.equals(personId));

final result = await query.getSingleOrNull();
return result?.toDto();
}

Future<List<DriftPerson>> getAssetPeople(String assetId) async {
final query = _db.select(_db.assetFaceEntity).join([
innerJoin(_db.personEntity, _db.personEntity.id.equalsExp(_db.assetFaceEntity.personId)),
Expand Down
32 changes: 28 additions & 4 deletions mobile/lib/services/deep_link.service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import 'package:immich_mobile/domain/models/memory.model.dart';
import 'package:immich_mobile/domain/models/user.model.dart';
import 'package:immich_mobile/domain/services/asset.service.dart' as beta_asset_service;
import 'package:immich_mobile/domain/services/memory.service.dart';
import 'package:immich_mobile/domain/services/people.service.dart';
import 'package:immich_mobile/domain/services/remote_album.service.dart';
import 'package:immich_mobile/domain/services/timeline.service.dart';
import 'package:immich_mobile/entities/store.entity.dart';
Expand All @@ -13,6 +14,7 @@ import 'package:immich_mobile/providers/asset_viewer/current_asset.provider.dart
import 'package:immich_mobile/providers/infrastructure/album.provider.dart';
import 'package:immich_mobile/providers/infrastructure/asset.provider.dart' as beta_asset_provider;
import 'package:immich_mobile/providers/infrastructure/memory.provider.dart';
import 'package:immich_mobile/providers/infrastructure/people.provider.dart';
import 'package:immich_mobile/providers/infrastructure/timeline.provider.dart';
import 'package:immich_mobile/providers/user.provider.dart';
import 'package:immich_mobile/routing/router.dart';
Expand All @@ -33,6 +35,7 @@ final deepLinkServiceProvider = Provider(
ref.watch(beta_asset_provider.assetServiceProvider),
ref.watch(remoteAlbumServiceProvider),
ref.watch(driftMemoryServiceProvider),
ref.watch(driftPeopleServiceProvider),
ref.watch(currentUserProvider),
),
);
Expand All @@ -49,7 +52,8 @@ class DeepLinkService {
final TimelineFactory _betaTimelineFactory;
final beta_asset_service.AssetService _betaAssetService;
final RemoteAlbumService _betaRemoteAlbumService;
final DriftMemoryService _betaMemoryServiceProvider;
final DriftMemoryService _betaMemoryService;
final DriftPeopleService _betaPeopleService;

final UserDto? _currentUser;

Expand All @@ -62,7 +66,8 @@ class DeepLinkService {
this._betaTimelineFactory,
this._betaAssetService,
this._betaRemoteAlbumService,
this._betaMemoryServiceProvider,
this._betaMemoryService,
this._betaPeopleService,
this._currentUser,
);

Expand All @@ -84,6 +89,7 @@ class DeepLinkService {
"memory" => await _buildMemoryDeepLink(queryParams['id'] ?? ''),
"asset" => await _buildAssetDeepLink(queryParams['id'] ?? '', ref),
"album" => await _buildAlbumDeepLink(queryParams['id'] ?? ''),
"people" => await _buildPeopleDeepLink(queryParams['id'] ?? ''),
"activity" => await _buildActivityDeepLink(queryParams['albumId'] ?? ''),
_ => null,
};
Expand All @@ -106,6 +112,7 @@ class DeepLinkService {
const uuidRegex = r'[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}';
final assetRegex = RegExp('/photos/($uuidRegex)');
final albumRegex = RegExp('/albums/($uuidRegex)');
final peopleRegex = RegExp('/people/($uuidRegex)');

PageRouteInfo<dynamic>? deepLinkRoute;
if (assetRegex.hasMatch(path)) {
Expand All @@ -114,6 +121,9 @@ class DeepLinkService {
} else if (albumRegex.hasMatch(path)) {
final albumId = albumRegex.firstMatch(path)?.group(1) ?? '';
deepLinkRoute = await _buildAlbumDeepLink(albumId);
} else if (peopleRegex.hasMatch(path)) {
final peopleId = peopleRegex.firstMatch(path)?.group(1) ?? '';
deepLinkRoute = await _buildPeopleDeepLink(peopleId);
} else if (path == "/memory") {
deepLinkRoute = await _buildMemoryDeepLink(null);
}
Expand All @@ -136,9 +146,9 @@ class DeepLinkService {
return null;
}

memories = await _betaMemoryServiceProvider.getMemoryLane(_currentUser.id);
memories = await _betaMemoryService.getMemoryLane(_currentUser.id);
} else {
final memory = await _betaMemoryServiceProvider.get(memoryId);
final memory = await _betaMemoryService.get(memoryId);
if (memory != null) {
memories = [memory];
}
Expand Down Expand Up @@ -225,4 +235,18 @@ class DeepLinkService {

return DriftActivitiesRoute(album: album);
}

Future<PageRouteInfo?> _buildPeopleDeepLink(String personId) async {
if (Store.isBetaTimelineEnabled == false) {
return null;
}

final person = await _betaPeopleService.get(personId);

if (person == null) {
return null;
}

return DriftPersonRoute(person: person);
}
}
Loading