* update asset to include isArchive property
* Not display archived assets on timeline
* replace share button to archive button
* Added archive page
* Add bottom nav bar
* clean up homepage
* remove deadcode
* improve on sync is archive
* show archive asset correctly
* better merge condition
* Added back renderList to re-rendering don't jump around
* Better way to handle showing archive assets
* complete ArchiveSelectionNotifier
* toggle archive
* remove deadcode
* fix unit tests
* update assets in DB when changing assets
* update asset state to reflect archived status
* allow to archive assets via multi-select from timeline
* fixed logic
* Add options to bulk unarchive
* regenerate api
* Change position of toast message
---------
Co-authored-by: Fynn Petersen-Frey <zoodyy@users.noreply.github.com>
* Added dto, logic to insert description and web implementation
* create text field and update on remote database
* Update description and save changes
* styling
* fix web test
* fix server test
* preserve description on metadata extraction job run
* handle exif info is null situation
* pr feedback
* format openapi spec
* update createAssetDto
* refactor logic to service
* move files
* only owner can update description
* Render description correctly in shared album
* Render description correctly in shared link
* disable description edit for not owner of asset on mobile
* localization and clean up
* fix test
* Uses providers for description text (#2244)
* uses providers for description text
* comments
* fixes initial data setting
* fixes notifier
---------
Co-authored-by: martyfuhry <martyfuhry@gmail.com>
* feat(mobile): improve logging page
* Use new API for share file
* removed unused code
* Better safe area on the home screen
* Added preparing share dialog to home screen
* feat(server): require auth for more endpoints
* dev: add authorization header to profile image on mobile
---------
Co-authored-by: Alex <alex.tran1502@gmail.com>
* fix(mobile): allow syncing duplicate local IDs
* enable to run isar unit tests on CI
* serialize sync operations, add pull to refresh on timeline
---------
Co-authored-by: Fynn Petersen-Frey <zoodyy@users.noreply.github.com>
* Added placeholder for search explore
* refactor immich asset grid to use ref and provider
* all videos page
* got favorites, recently added, videos, and motion videos all using the immich grid
* Fixed issue with hero animations
* theming
* localization
* delete empty file
* style text
* Styling icons
* more styling
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* Use new search API and GridView for Places / Locations
* Fixes search service by adding clip: true
* Rebased from master, uses view all explore grid now
* localized view all button
* adds empty
* style text
* Fix issue with horizontal Things not render due to missing height info
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* shows the owner name of shared albums
* responsive and better names
* rich text
* localization and overflow
* unused import
* adds on tap
* suppress owner name for regular album view
* aspect ratio
* Add some styling to text
* More styling
* Style album thumbnail name
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* feature(mobile): no longer wait for background backup in settings
migrate all Hive boxes required for the backup process to Isar
* add final modifier
* fix: sorted shared album
* Added TODO comment for tomorrow work
* update album shared property after adding user
---------
Co-authored-by: Fynn Petersen-Frey <zoodyy@users.noreply.github.com>
* improves login form
* login form improvements
* correctly trim server endpoint controller text when logging in
* don't show loading while fetching server info
* fixes get server login credentials
* fixes up sign in form
* error handling
* fixed layout
* removed placeholder text
* feature(mobile): sync assets, albums & users to local database on device
* try to fix tests
* move DB sync operations to new SyncService
* clear db on user logout
* fix reason for endless loading timeline
* fix error when deleting album
* fix thumbnail of device albums
* add a few comments
* fix Hive box not open in album service when loading local assets
* adjust tests to int IDs
* fix bug: show all albums when Recent is selected
* update generated api
* reworked Recents album isAll handling
* guard against wrongly interleaved sync operations
* fix: timeline asset ordering (sort asset state by created at)
* fix: sort assets in albums by created at
* rebuilding gridview
* adds listview, gridview and responsive display to backup album selection
* aligned selection info title and chips to the left
* fixed search
* style: album tile
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* adds onboarding
* fixed error where login was taking you to permission page
* fixed a bad rebase and added more checks to not start backup service on login if no gallery permission
* forgot the permission handler import in AppDelegate
* reverts album selection page
* change to ref watch
* added device_info_plus to podspec
* removed unused import
---------
Co-authored-by: Marty Fuhry <marty@fuhry.farm>
* fix(mobile): no album thumbnail lead to no album selection shown
* add more log info
* added global error handling
* better place to init logger
* get more log
* fixed regression where i accidentally removed load translations from the background sync
* only for android
---------
Co-authored-by: Marty Fuhry <marty@fuhry.farm>
* fix(mobile): user get logged out upon clicking on any thing after logging in
* wip: fixing still
* fix: the actual issue
* Fix: avaialble album not updating UI
* first run of getting background sync working in iOS
* got background sync calling into flutter
* added background task
* added necessary sync files
* fixed some names and added more implementations
* got as far as Hive.initFlutter
* brute force got to await Hive.initFlutter
* lots of print statements to figure out where execution is failing, and its failing at the root asset bundle in the localization.dart service
* first time working, got plugins registered
* removed broken cleanup code
* refactored
* linters
* now can pass user settings
* background service plugin uses app background processing instead of fetch
* renamed backgroundFetch to backgroundProcessing to make it clearer
* don't use max delay
* adds fetch back in
* fixes require charging default values and backup controller page
* fixes background fetch
* fixes ios not importing photos
* guarded path provider ios
* lint
* adds max tries for heartbeat to work in iOS
* fail after seconds
* timeout instead of fail after seconds
* removes release lock from system stop
* restores checkLockReleasedWithHeartbeat to Future<void>
* removes max tries from acquire lock
* fixes lock timeout with iOS
* restored for loop
* adds comments, made the AppRefresh task only run while not requiring network or charge
* fixed compile issue
* now both are registered and added better comments. also added ability for task to cancel itself
* added the podfile and pubspec
* added backup diagnostics to IOS and removed iOS ignored backup options and fixed network connectivity always required
* Added Alex's dev team
* styled debug list item, fixed refresh task not set bug, fixed enable / disable background service on platform channel
---------
Co-authored-by: Marty Fuhry <marty@fuhry.farm>
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* fix: add correct relations to asset typeorm entity
* fix: add missing createdAt column to asset entity
* ci: run check to make sure generated API is up-to-date
* ci: cancel workflows that aren't for the latest commit in a branch
* chore: add fvm config for flutter
* uses profile photo for user avatar drawer
* Added some styling to the profile picture
* made the whole profile photo a gesture detector
* fixed image updating
* invalidates cachednetworkimage when new profile photo is uploaded
* Revert "invalidates cachednetworkimage when new profile photo is uploaded"
This reverts commit 17c83be556.
* Add fadeInImage to loading user profile
---------
Co-authored-by: Alex <alex.tran1502@gmail.com>
* Group by date objects instead of strings
* Change OpenAPI code generation to wrap json decoding in
Change OpenAPI code generation to wrap decodeJson in compute
* Remove orig file
* Fix linter error
* Change drag handle date format
* Order timeline explictly from new to old
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* Try staggered layout for home page
* Introduce setting for dynamic layout
* Fix some provider related bugs
* Make asset grouping configurable
* Add translation keys, refactor group title
* Rename enum values
* Fix enum names
* Reformat long if statement
* Fix timezone related bug
* Minor clean up
* Fix unit test
* Add second assets check back to home screen
* refactor(mobile): add Isar DB & Store class
new Store: globally accessible key-value store like Hive (but based on Isar)
replace first few places of Hive usage with the new Store
* reduce max. DB size to prevent errors on older iOS devices
---------
Co-authored-by: Alex <alex.tran1502@gmail.com>
* chore(mobile): invoke logout() on mobile app
* feat: add mechanism to delete token from logging out endpoint
* fix: set state after login sequence success
* fix: not removing token when logging out from OAuth
* fix: prettier
* refactor: using accessTokenId to delete
* chore: pr comments
* fix: test
* fix: test threshold
* removed stay logged in checkbox and made it enabled by default
* adds padding to login button
* removed all isSaveLogin
* fix: logout would re-login with previous credential upon app restart
---------
Co-authored-by: Alex <alex.tran1502@gmail.com>
* Add album sorting
* Change AppBar to match photos page behaviour
* Add buttons
* First crude implementation of the favorites page
* Clean up
* Add favorite button
* i18n
* Add star indicator to thumbnail
* Add favorite logic to separate provider and fix favorite behavior in album
* Review feedback (Add isFavorite variable)
* dev: style buttons
* dev: styled drop down button
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* fullscreen image effects
* toggles app bar instead of hides on tap
* edgeToEdge mode to render beneath navbar on android
* fixed appbar size
* fixed safearea for video and added opacity to appbar in gallery
* wrapped in black container to fix artifact on iOS
* changed to black
* added scaffold back woops
* photoviewgallery
* stiffer scrolling to react more like google photos
* adds a dx threshhold for the swipe/up down from the original dropped point
* stopped wrapping imageview in gallery viewer to avoid the double photoview issue. breaks imageview page pinch-to-zoom, so i need to fix that for other callers
* refactors gallery view to use remoteimage directly and breaks imageviewpage
* removed image_viewer_page
* adds minscale
* adds photo_view to repository
* double tap to zoom out with hacked commit
* double tapping!
* got up and down swipe gestures working
* fixed wrong cache and headers in image providers
* fixed image quality and added videos back in
* local loading asset image fix
* precaches images
* fixes lint errors
* deleted remote_photo_view and more linters
* fixes scale
* load preview and load original
* precache does original / preview as well
* refactored image providers to nice functions and added JPEG thumbnail format to remote image thumbnail lookup
* moved photo_view to shared/ui/
* three stage loading with webp and fixes some thumbnail fits
* fixed local thumbnail
* fixed paging in iOS
* fixes back button multiselection on android in main timeline
* back button on multiselect in album clears selection
* fixed homepage back and refactor future
* not a futureOr
* add to album from asset detail view
* layout and design
* added shared albums
* fixed remote, asset update, and hit test
* made static size
* fixed create album
* suppress shared expansion tile if there are no shared albums
* updates album
* padding on tile
* Add integration tests for the login process
* Reorganize tests
* Test wrong instance URL
* Run mobile unit tests in CI
* Fix CI
* Pin Flutter Version to 3.3.10
* Push something stupid to re-trigger CI
* feat(.well-known): add .well-known/immich to reference API endpoint
* feat(.well-known): make schema optional (defaults to https)
* adjust method comment to be a little less confusing
* fix casting issue with resovled url
* include when checking Well-known, update server hint
* add validation for login form's server url
* consolidate common process into resolveAndSetEndpoint
* fix missed prettier formatting
* revert translation changes
* update environment variable description, hopefully a bit clearer
* rename environment variable to IMMICH_API_URL_EXTERNAL
* comment out optional env variables
* fix(web): browser-side api client to include authorization token
* Revert "fix(web): browser-side api client to include authorization token"
This reverts commit 60e338938f.
* remove multi-domain related changes
* Improve scroll performance by introducing repaint boundaries and moving more calculations to providers.
* Add error handing for malformed dates.
* Remove unused method
* Use compute in different places to improve app performance during heavy tasks
* Fix test
* Refactor `List<RenderAssetGridElement>` to separate `RenderList` class and make `fromAssetGroups` a static method of this class.
* Fix loading indicator bug
* Use provider directly
* `RenderList` refactoring
* `AssetNotifier` refactoring
* Move `combine` to static private method
* Extract compute methods in cache services to static private methods.
* Use `tryParse` instead of `parse` with try/catch for dates.
* Fix bug in caching mechanism.
* Fixed state not being used to trigger conditional rendering
* styling
* Corrected state
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* refactor(server): device info service
* use upsertDeviceInfo in mobile app
* fix: return types and dedupe code
Co-authored-by: Fynn Petersen-Frey <zoodyy@users.noreply.github.com>
* feat(mobile): use cached asset info if unchanged instead of downloading all assets
This adds an HTTP ETag to the getAllAssets endpoint and client-side support in the app.
If locally cache content is identical to the content on the server, the potentially large list of all assets does not need to be downloaded.
* use ts import instead of require
* Added return type for oauth/callback
* Remove console.log
* Redirect app
* Wording
* Added loading state change
* Added OAuth login on mobile
* Return correct status for correct redirection
* Auto discovery OAuth Login
* introduce Asset as composition of AssetResponseDTO and AssetEntity
* filter out duplicate assets (that are both local and remote, take only remote for now)
* only allow remote images to be added to albums
* introduce ImmichImage to render Asset using local or remote data
* optimized deletion of local assets
* local video file playback
* allow multiple methods to wait on background service finished
* skip local assets when adding to album from home screen
* fix and optimize delete
* show gray box placeholder for local assets
* add comments
* fix bug: duplicate assets in state after onNewAssetUploaded
* First implementation that uses new API
* Various UI improvements
* Create new album from home screen
* Fix padding when in multiselect mode
* Alex Suggestions
* Change to album after creation
* settings to configure upload progress notifications (none/standard/detailed)
* use native Android notifications to show progress information
* e.g. 50% (30/60) assets
* e.g. Uploading asset XYZ - 25% (2/8MB)
* no longer show errors if canceled by system (losing network)
Implemented a mechanism to extract the correct time zone from the GPS coordinate if presented in the file's EXIF, and to convert the timestamp to the correct UTC time so that the time will show correctly based on the mobile/web local time zone.
This change greatly reduces the chance that a backup is not performed
when a new photo/video is made.
Instead of combining the change trigger and additonal constraints (wifi
or charging) into a single worker, these aspects are now separated.
Thus, it is now reliably possible to take pictures while the wifi
constraint is not satisfied and upload them hours/days later once
connected to wifi without taking a new photo.
As a positive side effect, this simplifies the error/retry handling
by directly leveraging Android's WorkManager without workarounds.
The separation also allows to notify the currently running BackupWorker
that new assets were added while backing up other assets to also upload
those newly added assets.
Further, a new tiny service checks if the app is killed, to reschedule
the content change worker and allow to detect the first new photo.
Bonus: The home screen now shows backup as enabled if background backup
is active.
* use separate worker/task for listening on changed/added assets
* use separate worker/task for performing the backup
* content observer worker enqueues backup worker on each new asset
* wifi/charging constraints only apply to backup worker
* backupworker is notified of assets added while running to re-run
* new service to catch app being killed to workaround WorkManager issue
* Use custom caches in all modules
* Cache Settings
* Fix wrong key
* Create custom cache repository based on hive
* Show cache usage in settings
* Show cache sizes
* Change settings ranges and default value
* Handle cache clear by operating system
* Resolve review comments
* show notifications on background backup errors
* settings page to configure (background backup error) notifications
* persist time since failed background backup
* fix darkmode slider color
* Add settings options for number of assets per row and storage indicator
* Add attributes to enum to avoid duplicate code
* Also apply customizations to albums
* Minor Refactorings
* Three stage loading i18n fix
* properly done background backup service
* new concurrency/locking management with heartbeat
fix communication erros with Kotlin plugin on start/stop service methods
better error handling for BackgroundService public methods
Add default notification message when service is running
* configurable WiFi & charging requirement for service
* use translations in background service
* styling light and dark theme
* Icon topbar
* Fixed app bar title dark theme
* Fixed issue with getting thumbnail for things
* Refactor sharing page
* Refactor scroll thumb
* Refactor chip in auto backup indiation button
* Refactor sharing page
* Added theme toggle
* Up version for testflight build
* Refactor backup controller page
* Refactor album selection page
* refactor album pages
* Refactor gradient color profile header
* Added theme switcher
* Register app theme correctly
* Added locale to the app
* Added translation key
* Styling for bottomsheet colors
* up server version
* Fixed font size
* Fixed overlapsed sliverappbar on photos screen
* Refactor profile drawer to sub component
* Added setting page, routing with some options
* Added setting service
* Implement three stage settings
* get app setting for three stage loading
* Change API to return assets count and change web behavior accordingly
* Refactor assets.length
* Explicitly declare type of assetCount so Dart SDK understand it
* Finished refactoring on mobile
* First performance tweaks (caching and rendering improvemetns)
* Revert asset response caching
* 3-step image loading in asset viewer
* Prevent panning and zooming until full-scale version is loaded
* Loading indicator
* Adapt to gallery PR
* Cleanup
* Dart format
* Fix exif sheet
* Disable three stage loading until settings are available
* Refactor sharing to album
* Added library page in the bottom navigation bar
* Refactor SharedAlbumService to album service
* Refactor apiProvider to its file
* Added image grid
* render album thumbnail
* Using the wrap to render thumbnail and album info better
* Navigate to album viewer
* After deletion, navigate to the respective page of the shared and non-shared album
* Correctly remove album in local state
* Refactor create album page
* Implemented create non-shared album
* Added context menu for album opionts
* choose asset for album thumbnail
* Refactor UpdateAlbumDto to accept albumThumbnailAssetId
* implemented changing album cover on web
* Fixed api change on mobile app
* Added album page
* Refactor sidebar
* Added album assets count info
* Added album viewer page
* Refactor album sorting
* Fixed incorrectly showing selected asset in album selection
* Improve fetching speed with prefetch
* Refactor to use ImmichThubmnail component for all
* Update to the latest version of Svelte
* Implement fixed app bar in album viewer
* Added shared user avatar
* Correctly get all owned albums, including shared
* feat(mobile) added french translations
* fix(mobile) added missing translation tag for search_no_objects (EN,DE,FR)
* fix(mobile) renamed search_no_objects to search_page_no_objects
* Add i18n framework to mobile app and write simple translation generator
* Replace all texts in login_form with i18n keys
* Localization of sharing section
* Localization of asset viewer section
* Use JSON as base translation format
* Add check for missing/unused translation keys
* Add localizely
* Remove i18n directory in favour of localizely
* Backup Translation
* More translations
* Translate home page
* Translation of search page
* Translate new server version announcement
* Reformat code
* Fix typo in german translation
* Update englisch translations
* Change translation keys to match dart filenames
* Add /api to translated endpoint_urls
* Update localizely.yml
* Add languages to ios plist
* Remove unused keys
* Added script to check outdated key in other translations
* Add download key to localizely.yml
Co-authored-by: Alex <alex.tran1502@gmail.com>
* Remove thumbnail generation on mobile
* Remove tconditions for missing thumbnail on the backend
* Remove console.log
* Refactor queue systems
* Convert queue and processor name to constant
* Added corresponding interface to job queue