feat(mobile): sqlite timeline ()

* wip: timeline

* more segment extensions

* added scrubber

* refactor: timeline state

* more refactors

* fix scrubber segments

* added remote thumb & thumbhash provider

* feat: merged view

* scrub / merged asset fixes

* rename stuff & add tile indicators

* fix local album timeline query

* ignore hidden assets during sync

* ignore recovered assets during sync

* old scrubber

* add video indicator

* handle groupBy

* handle partner inTimeline

* show duration

* reduce widget nesting in thumb tile

* merge main

* chore: extend cacheExtent

* ignore touch events on scrub label when not visible

* scrub label ignore events and hide immediately

* auto reload on sync

* refactor image providers

* throttle db updates

---------

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
This commit is contained in:
shenlong 2025-06-16 20:37:45 +05:30 committed by GitHub
parent 7347f64958
commit bcda2c6e22
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
50 changed files with 2921 additions and 59 deletions
mobile/lib/routing

View file

@ -64,6 +64,8 @@ import 'package:immich_mobile/pages/search/recently_taken.page.dart';
import 'package:immich_mobile/pages/search/search.page.dart';
import 'package:immich_mobile/pages/share_intent/share_intent.page.dart';
import 'package:immich_mobile/presentation/pages/dev/feat_in_development.page.dart';
import 'package:immich_mobile/presentation/pages/dev/local_timeline.page.dart';
import 'package:immich_mobile/presentation/pages/dev/main_timeline.page.dart';
import 'package:immich_mobile/presentation/pages/dev/media_stat.page.dart';
import 'package:immich_mobile/providers/api.provider.dart';
import 'package:immich_mobile/providers/gallery_permission.provider.dart';
@ -330,5 +332,13 @@ class AppRouter extends RootStackRouter {
page: RemoteMediaSummaryRoute.page,
guards: [_authGuard, _duplicateGuard],
),
AutoRoute(
page: LocalTimelineRoute.page,
guards: [_authGuard, _duplicateGuard],
),
AutoRoute(
page: MainTimelineRoute.page,
guards: [_authGuard, _duplicateGuard],
),
];
}

View file

@ -871,6 +871,43 @@ class LocalMediaSummaryRoute extends PageRouteInfo<void> {
);
}
/// generated route for
/// [LocalTimelinePage]
class LocalTimelineRoute extends PageRouteInfo<LocalTimelineRouteArgs> {
LocalTimelineRoute({
Key? key,
required String albumId,
List<PageRouteInfo>? children,
}) : super(
LocalTimelineRoute.name,
args: LocalTimelineRouteArgs(key: key, albumId: albumId),
initialChildren: children,
);
static const String name = 'LocalTimelineRoute';
static PageInfo page = PageInfo(
name,
builder: (data) {
final args = data.argsAs<LocalTimelineRouteArgs>();
return LocalTimelinePage(key: args.key, albumId: args.albumId);
},
);
}
class LocalTimelineRouteArgs {
const LocalTimelineRouteArgs({this.key, required this.albumId});
final Key? key;
final String albumId;
@override
String toString() {
return 'LocalTimelineRouteArgs{key: $key, albumId: $albumId}';
}
}
/// generated route for
/// [LockedPage]
class LockedRoute extends PageRouteInfo<void> {
@ -903,6 +940,22 @@ class LoginRoute extends PageRouteInfo<void> {
);
}
/// generated route for
/// [MainTimelinePage]
class MainTimelineRoute extends PageRouteInfo<void> {
const MainTimelineRoute({List<PageRouteInfo>? children})
: super(MainTimelineRoute.name, initialChildren: children);
static const String name = 'MainTimelineRoute';
static PageInfo page = PageInfo(
name,
builder: (data) {
return const MainTimelinePage();
},
);
}
/// generated route for
/// [MapLocationPickerPage]
class MapLocationPickerRoute extends PageRouteInfo<MapLocationPickerRouteArgs> {