* chore: robust isolation tasks coordination
* give more time for database transaction to clean up
* chore: clean up logs
* chore: clean up logs
* fix: logs
* wip
* album creation
* fix: album api repository no invalidating after logging out
* add linkedRemoteAlbumId column and migration
* link/unlink remote album
* logic to find and add new assets to album
* pr feedback
* add toggle option to backup option page
* refactor: provider > service
* rename
* Handle page pop manually
* UI feedback for user creation and sync linked album
* uncomment migration
* remove unused method
* fix(mobile): Correction of image creation date by using mtime instead of ctime.
* use the timestamps from the asset for uploads
---------
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
* fix: use lock to synchronise foreground and background backup
# Conflicts:
# mobile/lib/domain/services/background_worker.service.dart
# mobile/lib/platform/background_worker_api.g.dart
# mobile/pigeon/background_worker_api.dart
* add timeout to the splash-screen acquire lock
* fix: null check on created date
---------
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
Co-authored-by: Alex <alex.tran1502@gmail.com>
* Enable filteing by example
* Drop `@GenerateSql` for `getEmbedding`?
* Improve error message
* PR Feedback
* Sort en.json
* Add SQL
* Fix lint
* Drop test that is no longer valid
* Fix i18n file sorting
* Fix TS error
* Add a `requireAccess` before pulling the embedding
* Fix decorators
* Run `make open-api`
---------
Co-authored-by: Alex <alex.tran1502@gmail.com>
* fix: retain filter and sort options when pulling to refresh
* chore: use classes to manage state
* chore: format
* chore: refactor to keep local state of filter/sorted albums instead of a global filteredAlbums
* fix: keep sort when page is navigated away and returned
* chore: lint
* chore: format
why is autoformat not working
* fix: default sort direction state
* fix: search clears sorting
we have to cache our sorted albums since sorting is very computationally expensive and cannot be run on every keystroke. For searches, instead of pulling from the list of albums, we now pull from the cached sorted list and then filter which is then shown to the user
* fix: Enables videotimeline in readonly mode
- Enables only the video controls in the bottom bar when readonlyMode is enabled.
- Fixes the message on the app profile bar when readOnlyMode is enabled **but** betaTimeline is not enabled.
Fixes https://github.com/immich-app/immich/issues/21441
Signed-off-by: Sudheer Puthana <Sud-Puth@users.noreply.github.com>
* cleanup bottom bar handling
---------
Signed-off-by: Sudheer Puthana <Sud-Puth@users.noreply.github.com>
Co-authored-by: bwees <brandonwees@gmail.com>
* chore: log name and createdAt of asset on hash failures
* add album name to hash failure logs
---------
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
* fix: handle datetime outside the valid range supported by dart
* add tests for tryFromSecondsSinceEpoch
---------
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
* fix: show "preparing" when sharing in beta timeline
* embed dialog inside of share_action_button
* dont await the share sheet so "preparing" dialog disappears once share sheet presents
this mimics old timeline behavior
* chore: lint
* feat(mobile): Add Kid (Readonly) Mode toggle
This commit introduces a "Kid (Readonly) Mode" feature.
- Adds a `KidModeProvider` to manage the state of Kid Mode.
- Implements a `KidModeCheckbox` widget in the app bar dialog to toggle Kid Mode.
- When Kid Mode is enabled,
- Disables selecting the multigrid & the bottom bar
- Removes the top bar from view
Signed-off-by: Sudheer Puthana <Sud-Puth@users.noreply.github.com>
Reverts the changes to devtools_options.yaml file
Signed-off-by: Sudheer Puthana <Sud-Puth@users.noreply.github.com>
refactor: replace Kid Mode with Readonly Mode
This commit replaces the "Kid Mode" feature with a more generic "Readonly Mode".
- Renamed `KidModeProvider` to `ReadonlyModeProvider`.
- Readonly Mode state is now persisted in app settings.
- Added a new app setting `allowUserAvatarOverride` to toggle read-only mode.
- Updated translations.
- Added a message in the app bar dialog indicating when read-only mode is active.
Signed-off-by: Sudheer Puthana <Sud-Puth@users.noreply.github.com>
Address comments -
- Removes the `allowUserAvatarOverride` setting.
- Hides the bottom gallery bar when read-only mode is enabled.
- Adds an icon on the main app bar when read-only mode is enabled with a snackbar.
Signed-off-by: Sudheer Puthana <Sud-Puth@users.noreply.github.com>
Update to snackbar
- When toggling readonly mode from either the settings or the app bar, a snackbar notification will now appear.
- The readonly mode message in the profile drawer has been restyled.
- The upload button in the app bar is now hidden when readonly mode is enabled.
Signed-off-by: Sudheer Puthana <Sud-Puth@users.noreply.github.com>
Removes clearing of snackbar
Signed-off-by: Sudheer Puthana <Sud-Puth@users.noreply.github.com>
Address Comments
- Consolidated snackbar messages for enabling/disabling readonly mode.
- Ensured the "Select All" icon in asset group titles is hidden in readonly mode.
Signed-off-by: Sudheer Puthana <Sud-Puth@users.noreply.github.com>
Adds in the missing translation keys for readonly_mode
Signed-off-by: Sudheer Puthana <Sud-Puth@users.noreply.github.com>
Fix translation
Signed-off-by: Sudheer Puthana <Sud-Puth@users.noreply.github.com>
Fix check failure for BorderRadius
Signed-off-by: Sudheer Puthana <Sud-Puth@users.noreply.github.com>
Changes:
- Adjusted AppBar background color in readonly mode.
- Removes cross-out pencil icon button in favor of above.
- Hides the "Edit" icon next to date/time, disable description and onTap for people and location when readonly mode is enabled.
Signed-off-by: Sudheer Puthana <Sud-Puth@users.noreply.github.com>
Address comments from Alex
- Moved readonly mode check to `GalleryAppBar` to hide the entire `TopControlAppBar` when readonly mode is enabled.
- Changed `toggleReadonlyMode` in `ImmichAppBar` to directly toggle the state.
Signed-off-by: Sudheer Puthana <Sud-Puth@users.noreply.github.com>
migrate readonly mode to new beta timeline
remove readonly mode from legacy UI
only show readonly functionality when on beta timeline
simplify selection icon
update generated provider
chore: more formatting
* fix: bad merge
* chore: use Notifier for readonlyModeProvider
* fix: drag select now honors readonly mode
* fix: disable asset bottom sheet in readonly
* fix: disable editing user icon when in readonly
* chore: remove generated file
* fix: disable tabs instead entire tab bar
This solves the issues with the scrubber
* chore: remove unneeded import
* chore: lint
* remove unused condition in bottomsheet
---------
Co-authored-by: Brandon Wees <brandonwees@gmail.com>
Co-authored-by: Alex <alex.tran1502@gmail.com>
* - 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>