* - add addAssetIdsToAlbums to album repo
- update albumService to determine all albums and assets with access and coalesce into one set of album_assets to insert
* - remove hasAsset check (unnecessary)
* - lint
* - cleanup
* - remove success counts from addAssetsToAlbums results
- Fix tests
* open-api
* await album update
* add store entity and migration
* make store service take both isar and drift repos
* migrate and switch store on beta timeline state change
* chore: make drift variables final
* dispose old store before switching repos
* use store to update values for beta timeline
* change log service to use the proper store
* migrate store when beta already enabled
* use isar repository to check beta timeline in store service
* remove unused update method from store repo
* dispose after create
* change watchAll signature in store repo
* fix test
* rename init isar to initDB
* request user to close and reopen on beta migration
* fix tests
* handle empty version in migration
* wait for cache to be populated after migration
---------
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
Co-authored-by: Alex <alex.tran1502@gmail.com>
* skip albums selected or excluded from backups from deletions
* filter empty local albums from library page
---------
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
* platform image providers
* use key
* fix cache manager
* more logs, cancel on dispose instead
* split into separate files
* fix saving to cache
* cancel multi-stage provider
* refactored `getInitialImage`
* only wait for disposal for full images
* cached image works
* formatting
* lower asset viewer ram usage
---------
Co-authored-by: Alex <alex.tran1502@gmail.com>
* feat(mobile): shared album activities
* add like buttons and fix behavior of unliking
* fix: conditionally show activity button and fix title truncations
* fix(mobile): newest/oldest album sort (#20743)
* fix(mobile): newest/oldest album sort
* chore: use sqlite to determine album asset timestamps
* Fix missing future
Co-authored-by: Alex <alex.tran1502@gmail.com>
* fix: async handling of sort
* chore: tests
* chore: code review changes
* fix: use created at for newest asset
* fix: use localDateTime for sorting
* chore: cleanup
* chore: use final
* feat: loading indicator
---------
Co-authored-by: Alex <alex.tran1502@gmail.com>
---------
Co-authored-by: Alex <alex.tran1502@gmail.com>
* fix(mobile): newest/oldest album sort
* chore: use sqlite to determine album asset timestamps
* Fix missing future
Co-authored-by: Alex <alex.tran1502@gmail.com>
* fix: async handling of sort
* chore: tests
* chore: code review changes
* fix: use created at for newest asset
* fix: use localDateTime for sorting
* chore: cleanup
* chore: use final
* feat: loading indicator
---------
Co-authored-by: Alex <alex.tran1502@gmail.com>
* feat: use drift for logging
* fix: tests
* feat: use the truncate limit from constants.ts as default
* chore: move setupAll to top level and restructure
* chore: code review changes
* fix: inherits
* feat: raise log line limit to 2000
* limit getAll to 250 lines
* delete DLog and make LogRepository not a singleton
* fix: drift build settings and `make migration`
* fix: tests
* remove sensitive log
---------
Co-authored-by: Alex <alex.tran1502@gmail.com>
* fix: server version not fetched after auto login
* wrap get info with a try catch
---------
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
* feat: remove from album in asset viewer bar
* chore: move button to bottom bar instead of bottom sheet
* move back to bottom sheet
---------
Co-authored-by: Alex <alex.tran1502@gmail.com>
* fix: expand sheet when album search is focused
* convert GeneralBottomSheet to ConsumerStatefulWidget
* fix: cleaning up
---------
Co-authored-by: Alex <alex.tran1502@gmail.com>
* fix(mobile): disable memory lane when memories are disabled
* Update main_timeline.page.dart
* fix: formatting
---------
Co-authored-by: Alex <alex.tran1502@gmail.com>
* fix: use storageIndicator setting for beta timeline
* fix: reactively update the storage indicator icons when setting is changed
* Update drift_trash.page.dart
* override to bool for storageIndicator
- App will now kick off hashing after local sync if the lifecycle is in resumed or active state
- We now wait for hashing to complete before we kick off the upload process
* feat: drift edit time and date action
* feat: add edit button on asset viewer bottom sheet
* update localDateTime column in addition to createdAt to keep consistency
* fix: dont update local dateTime
Server calcs this anyway and it will be synced when the change is applied. We don't use localDateTime on mobile so there is no reason to update this value
* fix: padding around edit icon in ListTile
Co-authored-by: shenlong <139912620+shenlong-tanwen@users.noreply.github.com>
* chore: format
* fix: hide date edit control when asset does not have a remote
* fix: pull timezones correctly from image
---------
Co-authored-by: shenlong <139912620+shenlong-tanwen@users.noreply.github.com>
* fix(download): handle completed downloads and refresh albums
* fix(download): remove use of outdated AlbumService
---------
Co-authored-by: Peter Ombodi <peter.ombodi@gmail.com>
* fix user icons in album view
* revert updateUsersV1 change
* fix: UserDto merge issues
* fix: update user entity
* revert what I thought were merge issues
turns out drift cant figure out when it needs to gen a file...
* fix removed line
* handle defaults for older servers
* feat: checkpoint migrations
* fix: use parenthesis instead of brackets
* Update 1753800911775-ProfileImageCheckpointRemoval.ts
* fix: sync stream updateUsersV1
fix: show missing local assets in timeline with partner sharing
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
Co-authored-by: Alex <alex.tran1502@gmail.com>
* fix: android widget updates
* ensure periodic work is queued when we receive an update
This will not "reset the clock" on the periodic work since we are using ExistingPeriodicWorkPolicy.UPDATE. This is needed since existing widgets have already been asked to queue their workers. If those periodic workers were overwritten by a widget update request from the app, there is no way to queue them again. onReceive gets run when the app requests a widget update so the periodic workers will get queued again.
* fix: deep links when using the beta timeline
* Update remote_asset.repository.dart
* Update mobile/lib/domain/services/asset.service.dart
Co-authored-by: Alex <alex.tran1502@gmail.com>
* return optional from album get
* do not include trashed assets in album asset count
Co-authored-by: shenlong <139912620+shenlong-tanwen@users.noreply.github.com>
* formatting
---------
Co-authored-by: Alex <alex.tran1502@gmail.com>
Co-authored-by: shenlong <139912620+shenlong-tanwen@users.noreply.github.com>
I ran into this while testing out
<https://github.com/immich-app/immich/pull/19830>. When I add, change,
or remove a client certificate under Immich's advanced settings, the
change wouldn't take effect until some mysterious point in the future.
For example:
1. Add a client certificate. It doesn't get used.
2. Remove certificate. *Now* the client certificate from step 1) is used.
3. Restart application. Now no client certificate is used.
This all boils down to some missing `await`s. The user would change the
cert, and we'd start asynchronously saving it to the store, and while
the save is still happening, [`HttpSSLOptions` pulls the "old" value out of
`SSLClientCertStoreVal`](https://github.com/immich-app/immich/blob/v1.136.0/mobile/lib/utils/http_ssl_options.dart#L30).
With the appropriate `await`s, this behaves much more sanely.
* show only local assets from albums selected for backup
# Conflicts:
# mobile/lib/infrastructure/repositories/db.repository.drift.dart
* ignore backup selection
* fix: backup album ownerId
* fix: backup album ownerId
* only show local only assets that are selected for backup
* add index on visibility and backup selection
* fix: video not playing in search view
* remove safe area from bottom bar
* refactor stack count with a CTE and local asset with a SELECT
* fix lint
* remove redundant COALESCE
* remove stack count from main timeline query
---------
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
Co-authored-by: Alex <alex.tran1502@gmail.com>
* remove safe area from bottom bar
* fix: video not playing in search view
* stop foreground / background back on migration
---------
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
* - add component
- update server's StackCreateDto for merge parameter
- Update stackRepo to only merge stacks when merge=true (default)
- update web action handlers to show stack changes
* - make open-api
* lint & format
* - Add proper icon to 'remove from stack'
- change web unstack icon to image-off-outline
* - cleanup
* - format & lint
* - make open-api: StackCreateDto merge optional
* initial addition of new endpoint
* remove stack endpoint
* - fix up remove stack endpoint
- open-api
* - Undo stackCreate merge parameter
* - open-api typescript
* open-api dart
* Tests:
- add tests
- update assetStub.imageFrom2015 to have required stack attributes to include it with tests
* update event name
* Fix event name in test
* remove asset_update check
* - merge stack.removeAsset params into one object
- refactor asset existence check (no need for asset fetch)
- fix tests
* Don't return updated stack
* Create specialized stack id & primary asset fetch for asset removal checks
* Correct new permission names
* make sql
* - fix open-api
* - cleanup
* fix: reduce asset_viewer reloads
* limit the result of watch asset to one
* fix null reference in map thumbnail
* bump hash file limit to 256
---------
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
Co-authored-by: Alex <alex.tran1502@gmail.com>
* show beta sync stats
* show status next to jobs
* use drift devtools reset database impl
* dcm fixes
* fix: hash count
* styling
---------
Co-authored-by: Alex <alex.tran1502@gmail.com>
* do not migrate again on app start
* migrate backup albums over to sqlite
---------
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
* wip
* wip widgets
* more wip changes
* latest changes
* working random widget
* cleanup
* add configurable widget
* add memory widget and cleanup of codebase
* album name handling
* add deeplinks
* finish minor refactoring and add some polish :)
* fix single shot type on random widget
Co-authored-by: shenlong <139912620+shenlong-tanwen@users.noreply.github.com>
* switch to ExposedDropdownMenuBox for random configure activity
* handle empty album and no connection edge cases
* android project cleanup
* fix proguard and gson issues
* fix deletion handling
* fix proguard stripping for widget model classes/enums
* change random configuration activity close to a checkmark on right side
---------
Co-authored-by: shenlong <139912620+shenlong-tanwen@users.noreply.github.com>
* feat: add toggle to switch between Isar and Sqlite
* reset sqlite on beta
* start sync on app open in new timeline
* fix lint
* migrate hashes when new timeline is selected
* migrate hashes immediately after beta is enabled
* show loading indicator in change timeline page
* some stylings
* fix some styling issue
* release resources on isolate close
* replace route and styling
* handle migration back to old timeline
* check if a provider is mounted before calling dispose on it
* styling
* styling and button
---------
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
* fix: _shouldUseLocalAsset check
* show storage indicators in local album view
* update local thumb provider to work with remote asset
* update checks
* do not show upload button when selection is only merged assets
---------
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
Co-authored-by: Alex <alex.tran1502@gmail.com>
* improvements to error handling, ability to select "Favorites" as a virtual album, fix widgets not showing image when tinting homescreen
* dont include isFavorite all the time
* remove check for if the album exists
this will never run because we default to Album.NONE and its impossible to distinguish between no album selected and album DNE (we dont know what the store ID is, only what iOS gives)
* feat(mobile): drift place page
* merge main
* feat(mobile): drift place detail page (#19915)
---------
Co-authored-by: Alex <alex.tran1502@gmail.com>
* feat(mobile): hide storage indicator outside main timeline
* fix: lint
* set default as false
---------
Co-authored-by: Alex <alex.tran1502@gmail.com>
* image thumbnail refactor
* minor const-ification in new thumbnail tile
* underscore helper classes
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* cache the last image an ios widget fetched and use if a fetch fails in a future timeline build
* code review fixes
* downgrade pbx for flutter
* use cache in snapshots
* fix: run reload within a mutex
* change total assets before emitting the reload event
---------
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* feat: video player
* use remote asset id in local query
* fix: error from pre-caching beyond total assets
* fix: flipped local videos
* incorrect aspect ratio on iOS
* ignore other storage id during equals check
---------
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
* initial attempt at new guard
* do not resolve the route when replaced
* Update gallery_guard.dart comment
---------
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
* feat(mobile): drift local albums page
* fix: lint
* refactor: use AsyncValue
* fix: lint
* local album thumbnail
---------
Co-authored-by: Alex <alex.tran1502@gmail.com>
* feat(mobile): drift archive page
* fix: lint
* feat: include local indicator
* remove join in bucket
* remove showing local indicator in bucket
---------
Co-authored-by: Alex <alex.tran1502@gmail.com>
Co-authored-by: alex <alex@localhost-live.localdomain>
* reduce timeline rebuilds
* feat: adds bottom sheet map and actions (#19692)
* adds bottom sheet map and actions
* PR feedbacks
* only reload the asset viewer if asset is changed
* styling tweak
---------
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
Co-authored-by: Alex <alex.tran1502@gmail.com>
* rename singleton and remove event prefix
* adds bottom sheet map and actions
* PR feedbacks
* refactor: use provider for viewer state
* feat: adds top and bottom app bar
* add safe area to bottom app bar
* change app and bottom bar color
* viewer - always have black background
* use the full width for the bottom sheet on landscape as well
* constraint the bottom sheet to not expand all the way
* add padding for location details in landscape
---------
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
Co-authored-by: Alex <alex.tran1502@gmail.com>
* add full image provider and refactor thumb providers
* photo_view updates
* wip: asset-viewer
* fix controller dispose on page change
* wip: bottom sheet
* fix interactions
* more bottomsheet changes
* generate schema
* PR feedback
* refactor asset viewer
* never rotate and fix background on page change
* use photoview as the loading builder
* precache after delay
* claude: optimizing rebuild of image provider
* claude: optimizing image decoding and caching
* use proper cache for new full size image providers
* chore: load local HEIC fullsize for iOS
* make controller callbacks nullable
* remove imageprovider cache
* do not handle drag gestures when zoomed
* use loadOriginal setting for HEIC / larger images
* preload assets outside timer
* never use same controllers in photo-view gallery
* fix: cannot scroll down once swipe with bottom sheet
---------
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
Co-authored-by: Alex <alex.tran1502@gmail.com>
* feat(mobile): add album asset sync
* add SyncAlbumToAssetDeleteV1 to openapi-spec
* update delete queries to use where in statements
* clear remote album when clear remote data
* fix: bad merge
* fix: bad merge
* fix: _SyncAckV1 return type
---------
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
Co-authored-by: wuzihao051119 <wuzihao051119@outlook.com>
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
do not skip cloud albums during local sync
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
Co-authored-by: Alex <alex.tran1502@gmail.com>
wip: fix album asset exif and some other refactorings
feat: add album assets sync
feat: album to assets relation sync
Co-authored-by: Zack Pollard <zackpollard@ymail.com>
* feat: sliver appbar
* feat: snapping segment
* Date label font size
* lint
* fix: scrollController reinitialize multiple times
* feat: tab navigation
* chore: refactor to private widget
* feat: new control bottom app bar
* bad merge
* feat: sliver control bottom app bar
* feat: working widgets
* chore/feat: cleaned up API, added album picker to random widget
* album filtering for requests
* check album and throw if not found
* fix app IDs and project configuration
* switch to repository/service model for updating widgets
* fix: remove home widget import
* revert info.plist formatting changes
* ran swift-format on widget code
* more formatting changes (this time run from xcode)
* show memory on widget picker snapshot
* fix: dart changes from code review
* fix: swift code review changes (not including task groups)
* fix: use task groups to run image retrievals concurrently, get rid of do catch in favor of if let
* chore: cleanup widget service in dart app
* chore: format swift
* fix: remove comma
why does xcode not freak out over this >:(
* switch to preview size for thumbnail
* chore: cropped large image
* fix: properly resize widgets so we dont OOM
* fix: set app group on logout
happens on first install
* fix: stupid app ids
* fix: revert back to thumbnail
we are hitting OOM exceptions due to resizing, once we have on-the-fly resizing on server this can be upgraded
* fix: more memory efficient resizing method, remove extraneous resize commands from API call
* fix: random widget use 12 entries instead of 24 to save memory
* fix: modify duration of entries to 20 minutes and only generate 10 at a time to avoid OOM
* feat: toggle to show album name on random widget
* Podfile lock
---------
Co-authored-by: Alex <alex.tran1502@gmail.com>
* re-write localization service and add translation extension
* Revert "re-write localization service and add translation extension"
This reverts commit fdd7386020.
* fix can't use context for easy_localization
* fix lint
* update new translate context
* handle context null
* revert main file
* Revert "revert main file"
This reverts commit 16faca46d0.
* remove fix nested MaterialApp
* change use t extenstion and remove translation utils
* update function call similar for consistently
---------
Co-authored-by: dvbthien <dvbthien@gmail.com>
* WIP: adding screen reader support to mobile
* implemented getAltText
* implemented alt text solution that stores the alt text in the DB, which isn't really great
* moved alt text computation to immich_thumbnail.dart
* added unit tests
* revert unintended changes
* Added text to remaining buttons in Photo page
* fixed import
* Fixed issue of easy_localization not parsing select blocks
* Transferred the new screen reader help to web frontend
* remove unused property
* npm run format:fix
* code review
* revert unwanted change
* dart fmt
* revert web changes
---------
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
* feat(mobile): Add Scrollbar for vertical scrolling on the actions button of a selected asset.
* fixed error scroll position and add more space for the scrollbar
* revert scrollbar change and display always 5.5 icons button
* minWidth set to 5.5 and used
* fix: logic and fine tuning
---------
Co-authored-by: Alex <alex.tran1502@gmail.com>