Compare commits

...

34 Commits

Author SHA1 Message Date
LeLunZ
afc470e8f4 Merge remote-tracking branch 'upstream/main' into feature/load-previews 2026-04-22 00:56:53 +02:00
Luis Nachtigall
793a7054fb fix(mobile): thumbnail transition to asset viewer (#27850) 2026-04-21 15:54:40 -05:00
Luis Nachtigall
3a874dd441 fix(mobile): enable autoplay for motion photos in video viewer (#27961) 2026-04-21 15:53:21 -05:00
Luis Nachtigall
3dc7dc93d8 fix(mobile): clear local data on forced logout (#27957) 2026-04-21 15:52:00 -05:00
Yaros
70397dc5a6 fix(mobile): zero exposure (#28017) 2026-04-21 15:47:27 -05:00
Jason Rasmussen
a16d233a0c chore(web): sort imports (#27922)
* feat: sort imports

* fix: something?
2026-04-21 14:51:38 -04:00
Daniel Dietzler
bb0872afef chore: upgrade sql-tools (#27885) 2026-04-21 17:42:27 +00:00
Freddie Floydd
b9ca68f6e4 chore(web): rename components to PascalCase (#28013)
chore: rename components to PascalCase
2026-04-21 12:29:42 -04:00
Daniel Dietzler
837305da7e chore: un-skip tests (#28012) 2026-04-21 12:08:23 -04:00
Daniel Dietzler
e20fb44142 fix: web navigation/animation regression (#28011) 2026-04-21 14:51:37 +00:00
renovate[bot]
c2786978cd fix(deps): update typescript-projects (#28008)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Daniel Dietzler <mail@ddietzler.dev>
2026-04-21 15:29:34 +02:00
renovate[bot]
312bb91a4f chore(deps): update github-actions (#28005)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-04-21 13:35:55 +02:00
renovate[bot]
c1934b904c chore(deps): update dependency opentofu to v1.11.6 (#27999)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-04-21 13:31:16 +02:00
renovate[bot]
47752d158a fix(deps): update dependency @mapbox/mapbox-gl-rtl-text to v0.4.0 (#28007)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-04-21 13:25:30 +02:00
renovate[bot]
6267322b9c chore(deps): update dependency exiftool-vendored to v35.17.0 (#28004)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-04-21 13:08:12 +02:00
renovate[bot]
93c3cd49f3 chore(deps): update node.js to v24.15.0 (#28006)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-04-21 09:47:32 +00:00
renovate[bot]
f52825ab08 chore(deps): update prom/prometheus docker digest to 5550dc6 (#27998)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-04-21 11:23:24 +02:00
renovate[bot]
d74dc74f92 chore(deps): update dependency terragrunt to v1.0.1 (#28002)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-04-21 11:23:07 +02:00
Luis Nachtigall
539a39ae49 refactor(mobile): Migrate durationInSeconds to durationMs (#26615) 2026-04-20 23:28:11 -04:00
Daniel Dietzler
f68cd424a7 chore: tags styling (#27984) 2026-04-20 22:06:43 -05:00
Alex
20c0cc7e73 fix: show neon light (#27994) 2026-04-20 20:12:54 -04:00
Aki Hakune
be1b9a5f67 feat(server): add MPO file type support (#27963)
* feat(server): add MPO file type support

* fix(server): document description error
2026-04-20 17:45:53 -04:00
shenlong
d9011c0829 refactor: test organisation and service test (#27991)
* refactor: test organisation

# Conflicts:
#	mobile/test/unit/utils/editor_test.dart

* regroup hash_service_test

---------

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2026-04-20 17:45:20 -04:00
shenlong
f909648bce chore: pump flutter to 3.41.7 (#27990)
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2026-04-20 14:51:27 +00:00
Min Idzelis
c78b1d8ab4 fix(web): prevent interaction with detail panel behind person side panel (#27309) 2026-04-20 15:26:06 +02:00
Jason Rasmussen
94a34436a3 chore: remove unused packages & code (#27925) 2026-04-20 08:39:46 -04:00
shenlong
0eef15a3ab chore(mobile): minor dependency updates (#27949)
* chore: minor dependency updates

* regenerate pod and remove unused imports

---------

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2026-04-19 11:56:39 -05:00
shenlong
6982896549 feat: android periodic work manager task (#23563)
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2026-04-19 11:55:07 -05:00
Matthew Momjian
2c812a2561 fix(docs): helmet file affected containers (#27939)
fix helmet file
2026-04-18 12:19:39 -04:00
Mert
0b1188e42e chore(server): separate ffmpeg arguments (#27937)
separate arguments
2026-04-18 15:33:44 +00:00
Freddie Floydd
be20cd2bf9 chore(web): bump svelte-check version to silence big warning stack trace (#27935)
chore: bump svelte-check version to silence big warning log
2026-04-18 14:42:47 +00:00
LeLunZ
b156ae46b6 fix: don't clear cachedOperation in whenComplete listener 2026-04-12 14:54:05 +02:00
LeLunZ
67b1a9d99e fix: simplify request assignment in local image provider 2026-04-12 14:50:44 +02:00
LeLunZ
d4f7c2ae0a feat(mobile): implement load preview setting in asset viewer 2026-04-12 12:52:40 +02:00
601 changed files with 18873 additions and 3904 deletions

2
.github/.nvmrc vendored
View File

@@ -1 +1 @@
24.14.1
24.15.0

View File

@@ -103,7 +103,7 @@ jobs:
- name: Restore Gradle Cache
id: cache-gradle-restore
uses: actions/cache/restore@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4
uses: actions/cache/restore@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
with:
path: |
~/.gradle/caches
@@ -160,7 +160,7 @@ jobs:
- name: Save Gradle Cache
id: cache-gradle-save
uses: actions/cache/save@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4
uses: actions/cache/save@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
if: github.ref == 'refs/heads/main'
with:
path: |
@@ -210,7 +210,7 @@ jobs:
working-directory: ./mobile
- name: Setup Ruby
uses: ruby/setup-ruby@e65c17d16e57e481586a6a5a0282698790062f92 # v1.300.0
uses: ruby/setup-ruby@7372622e62b60b3cb750dcd2b9e32c247ffec26a # v1.302.0
with:
ruby-version: '3.3'
bundler-cache: true

View File

@@ -24,7 +24,7 @@ jobs:
persist-credentials: false
- name: Check for breaking API changes
uses: oasdiff/oasdiff-action/breaking@e6faebce24cf20ac38653d0d2c7f4aa80aaafc79 # v0.0.38
uses: oasdiff/oasdiff-action/breaking@f8cb9308b42121e793f835bd14c0b8090420430c # v0.0.39
with:
base: https://raw.githubusercontent.com/${{ github.repository }}/main/open-api/immich-openapi-specs.json
revision: open-api/immich-openapi-specs.json

View File

@@ -57,7 +57,7 @@ jobs:
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@c10b8064de6f491fea524254123dbe5e09572f13 # v4.35.1
uses: github/codeql-action/init@95e58e9a2cdfd71adc6e0353d5c52f41a045d225 # v4.35.2
with:
languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file.
@@ -70,7 +70,7 @@ jobs:
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# If this step fails, then you should remove it and run the build manually (see below)
- name: Autobuild
uses: github/codeql-action/autobuild@c10b8064de6f491fea524254123dbe5e09572f13 # v4.35.1
uses: github/codeql-action/autobuild@95e58e9a2cdfd71adc6e0353d5c52f41a045d225 # v4.35.2
# Command-line programs to run using the OS shell.
# 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
@@ -83,6 +83,6 @@ jobs:
# ./location_of_script_within_repo/buildscript.sh
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@c10b8064de6f491fea524254123dbe5e09572f13 # v4.35.1
uses: github/codeql-action/analyze@95e58e9a2cdfd71adc6e0353d5c52f41a045d225 # v4.35.2
with:
category: '/language:${{matrix.language}}'

View File

@@ -211,7 +211,7 @@ jobs:
run: 'mise run //deployment:tf apply'
- name: Comment
uses: actions-cool/maintain-one-comment@4b2dbf086015f892dcb5e8c1106f5fccd6c1476b # v3.2.0
uses: actions-cool/maintain-one-comment@909842216bc8e8658364c572ec52100f4c2cc50a # v3.3.0
if: ${{ steps.parameters.outputs.event == 'pr' }}
with:
token: ${{ steps.token.outputs.token }}

View File

@@ -42,7 +42,7 @@ jobs:
run: 'mise run //deployment:tf destroy -- -refresh=false'
- name: Comment
uses: actions-cool/maintain-one-comment@4b2dbf086015f892dcb5e8c1106f5fccd6c1476b # v3.2.0
uses: actions-cool/maintain-one-comment@909842216bc8e8658364c572ec52100f4c2cc50a # v3.3.0
with:
token: ${{ steps.token.outputs.token }}
number: ${{ github.event.number }}

View File

@@ -142,7 +142,7 @@ jobs:
github-token: ${{ steps.generate-token.outputs.token }}
- name: Create draft release
uses: softprops/action-gh-release@153bb8e04406b158c6c84fc1615b65b24149a1fe # v2.6.1
uses: softprops/action-gh-release@3bb12739c298aeb8a4eeaf626c5b8d85266b0e65 # v2.6.2
with:
draft: true
tag_name: ${{ needs.bump_version.outputs.version }}

12
.vscode/settings.json vendored
View File

@@ -13,10 +13,6 @@
"editor.wordBasedSuggestions": "off"
},
"[javascript]": {
"editor.codeActionsOnSave": {
"source.organizeImports": "explicit",
"source.removeUnusedImports": "explicit"
},
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnSave": true
},
@@ -29,18 +25,10 @@
"editor.formatOnSave": true
},
"[svelte]": {
"editor.codeActionsOnSave": {
"source.organizeImports": "explicit",
"source.removeUnusedImports": "explicit"
},
"editor.defaultFormatter": "svelte.svelte-vscode",
"editor.formatOnSave": true
},
"[typescript]": {
"editor.codeActionsOnSave": {
"source.organizeImports": "explicit",
"source.removeUnusedImports": "explicit"
},
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnSave": true
},

View File

@@ -1 +1 @@
24.14.1
24.15.0

View File

@@ -68,6 +68,6 @@
"micromatch": "^4.0.8"
},
"volta": {
"node": "24.14.1"
"node": "24.15.0"
}
}

View File

@@ -1,6 +1,6 @@
[tools]
terragrunt = "1.0.0"
opentofu = "1.11.5"
terragrunt = "1.0.1"
opentofu = "1.11.6"
[tasks."tg:fmt"]
run = "terragrunt hclfmt"

View File

@@ -85,7 +85,7 @@ services:
container_name: immich_prometheus
ports:
- 9090:9090
image: prom/prometheus@sha256:dda13e28bf95a5e5ca5b8ed56852006094c1c8e8871d9c9dbeed30aa6e55271f
image: prom/prometheus@sha256:5550dc63da361dc30f6fe02ac0e4dfc736ededfef3c8d12a634db04a67824d78
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus-data:/prometheus

View File

@@ -1 +1 @@
24.14.1
24.15.0

View File

@@ -18,6 +18,7 @@ For the full list, refer to the [Immich source code](https://github.com/immich-a
| `JPEG 2000` | `.jp2` | :white_check_mark: | |
| `JPEG` | `.jpeg` `.jpg` `.jpe` `.insp` | :white_check_mark: | |
| `JPEG XL` | `.jxl` | :white_check_mark: | |
| `MPO` | `.mpo` | :white_check_mark: | Multi-Picture |
| `PNG` | `.png` | :white_check_mark: | |
| `PSD` | `.psd` | :white_check_mark: | Adobe Photoshop |
| `RAW` | `.raw` | :white_check_mark: | |

View File

@@ -37,7 +37,7 @@ These environment variables are used by the `docker-compose.yml` file and do **N
| `IMMICH_LOG_FORMAT` | Log output format (`console`, `json`) | `console` | server | api, microservices |
| `IMMICH_MEDIA_LOCATION` | Media location inside the container ⚠️**You probably shouldn't set this**<sup>\*2</sup>⚠️ | `/data` | server | api, microservices |
| `IMMICH_CONFIG_FILE` | Path to config file | | server | api, microservices |
| `IMMICH_HELMET_FILE` | Path to a json file with [helmet](https://www.npmjs.com/package/helmet) options. Set to `false` to disable. Set to `true` to use `server/helmet.json`. | `false` | server | api, microservices |
| `IMMICH_HELMET_FILE` | Path to a json file with [helmet](https://www.npmjs.com/package/helmet) options. Set to `false` to disable. Set to `true` to use `server/helmet.json`. | `false` | server | api |
| `NO_COLOR` | Set to `true` to disable color-coded log output | `false` | server, machine learning | |
| `CPU_CORES` | Number of cores available to the Immich server | auto-detected CPU core count | server | |
| `IMMICH_API_METRICS_PORT` | Port for the OTEL metrics | `8081` | server | api |

View File

@@ -17,10 +17,10 @@
"write-heading-ids": "docusaurus write-heading-ids"
},
"dependencies": {
"@docusaurus/core": "~3.9.0",
"@docusaurus/preset-classic": "~3.9.0",
"@docusaurus/theme-common": "~3.9.0",
"@docusaurus/theme-mermaid": "~3.9.0",
"@docusaurus/core": "~3.10.0",
"@docusaurus/preset-classic": "~3.10.0",
"@docusaurus/theme-common": "~3.10.0",
"@docusaurus/theme-mermaid": "~3.10.0",
"@mdi/js": "^7.3.67",
"@mdi/react": "^1.6.1",
"@mdx-js/react": "^3.0.0",
@@ -36,9 +36,9 @@
"url": "^0.11.0"
},
"devDependencies": {
"@docusaurus/module-type-aliases": "~3.9.0",
"@docusaurus/module-type-aliases": "~3.10.0",
"@docusaurus/tsconfig": "^3.10.0",
"@docusaurus/types": "^3.7.0",
"@docusaurus/types": "^3.10.0",
"prettier": "^3.7.4",
"typescript": "^6.0.0"
},
@@ -58,6 +58,6 @@
"node": ">=20"
},
"volta": {
"node": "24.14.1"
"node": "24.15.0"
}
}

View File

@@ -1 +1 @@
24.14.1
24.15.0

View File

@@ -58,6 +58,6 @@
"vitest": "^4.0.0"
},
"volta": {
"node": "24.14.1"
"node": "24.15.0"
}
}

View File

@@ -223,6 +223,7 @@ export const setupBaseMockApiRoutes = async (context: BrowserContext, adminUserI
'.jp2',
'.jpe',
'.jxl',
'.mpo',
'.svg',
'.tif',
'.tiff',

View File

@@ -349,7 +349,7 @@ test.describe('Timeline', () => {
expect(visibleMockAssetsYearMonths).toContain(month);
}
});
test('Deep link to last photo, scroll up', async ({ page }) => {
test.skip('Deep link to last photo, scroll up', async ({ page }) => {
const lastAsset = assets.at(-1)!;
await pageUtils.deepLinkPhotosPage(page, lastAsset.id);
@@ -361,7 +361,7 @@ test.describe('Timeline', () => {
await thumbnailUtils.expectInViewport(page, '14e5901f-fd7f-40c0-b186-4d7e7fc67968');
});
test('Deep link to first bucket, scroll down', async ({ page }) => {
test.skip('Deep link to first bucket, scroll down', async ({ page }) => {
const lastAsset = assets.at(0)!;
await pageUtils.deepLinkPhotosPage(page, lastAsset.id);
await timelineUtils.locator(page).hover();
@@ -440,7 +440,7 @@ test.describe('Timeline', () => {
await thumbnailUtils.expectInViewport(page, asset.id);
await thumbnailUtils.expectSelectedDisabled(page, asset.id);
});
test('Add photos to album', async ({ page }) => {
test.skip('Add photos to album', async ({ page }) => {
const album = timelineRestData.album;
await pageUtils.openAlbumPage(page, album.id);
await page.locator('nav button[aria-label="Add photos"]').click();
@@ -752,7 +752,7 @@ test.describe('Timeline', () => {
await page.getByText('Photos', { exact: true }).click();
await thumbnailUtils.expectInViewport(page, assetToFavorite.id);
});
test('open /favorites, archive photo, unarchive photo', async ({ page }) => {
test.skip('open /favorites, archive photo, unarchive photo', async ({ page }) => {
await pageUtils.openFavorites(page);
const assetToArchive = getAsset(timelineRestData, 'ad31e29f-2069-4574-b9a9-ad86523c92cb')!;
await thumbnailUtils.withAssetId(page, assetToArchive.id).hover();

View File

@@ -14,11 +14,11 @@ config_roots = [
]
[tools]
node = "24.14.1"
node = "24.15.0"
flutter = "3.41.6"
pnpm = "10.33.0"
terragrunt = "1.0.0"
opentofu = "1.11.5"
terragrunt = "1.0.1"
opentofu = "1.11.6"
java = "21.0.2"
[tools."github:CQLabs/homebrew-dcm"]

View File

@@ -1,5 +1,5 @@
{
"dart.flutterSdkPath": ".fvm/versions/3.41.6",
"dart.flutterSdkPath": ".fvm/versions/3.41.7",
"dart.lineLength": 120,
"[dart]": {
"editor.rulers": [

View File

@@ -43,8 +43,8 @@ class BackgroundEngineLock(context: Context) : BackgroundWorkerLockApi, ImmichPl
override fun onAttachedToEngine(binding: FlutterPlugin.FlutterPluginBinding) {
super.onAttachedToEngine(binding)
checkAndEnforceBackgroundLock(binding.applicationContext)
engineCount.incrementAndGet()
checkAndEnforceBackgroundLock(binding.applicationContext)
Log.i(TAG, "Flutter engine attached. Attached Engines count: $engineCount")
}

View File

@@ -5,8 +5,10 @@ import android.provider.MediaStore
import android.util.Log
import androidx.work.BackoffPolicy
import androidx.work.Constraints
import androidx.work.ExistingPeriodicWorkPolicy
import androidx.work.ExistingWorkPolicy
import androidx.work.OneTimeWorkRequest
import androidx.work.OneTimeWorkRequestBuilder
import androidx.work.PeriodicWorkRequestBuilder
import androidx.work.WorkManager
import io.flutter.embedding.engine.FlutterEngineCache
import java.util.concurrent.TimeUnit
@@ -18,6 +20,7 @@ class BackgroundWorkerApiImpl(context: Context) : BackgroundWorkerFgHostApi {
override fun enable() {
enqueueMediaObserver(ctx)
enqueuePeriodicWorker(ctx)
}
override fun saveNotificationMessage(title: String, body: String) {
@@ -27,12 +30,14 @@ class BackgroundWorkerApiImpl(context: Context) : BackgroundWorkerFgHostApi {
override fun configure(settings: BackgroundWorkerSettings) {
BackgroundWorkerPreferences(ctx).updateSettings(settings)
enqueueMediaObserver(ctx)
enqueuePeriodicWorker(ctx)
}
override fun disable() {
WorkManager.getInstance(ctx).apply {
cancelUniqueWork(OBSERVER_WORKER_NAME)
cancelUniqueWork(BACKGROUND_WORKER_NAME)
cancelUniqueWork(PERIODIC_WORKER_NAME)
}
Log.i(TAG, "Cancelled background upload tasks")
}
@@ -40,6 +45,7 @@ class BackgroundWorkerApiImpl(context: Context) : BackgroundWorkerFgHostApi {
companion object {
private const val BACKGROUND_WORKER_NAME = "immich/BackgroundWorkerV1"
private const val OBSERVER_WORKER_NAME = "immich/MediaObserverV1"
private const val PERIODIC_WORKER_NAME = "immich/PeriodicBackgroundWorkerV1"
const val ENGINE_CACHE_KEY = "immich::background_worker::engine"
@@ -55,7 +61,7 @@ class BackgroundWorkerApiImpl(context: Context) : BackgroundWorkerFgHostApi {
setRequiresCharging(settings.requiresCharging)
}.build()
val work = OneTimeWorkRequest.Builder(MediaObserver::class.java)
val work = OneTimeWorkRequestBuilder<MediaObserver>()
.setConstraints(constraints)
.build()
WorkManager.getInstance(ctx)
@@ -67,10 +73,30 @@ class BackgroundWorkerApiImpl(context: Context) : BackgroundWorkerFgHostApi {
)
}
fun enqueuePeriodicWorker(ctx: Context) {
val settings = BackgroundWorkerPreferences(ctx).getSettings()
val constraints = Constraints.Builder().apply {
setRequiresCharging(settings.requiresCharging)
}.build()
val work =
PeriodicWorkRequestBuilder<PeriodicWorker>(
1,
TimeUnit.HOURS,
15,
TimeUnit.MINUTES
).setConstraints(constraints)
.build()
WorkManager.getInstance(ctx)
.enqueueUniquePeriodicWork(PERIODIC_WORKER_NAME, ExistingPeriodicWorkPolicy.UPDATE, work)
Log.i(TAG, "Enqueued periodic background worker with name: $PERIODIC_WORKER_NAME")
}
fun enqueueBackgroundWorker(ctx: Context) {
val constraints = Constraints.Builder().setRequiresBatteryNotLow(true).build()
val work = OneTimeWorkRequest.Builder(BackgroundWorker::class.java)
val work = OneTimeWorkRequestBuilder<BackgroundWorker>()
.setConstraints(constraints)
.setBackoffCriteria(BackoffPolicy.EXPONENTIAL, 1, TimeUnit.MINUTES)
.build()

View File

@@ -0,0 +1,16 @@
package app.alextran.immich.background
import android.content.Context
import android.util.Log
import androidx.work.Worker
import androidx.work.WorkerParameters
class PeriodicWorker(context: Context, params: WorkerParameters) : Worker(context, params) {
private val ctx: Context = context.applicationContext
override fun doWork(): Result {
Log.i("PeriodicWorker", "Periodic worker triggered, starting background worker")
BackgroundWorkerApiImpl.enqueueBackgroundWorker(ctx)
return Result.success()
}
}

View File

@@ -216,7 +216,7 @@ data class PlatformAsset (
val updatedAt: Long? = null,
val width: Long? = null,
val height: Long? = null,
val durationInSeconds: Long,
val durationMs: Long,
val orientation: Long,
val isFavorite: Boolean,
val adjustmentTime: Long? = null,
@@ -234,14 +234,14 @@ data class PlatformAsset (
val updatedAt = pigeonVar_list[4] as Long?
val width = pigeonVar_list[5] as Long?
val height = pigeonVar_list[6] as Long?
val durationInSeconds = pigeonVar_list[7] as Long
val durationMs = pigeonVar_list[7] as Long
val orientation = pigeonVar_list[8] as Long
val isFavorite = pigeonVar_list[9] as Boolean
val adjustmentTime = pigeonVar_list[10] as Long?
val latitude = pigeonVar_list[11] as Double?
val longitude = pigeonVar_list[12] as Double?
val playbackStyle = pigeonVar_list[13] as PlatformAssetPlaybackStyle
return PlatformAsset(id, name, type, createdAt, updatedAt, width, height, durationInSeconds, orientation, isFavorite, adjustmentTime, latitude, longitude, playbackStyle)
return PlatformAsset(id, name, type, createdAt, updatedAt, width, height, durationMs, orientation, isFavorite, adjustmentTime, latitude, longitude, playbackStyle)
}
}
fun toList(): List<Any?> {
@@ -253,7 +253,7 @@ data class PlatformAsset (
updatedAt,
width,
height,
durationInSeconds,
durationMs,
orientation,
isFavorite,
adjustmentTime,
@@ -270,7 +270,7 @@ data class PlatformAsset (
return true
}
val other = other as PlatformAsset
return MessagesPigeonUtils.deepEquals(this.id, other.id) && MessagesPigeonUtils.deepEquals(this.name, other.name) && MessagesPigeonUtils.deepEquals(this.type, other.type) && MessagesPigeonUtils.deepEquals(this.createdAt, other.createdAt) && MessagesPigeonUtils.deepEquals(this.updatedAt, other.updatedAt) && MessagesPigeonUtils.deepEquals(this.width, other.width) && MessagesPigeonUtils.deepEquals(this.height, other.height) && MessagesPigeonUtils.deepEquals(this.durationInSeconds, other.durationInSeconds) && MessagesPigeonUtils.deepEquals(this.orientation, other.orientation) && MessagesPigeonUtils.deepEquals(this.isFavorite, other.isFavorite) && MessagesPigeonUtils.deepEquals(this.adjustmentTime, other.adjustmentTime) && MessagesPigeonUtils.deepEquals(this.latitude, other.latitude) && MessagesPigeonUtils.deepEquals(this.longitude, other.longitude) && MessagesPigeonUtils.deepEquals(this.playbackStyle, other.playbackStyle)
return MessagesPigeonUtils.deepEquals(this.id, other.id) && MessagesPigeonUtils.deepEquals(this.name, other.name) && MessagesPigeonUtils.deepEquals(this.type, other.type) && MessagesPigeonUtils.deepEquals(this.createdAt, other.createdAt) && MessagesPigeonUtils.deepEquals(this.updatedAt, other.updatedAt) && MessagesPigeonUtils.deepEquals(this.width, other.width) && MessagesPigeonUtils.deepEquals(this.height, other.height) && MessagesPigeonUtils.deepEquals(this.durationMs, other.durationMs) && MessagesPigeonUtils.deepEquals(this.orientation, other.orientation) && MessagesPigeonUtils.deepEquals(this.isFavorite, other.isFavorite) && MessagesPigeonUtils.deepEquals(this.adjustmentTime, other.adjustmentTime) && MessagesPigeonUtils.deepEquals(this.latitude, other.latitude) && MessagesPigeonUtils.deepEquals(this.longitude, other.longitude) && MessagesPigeonUtils.deepEquals(this.playbackStyle, other.playbackStyle)
}
override fun hashCode(): Int {
@@ -282,7 +282,7 @@ data class PlatformAsset (
result = 31 * result + MessagesPigeonUtils.deepHash(this.updatedAt)
result = 31 * result + MessagesPigeonUtils.deepHash(this.width)
result = 31 * result + MessagesPigeonUtils.deepHash(this.height)
result = 31 * result + MessagesPigeonUtils.deepHash(this.durationInSeconds)
result = 31 * result + MessagesPigeonUtils.deepHash(this.durationMs)
result = 31 * result + MessagesPigeonUtils.deepHash(this.orientation)
result = 31 * result + MessagesPigeonUtils.deepHash(this.isFavorite)
result = 31 * result + MessagesPigeonUtils.deepHash(this.adjustmentTime)

View File

@@ -178,7 +178,7 @@ open class NativeSyncApiImplBase(context: Context) : ImmichPlugin() {
val height = c.getInt(heightColumn).toLong()
// Duration is milliseconds
val duration = if (rawMediaType == MediaStore.Files.FileColumns.MEDIA_TYPE_IMAGE) 0L
else c.getLong(durationColumn) / 1000
else c.getLong(durationColumn)
val orientation = c.getInt(orientationColumn)
val isFavorite = if (favoriteColumn == -1) false else c.getInt(favoriteColumn) != 0

View File

@@ -46,6 +46,6 @@ material = { module = "com.google.android.material:material", version.ref = "mat
android-application = { id = "com.android.application", version.ref = "agp" }
kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
# TODO: update to version.ref = "kotlin" when background_downloader is removed
kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version = "1.9.22" }
kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version = "2.1.0" }
kotlin-compose = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" }
ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" }

View File

@@ -21,7 +21,7 @@ plugins {
id "com.android.application" version "8.11.2" apply false
id "org.jetbrains.kotlin.android" version "2.2.20" apply false
// TODO: update to match kotlin version when background_downloader is removed
id "org.jetbrains.kotlin.plugin.serialization" version "1.9.22" apply false
id "org.jetbrains.kotlin.plugin.serialization" version "2.1.0" apply false
id "com.google.devtools.ksp" version "2.2.20-2.0.3" apply false
}

File diff suppressed because it is too large Load Diff

View File

@@ -20,19 +20,21 @@ PODS:
- Flutter
- flutter_udid (0.0.1):
- Flutter
- SAMKeychain
- flutter_web_auth_2 (3.0.0):
- KeychainAccess
- flutter_web_auth_2 (5.0.0):
- Flutter
- fluttertoast (0.0.2):
- Flutter
- geolocator_apple (1.2.0):
- Flutter
- FlutterMacOS
- home_widget (0.0.1):
- Flutter
- image_picker_ios (0.0.1):
- Flutter
- integration_test (0.0.1):
- Flutter
- KeychainAccess (4.2.2)
- local_auth_darwin (0.0.1):
- Flutter
- FlutterMacOS
@@ -44,19 +46,13 @@ PODS:
- Flutter
- network_info_plus (0.0.1):
- Flutter
- objective_c (0.0.1):
- Flutter
- package_info_plus (0.4.5):
- Flutter
- path_provider_foundation (0.0.1):
- Flutter
- FlutterMacOS
- permission_handler_apple (9.3.0):
- Flutter
- photo_manager (3.7.1):
- photo_manager (3.9.0):
- Flutter
- FlutterMacOS
- SAMKeychain (1.5.3)
- share_handler_ios (0.0.14):
- Flutter
- share_handler_ios/share_handler_ios_models (= 0.0.14)
@@ -70,28 +66,6 @@ PODS:
- shared_preferences_foundation (0.0.1):
- Flutter
- FlutterMacOS
- sqflite_darwin (0.0.4):
- Flutter
- FlutterMacOS
- sqlite3 (3.49.2):
- sqlite3/common (= 3.49.2)
- sqlite3/common (3.49.2)
- sqlite3/dbstatvtab (3.49.2):
- sqlite3/common
- sqlite3/fts5 (3.49.2):
- sqlite3/common
- sqlite3/perf-threadsafe (3.49.2):
- sqlite3/common
- sqlite3/rtree (3.49.2):
- sqlite3/common
- sqlite3_flutter_libs (0.0.1):
- Flutter
- FlutterMacOS
- sqlite3 (~> 3.49.1)
- sqlite3/dbstatvtab
- sqlite3/fts5
- sqlite3/perf-threadsafe
- sqlite3/rtree
- url_launcher_ios (0.0.1):
- Flutter
- wakelock_plus (0.0.1):
@@ -110,7 +84,7 @@ DEPENDENCIES:
- flutter_udid (from `.symlinks/plugins/flutter_udid/ios`)
- flutter_web_auth_2 (from `.symlinks/plugins/flutter_web_auth_2/ios`)
- fluttertoast (from `.symlinks/plugins/fluttertoast/ios`)
- geolocator_apple (from `.symlinks/plugins/geolocator_apple/ios`)
- geolocator_apple (from `.symlinks/plugins/geolocator_apple/darwin`)
- home_widget (from `.symlinks/plugins/home_widget/ios`)
- image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`)
- integration_test (from `.symlinks/plugins/integration_test/ios`)
@@ -118,25 +92,20 @@ DEPENDENCIES:
- maplibre_gl (from `.symlinks/plugins/maplibre_gl/ios`)
- native_video_player (from `.symlinks/plugins/native_video_player/ios`)
- network_info_plus (from `.symlinks/plugins/network_info_plus/ios`)
- objective_c (from `.symlinks/plugins/objective_c/ios`)
- package_info_plus (from `.symlinks/plugins/package_info_plus/ios`)
- path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`)
- permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`)
- photo_manager (from `.symlinks/plugins/photo_manager/ios`)
- photo_manager (from `.symlinks/plugins/photo_manager/darwin`)
- share_handler_ios (from `.symlinks/plugins/share_handler_ios/ios`)
- share_handler_ios_models (from `.symlinks/plugins/share_handler_ios/ios/Models`)
- share_plus (from `.symlinks/plugins/share_plus/ios`)
- shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`)
- sqflite_darwin (from `.symlinks/plugins/sqflite_darwin/darwin`)
- sqlite3_flutter_libs (from `.symlinks/plugins/sqlite3_flutter_libs/darwin`)
- url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`)
- wakelock_plus (from `.symlinks/plugins/wakelock_plus/ios`)
SPEC REPOS:
trunk:
- KeychainAccess
- MapLibre
- SAMKeychain
- sqlite3
EXTERNAL SOURCES:
background_downloader:
@@ -164,7 +133,7 @@ EXTERNAL SOURCES:
fluttertoast:
:path: ".symlinks/plugins/fluttertoast/ios"
geolocator_apple:
:path: ".symlinks/plugins/geolocator_apple/ios"
:path: ".symlinks/plugins/geolocator_apple/darwin"
home_widget:
:path: ".symlinks/plugins/home_widget/ios"
image_picker_ios:
@@ -179,16 +148,12 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/native_video_player/ios"
network_info_plus:
:path: ".symlinks/plugins/network_info_plus/ios"
objective_c:
:path: ".symlinks/plugins/objective_c/ios"
package_info_plus:
:path: ".symlinks/plugins/package_info_plus/ios"
path_provider_foundation:
:path: ".symlinks/plugins/path_provider_foundation/darwin"
permission_handler_apple:
:path: ".symlinks/plugins/permission_handler_apple/ios"
photo_manager:
:path: ".symlinks/plugins/photo_manager/ios"
:path: ".symlinks/plugins/photo_manager/darwin"
share_handler_ios:
:path: ".symlinks/plugins/share_handler_ios/ios"
share_handler_ios_models:
@@ -197,10 +162,6 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/share_plus/ios"
shared_preferences_foundation:
:path: ".symlinks/plugins/shared_preferences_foundation/darwin"
sqflite_darwin:
:path: ".symlinks/plugins/sqflite_darwin/darwin"
sqlite3_flutter_libs:
:path: ".symlinks/plugins/sqlite3_flutter_libs/darwin"
url_launcher_ios:
:path: ".symlinks/plugins/url_launcher_ios/ios"
wakelock_plus:
@@ -216,32 +177,27 @@ SPEC CHECKSUMS:
flutter_local_notifications: ad39620c743ea4c15127860f4b5641649a988100
flutter_native_splash: c32d145d68aeda5502d5f543ee38c192065986cf
flutter_secure_storage: 1ed9476fba7e7a782b22888f956cce43e2c62f13
flutter_udid: f7c3884e6ec2951efe4f9de082257fc77c4d15e9
flutter_web_auth_2: 5c8d9dcd7848b5a9efb086d24e7a9adcae979c80
flutter_udid: 92a5d31fe0526b7b6002a2318df702e12e7eb300
flutter_web_auth_2: 646fc9df97a01c59e5eea99b237da2c6360f8439
fluttertoast: 2c67e14dce98bbdb200df9e1acf610d7a6264ea1
geolocator_apple: 1560c3c875af2a412242c7a923e15d0d401966ff
geolocator_apple: ab36aa0e8b7d7a2d7639b3b4e48308394e8cef5e
home_widget: f169fc41fd807b4d46ab6615dc44d62adbf9f64f
image_picker_ios: e0ece4aa2a75771a7de3fa735d26d90817041326
integration_test: 4a889634ef21a45d28d50d622cf412dc6d9f586e
local_auth_darwin: 553ce4f9b16d3fdfeafce9cf042e7c9f77c1c391
KeychainAccess: c0c4f7f38f6fc7bbe58f5702e25f7bd2f65abf51
local_auth_darwin: c3ee6cce0a8d56be34c8ccb66ba31f7f180aaebb
MapLibre: 69e572367f4ef6287e18246cfafc39c80cdcabcd
maplibre_gl: 3c924e44725147b03dda33430ad216005b40555f
native_video_player: b65c58951ede2f93d103a25366bdebca95081265
network_info_plus: cf61925ab5205dce05a4f0895989afdb6aade5fc
objective_c: 89e720c30d716b036faf9c9684022048eee1eee2
package_info_plus: af8e2ca6888548050f16fa2f1938db7b5a5df499
path_provider_foundation: bb55f6dbba17d0dccd6737fe6f7f34fbd0376880
permission_handler_apple: 4ed2196e43d0651e8ff7ca3483a069d469701f2d
photo_manager: 1d80ae07a89a67dfbcae95953a1e5a24af7c3e62
SAMKeychain: 483e1c9f32984d50ca961e26818a534283b4cd5c
photo_manager: 25fd77df14f4f0ba5ef99e2c61814dde77e2bceb
share_handler_ios: e2244e990f826b2c8eaa291ac3831569438ba0fb
share_handler_ios_models: fc638c9b4330dc7f082586c92aee9dfa0b87b871
share_plus: 50da8cb520a8f0f65671c6c6a99b3617ed10a58a
shared_preferences_foundation: 9e1978ff2562383bd5676f64ec4e9aa8fa06a6f7
sqflite_darwin: 20b2a3a3b70e43edae938624ce550a3cbf66a3d0
sqlite3: 3c950dc86011117c307eb0b28c4a7bb449dce9f1
sqlite3_flutter_libs: f8fc13346870e73fe35ebf6dbb997fbcd156b241
url_launcher_ios: 694010445543906933d732453a59da0a173ae33d
shared_preferences_foundation: 7036424c3d8ec98dfe75ff1667cb0cd531ec82bb
url_launcher_ios: 7a95fa5b60cc718a708b8f2966718e93db0cef1b
wakelock_plus: e29112ab3ef0b318e58cfa5c32326458be66b556
PODFILE CHECKSUM: 938abbae4114b9c2140c550a2a0d8f7c674f5dfe

View File

@@ -3,7 +3,7 @@
archiveVersion = 1;
classes = {
};
objectVersion = 77;
objectVersion = 54;
objects = {
/* Begin PBXBuildFile section */

View File

@@ -1,12 +1,4 @@
import BackgroundTasks
import Flutter
import native_video_player
import network_info_plus
import path_provider_foundation
import permission_handler_apple
import photo_manager
import shared_preferences_foundation
import UIKit
@main
@objc class AppDelegate: FlutterAppDelegate, FlutterImplicitEngineDelegate {

View File

@@ -150,6 +150,27 @@
<array>
<string>INSendMessageIntent</string>
</array>
<key>UIApplicationSceneManifest</key>
<dict>
<key>UIApplicationSupportsMultipleScenes</key>
<false/>
<key>UISceneConfigurations</key>
<dict>
<key>UIWindowSceneSessionRoleApplication</key>
<array>
<dict>
<key>UISceneClassName</key>
<string>UIWindowScene</string>
<key>UISceneConfigurationName</key>
<string>flutter</string>
<key>UISceneDelegateClassName</key>
<string>FlutterSceneDelegate</string>
<key>UISceneStoryboardFile</key>
<string>Main</string>
</dict>
</array>
</dict>
</dict>
<key>UIApplicationSupportsIndirectInputEvents</key>
<true/>
<key>UIBackgroundModes</key>
@@ -176,27 +197,6 @@
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UIApplicationSceneManifest</key>
<dict>
<key>UIApplicationSupportsMultipleScenes</key>
<false/>
<key>UISceneConfigurations</key>
<dict>
<key>UIWindowSceneSessionRoleApplication</key>
<array>
<dict>
<key>UISceneClassName</key>
<string>UIWindowScene</string>
<key>UISceneDelegateClassName</key>
<string>FlutterSceneDelegate</string>
<key>UISceneConfigurationName</key>
<string>flutter</string>
<key>UISceneStoryboardFile</key>
<string>Main</string>
</dict>
</array>
</dict>
</dict>
<key>UIViewControllerBasedStatusBarAppearance</key>
<true/>
<key>io.flutter.embedded_views_preview</key>

View File

@@ -192,7 +192,7 @@ struct PlatformAsset: Hashable {
var updatedAt: Int64? = nil
var width: Int64? = nil
var height: Int64? = nil
var durationInSeconds: Int64
var durationMs: Int64
var orientation: Int64
var isFavorite: Bool
var adjustmentTime: Int64? = nil
@@ -210,7 +210,7 @@ struct PlatformAsset: Hashable {
let updatedAt: Int64? = nilOrValue(pigeonVar_list[4])
let width: Int64? = nilOrValue(pigeonVar_list[5])
let height: Int64? = nilOrValue(pigeonVar_list[6])
let durationInSeconds = pigeonVar_list[7] as! Int64
let durationMs = pigeonVar_list[7] as! Int64
let orientation = pigeonVar_list[8] as! Int64
let isFavorite = pigeonVar_list[9] as! Bool
let adjustmentTime: Int64? = nilOrValue(pigeonVar_list[10])
@@ -226,7 +226,7 @@ struct PlatformAsset: Hashable {
updatedAt: updatedAt,
width: width,
height: height,
durationInSeconds: durationInSeconds,
durationMs: durationMs,
orientation: orientation,
isFavorite: isFavorite,
adjustmentTime: adjustmentTime,
@@ -244,7 +244,7 @@ struct PlatformAsset: Hashable {
updatedAt,
width,
height,
durationInSeconds,
durationMs,
orientation,
isFavorite,
adjustmentTime,
@@ -257,7 +257,7 @@ struct PlatformAsset: Hashable {
if Swift.type(of: lhs) != Swift.type(of: rhs) {
return false
}
return deepEqualsMessages(lhs.id, rhs.id) && deepEqualsMessages(lhs.name, rhs.name) && deepEqualsMessages(lhs.type, rhs.type) && deepEqualsMessages(lhs.createdAt, rhs.createdAt) && deepEqualsMessages(lhs.updatedAt, rhs.updatedAt) && deepEqualsMessages(lhs.width, rhs.width) && deepEqualsMessages(lhs.height, rhs.height) && deepEqualsMessages(lhs.durationInSeconds, rhs.durationInSeconds) && deepEqualsMessages(lhs.orientation, rhs.orientation) && deepEqualsMessages(lhs.isFavorite, rhs.isFavorite) && deepEqualsMessages(lhs.adjustmentTime, rhs.adjustmentTime) && deepEqualsMessages(lhs.latitude, rhs.latitude) && deepEqualsMessages(lhs.longitude, rhs.longitude) && deepEqualsMessages(lhs.playbackStyle, rhs.playbackStyle)
return deepEqualsMessages(lhs.id, rhs.id) && deepEqualsMessages(lhs.name, rhs.name) && deepEqualsMessages(lhs.type, rhs.type) && deepEqualsMessages(lhs.createdAt, rhs.createdAt) && deepEqualsMessages(lhs.updatedAt, rhs.updatedAt) && deepEqualsMessages(lhs.width, rhs.width) && deepEqualsMessages(lhs.height, rhs.height) && deepEqualsMessages(lhs.durationMs, rhs.durationMs) && deepEqualsMessages(lhs.orientation, rhs.orientation) && deepEqualsMessages(lhs.isFavorite, rhs.isFavorite) && deepEqualsMessages(lhs.adjustmentTime, rhs.adjustmentTime) && deepEqualsMessages(lhs.latitude, rhs.latitude) && deepEqualsMessages(lhs.longitude, rhs.longitude) && deepEqualsMessages(lhs.playbackStyle, rhs.playbackStyle)
}
func hash(into hasher: inout Hasher) {
@@ -269,7 +269,7 @@ struct PlatformAsset: Hashable {
deepHashMessages(value: updatedAt, hasher: &hasher)
deepHashMessages(value: width, hasher: &hasher)
deepHashMessages(value: height, hasher: &hasher)
deepHashMessages(value: durationInSeconds, hasher: &hasher)
deepHashMessages(value: durationMs, hasher: &hasher)
deepHashMessages(value: orientation, hasher: &hasher)
deepHashMessages(value: isFavorite, hasher: &hasher)
deepHashMessages(value: adjustmentTime, hasher: &hasher)

View File

@@ -171,7 +171,7 @@ class NativeSyncApiImpl: ImmichPlugin, NativeSyncApi, FlutterPlugin {
id: asset.localIdentifier,
name: "",
type: 0,
durationInSeconds: 0,
durationMs: 0,
orientation: 0,
isFavorite: false,
playbackStyle: .unknown

View File

@@ -21,7 +21,7 @@ extension PHAsset {
updatedAt: modificationDate.map { Int64($0.timeIntervalSince1970) },
width: Int64(pixelWidth),
height: Int64(pixelHeight),
durationInSeconds: Int64(duration),
durationMs: Int64(duration * 1000),
orientation: 0,
isFavorite: isFavorite,
adjustmentTime: adjustmentTimestamp,

View File

@@ -25,7 +25,7 @@ sealed class BaseAsset {
final DateTime updatedAt;
final int? width;
final int? height;
final int? durationInSeconds;
final int? durationMs;
final bool isFavorite;
final String? livePhotoVideoId;
final bool isEdited;
@@ -38,7 +38,7 @@ sealed class BaseAsset {
required this.updatedAt,
this.width,
this.height,
this.durationInSeconds,
this.durationMs,
this.isFavorite = false,
this.livePhotoVideoId,
required this.isEdited,
@@ -53,15 +53,17 @@ sealed class BaseAsset {
AssetPlaybackStyle get playbackStyle {
if (isVideo) return AssetPlaybackStyle.video;
if (isMotionPhoto) return AssetPlaybackStyle.livePhoto;
if (isImage && durationInSeconds != null && durationInSeconds! > 0) return AssetPlaybackStyle.imageAnimated;
if (isImage && durationMs != null && durationMs! > 0) {
return AssetPlaybackStyle.imageAnimated;
}
if (isImage) return AssetPlaybackStyle.image;
return AssetPlaybackStyle.unknown;
}
Duration get duration {
final durationInSeconds = this.durationInSeconds;
if (durationInSeconds != null) {
return Duration(seconds: durationInSeconds);
final durationMs = this.durationMs;
if (durationMs != null) {
return Duration(milliseconds: durationMs);
}
return const Duration();
}
@@ -88,7 +90,7 @@ sealed class BaseAsset {
updatedAt: $updatedAt,
width: ${width ?? "<NA>"},
height: ${height ?? "<NA>"},
durationInSeconds: ${durationInSeconds ?? "<NA>"},
durationMs: ${durationMs ?? "<NA>"},
isFavorite: $isFavorite,
isEdited: $isEdited,
}''';
@@ -104,7 +106,7 @@ sealed class BaseAsset {
updatedAt == other.updatedAt &&
width == other.width &&
height == other.height &&
durationInSeconds == other.durationInSeconds &&
durationMs == other.durationMs &&
isFavorite == other.isFavorite &&
isEdited == other.isEdited;
}
@@ -119,7 +121,7 @@ sealed class BaseAsset {
updatedAt.hashCode ^
width.hashCode ^
height.hashCode ^
durationInSeconds.hashCode ^
durationMs.hashCode ^
isFavorite.hashCode ^
isEdited.hashCode;
}

View File

@@ -23,7 +23,7 @@ class LocalAsset extends BaseAsset {
required super.updatedAt,
super.width,
super.height,
super.durationInSeconds,
super.durationMs,
super.isFavorite = false,
super.livePhotoVideoId,
this.orientation = 0,
@@ -58,7 +58,7 @@ class LocalAsset extends BaseAsset {
updatedAt: $updatedAt,
width: ${width ?? "<NA>"},
height: ${height ?? "<NA>"},
durationInSeconds: ${durationInSeconds ?? "<NA>"},
durationMs: ${durationMs ?? "<NA>"},
playbackStyle: $playbackStyle,
remoteId: ${remoteId ?? "<NA>"},
cloudId: ${cloudId ?? "<NA>"},
@@ -108,7 +108,7 @@ class LocalAsset extends BaseAsset {
DateTime? updatedAt,
int? width,
int? height,
int? durationInSeconds,
int? durationMs,
bool? isFavorite,
int? orientation,
AssetPlaybackStyle? playbackStyle,
@@ -128,7 +128,7 @@ class LocalAsset extends BaseAsset {
updatedAt: updatedAt ?? this.updatedAt,
width: width ?? this.width,
height: height ?? this.height,
durationInSeconds: durationInSeconds ?? this.durationInSeconds,
durationMs: durationMs ?? this.durationMs,
isFavorite: isFavorite ?? this.isFavorite,
orientation: orientation ?? this.orientation,
playbackStyle: playbackStyle ?? this.playbackStyle,

View File

@@ -22,7 +22,7 @@ class RemoteAsset extends BaseAsset {
required super.updatedAt,
super.width,
super.height,
super.durationInSeconds,
super.durationMs,
super.isFavorite = false,
this.thumbHash,
this.visibility = AssetVisibility.timeline,
@@ -57,7 +57,7 @@ class RemoteAsset extends BaseAsset {
updatedAt: $updatedAt,
width: ${width ?? "<NA>"},
height: ${height ?? "<NA>"},
durationInSeconds: ${durationInSeconds ?? "<NA>"},
durationMs: ${durationMs ?? "<NA>"},
localId: ${localId ?? "<NA>"},
isFavorite: $isFavorite,
thumbHash: ${thumbHash ?? "<NA>"},
@@ -102,7 +102,7 @@ class RemoteAsset extends BaseAsset {
DateTime? updatedAt,
int? width,
int? height,
int? durationInSeconds,
int? durationMs,
bool? isFavorite,
String? thumbHash,
AssetVisibility? visibility,
@@ -121,7 +121,7 @@ class RemoteAsset extends BaseAsset {
updatedAt: updatedAt ?? this.updatedAt,
width: width ?? this.width,
height: height ?? this.height,
durationInSeconds: durationInSeconds ?? this.durationInSeconds,
durationMs: durationMs ?? this.durationMs,
isFavorite: isFavorite ?? this.isFavorite,
thumbHash: thumbHash ?? this.thumbHash,
visibility: visibility ?? this.visibility,
@@ -146,7 +146,7 @@ class RemoteAssetExif extends RemoteAsset {
required super.updatedAt,
super.width,
super.height,
super.durationInSeconds,
super.durationMs,
super.isFavorite = false,
super.thumbHash,
super.visibility = AssetVisibility.timeline,
@@ -178,7 +178,7 @@ class RemoteAssetExif extends RemoteAsset {
DateTime? updatedAt,
int? width,
int? height,
int? durationInSeconds,
int? durationMs,
bool? isFavorite,
String? thumbHash,
AssetVisibility? visibility,
@@ -198,7 +198,7 @@ class RemoteAssetExif extends RemoteAsset {
updatedAt: updatedAt ?? this.updatedAt,
width: width ?? this.width,
height: height ?? this.height,
durationInSeconds: durationInSeconds ?? this.durationInSeconds,
durationMs: durationMs ?? this.durationMs,
isFavorite: isFavorite ?? this.isFavorite,
thumbHash: thumbHash ?? this.thumbHash,
visibility: visibility ?? this.visibility,

View File

@@ -29,7 +29,7 @@ class ExifInfo {
bool get hasCoordinates => latitude != null && longitude != null && latitude != 0 && longitude != 0;
String get exposureTime {
if (exposureSeconds == null) {
if (exposureSeconds == null || exposureSeconds! <= 0 || exposureSeconds!.isNaN) {
return "";
}
if (exposureSeconds! < 1) {

View File

@@ -4,6 +4,7 @@ enum Setting<T> {
tilesPerRow<int>(StoreKey.tilesPerRow, 4),
groupAssetsBy<int>(StoreKey.groupAssetsBy, 0),
showStorageIndicator<bool>(StoreKey.storageIndicator, true),
loadPreview<bool>(StoreKey.loadPreview, true),
loadOriginal<bool>(StoreKey.loadOriginal, false),
loadOriginalVideo<bool>(StoreKey.loadOriginalVideo, false),
autoPlayVideo<bool>(StoreKey.autoPlayVideo, true),

View File

@@ -337,7 +337,7 @@ class LocalSyncService {
a.createdAt.isAtSameMomentAs(b.createdAt) &&
a.width == b.width &&
a.height == b.height &&
a.durationInSeconds == b.durationInSeconds;
a.durationMs == b.durationMs;
}
final firstAdjustment = a.adjustmentTime?.millisecondsSinceEpoch ?? 0;
@@ -346,7 +346,7 @@ class LocalSyncService {
a.createdAt.isAtSameMomentAs(b.createdAt) &&
a.width == b.width &&
a.height == b.height &&
a.durationInSeconds == b.durationInSeconds &&
a.durationMs == b.durationMs &&
a.latitude == b.latitude &&
a.longitude == b.longitude;
}
@@ -432,7 +432,7 @@ extension PlatformToLocalAsset on PlatformAsset {
updatedAt: tryFromSecondsSinceEpoch(updatedAt, isUtc: true) ?? DateTime.timestamp(),
width: width,
height: height,
durationInSeconds: durationInSeconds,
durationMs: durationMs,
isFavorite: isFavorite,
orientation: orientation,
playbackStyle: _toPlaybackStyle(playbackStyle),

View File

@@ -14,7 +14,7 @@ extension DTOToAsset on api.AssetResponseDto {
updatedAt: updatedAt,
ownerId: ownerId,
visibility: visibility.toAssetVisibility(),
durationInSeconds: duration?.toDuration()?.inSeconds ?? 0,
durationMs: duration?.toDuration()?.inMilliseconds ?? 0,
height: height?.toInt(),
width: width?.toInt(),
isFavorite: isFavorite,
@@ -36,7 +36,7 @@ extension DTOToAsset on api.AssetResponseDto {
updatedAt: updatedAt,
ownerId: ownerId,
visibility: visibility.toAssetVisibility(),
durationInSeconds: duration?.toDuration()?.inSeconds ?? 0,
durationMs: duration?.toDuration()?.inMilliseconds ?? 0,
height: height?.toInt(),
width: width?.toInt(),
isFavorite: isFavorite,

View File

@@ -7,11 +7,16 @@ extension StringExtension on String {
}
extension DurationExtension on String {
/// Parses and returns the string of format HH:MM:SS as a duration object else null
/// Parses and returns the string of format HH:MM:SS.ffffff as a duration object else null
Duration? toDuration() {
try {
final parts = split(':').map((e) => double.parse(e).toInt()).toList(growable: false);
return Duration(hours: parts[0], minutes: parts[1], seconds: parts[2]);
final parts = split(':');
final hours = double.parse(parts[0]).toInt();
final minutes = double.parse(parts[1]).toInt();
final secondsParts = parts[2].split('.');
final seconds = int.parse(secondsParts[0]);
final milliseconds = secondsParts.length > 1 ? (double.parse('0.${secondsParts[1]}') * 1000).round() : 0;
return Duration(hours: hours, minutes: minutes, seconds: seconds, milliseconds: milliseconds);
} catch (e) {
return null;
}

View File

@@ -39,7 +39,7 @@ extension LocalAssetEntityDataDomainExtension on LocalAssetEntityData {
type: type,
createdAt: createdAt,
updatedAt: updatedAt,
durationInSeconds: durationInSeconds,
durationMs: durationMs,
isFavorite: isFavorite,
height: height,
width: width,

View File

@@ -16,7 +16,7 @@ typedef $$LocalAssetEntityTableCreateCompanionBuilder =
i0.Value<DateTime> updatedAt,
i0.Value<int?> width,
i0.Value<int?> height,
i0.Value<int?> durationInSeconds,
i0.Value<int?> durationMs,
required String id,
i0.Value<String?> checksum,
i0.Value<bool> isFavorite,
@@ -35,7 +35,7 @@ typedef $$LocalAssetEntityTableUpdateCompanionBuilder =
i0.Value<DateTime> updatedAt,
i0.Value<int?> width,
i0.Value<int?> height,
i0.Value<int?> durationInSeconds,
i0.Value<int?> durationMs,
i0.Value<String> id,
i0.Value<String?> checksum,
i0.Value<bool> isFavorite,
@@ -87,8 +87,8 @@ class $$LocalAssetEntityTableFilterComposer
builder: (column) => i0.ColumnFilters(column),
);
i0.ColumnFilters<int> get durationInSeconds => $composableBuilder(
column: $table.durationInSeconds,
i0.ColumnFilters<int> get durationMs => $composableBuilder(
column: $table.durationMs,
builder: (column) => i0.ColumnFilters(column),
);
@@ -182,8 +182,8 @@ class $$LocalAssetEntityTableOrderingComposer
builder: (column) => i0.ColumnOrderings(column),
);
i0.ColumnOrderings<int> get durationInSeconds => $composableBuilder(
column: $table.durationInSeconds,
i0.ColumnOrderings<int> get durationMs => $composableBuilder(
column: $table.durationMs,
builder: (column) => i0.ColumnOrderings(column),
);
@@ -260,8 +260,8 @@ class $$LocalAssetEntityTableAnnotationComposer
i0.GeneratedColumn<int> get height =>
$composableBuilder(column: $table.height, builder: (column) => column);
i0.GeneratedColumn<int> get durationInSeconds => $composableBuilder(
column: $table.durationInSeconds,
i0.GeneratedColumn<int> get durationMs => $composableBuilder(
column: $table.durationMs,
builder: (column) => column,
);
@@ -348,7 +348,7 @@ class $$LocalAssetEntityTableTableManager
i0.Value<DateTime> updatedAt = const i0.Value.absent(),
i0.Value<int?> width = const i0.Value.absent(),
i0.Value<int?> height = const i0.Value.absent(),
i0.Value<int?> durationInSeconds = const i0.Value.absent(),
i0.Value<int?> durationMs = const i0.Value.absent(),
i0.Value<String> id = const i0.Value.absent(),
i0.Value<String?> checksum = const i0.Value.absent(),
i0.Value<bool> isFavorite = const i0.Value.absent(),
@@ -366,7 +366,7 @@ class $$LocalAssetEntityTableTableManager
updatedAt: updatedAt,
width: width,
height: height,
durationInSeconds: durationInSeconds,
durationMs: durationMs,
id: id,
checksum: checksum,
isFavorite: isFavorite,
@@ -385,7 +385,7 @@ class $$LocalAssetEntityTableTableManager
i0.Value<DateTime> updatedAt = const i0.Value.absent(),
i0.Value<int?> width = const i0.Value.absent(),
i0.Value<int?> height = const i0.Value.absent(),
i0.Value<int?> durationInSeconds = const i0.Value.absent(),
i0.Value<int?> durationMs = const i0.Value.absent(),
required String id,
i0.Value<String?> checksum = const i0.Value.absent(),
i0.Value<bool> isFavorite = const i0.Value.absent(),
@@ -403,7 +403,7 @@ class $$LocalAssetEntityTableTableManager
updatedAt: updatedAt,
width: width,
height: height,
durationInSeconds: durationInSeconds,
durationMs: durationMs,
id: id,
checksum: checksum,
isFavorite: isFavorite,
@@ -522,17 +522,17 @@ class $LocalAssetEntityTable extends i3.LocalAssetEntity
type: i0.DriftSqlType.int,
requiredDuringInsert: false,
);
static const i0.VerificationMeta _durationInSecondsMeta =
const i0.VerificationMeta('durationInSeconds');
static const i0.VerificationMeta _durationMsMeta = const i0.VerificationMeta(
'durationMs',
);
@override
late final i0.GeneratedColumn<int> durationInSeconds =
i0.GeneratedColumn<int>(
'duration_in_seconds',
aliasedName,
true,
type: i0.DriftSqlType.int,
requiredDuringInsert: false,
);
late final i0.GeneratedColumn<int> durationMs = i0.GeneratedColumn<int>(
'duration_ms',
aliasedName,
true,
type: i0.DriftSqlType.int,
requiredDuringInsert: false,
);
static const i0.VerificationMeta _idMeta = const i0.VerificationMeta('id');
@override
late final i0.GeneratedColumn<String> id = i0.GeneratedColumn<String>(
@@ -645,7 +645,7 @@ class $LocalAssetEntityTable extends i3.LocalAssetEntity
updatedAt,
width,
height,
durationInSeconds,
durationMs,
id,
checksum,
isFavorite,
@@ -700,13 +700,10 @@ class $LocalAssetEntityTable extends i3.LocalAssetEntity
height.isAcceptableOrUnknown(data['height']!, _heightMeta),
);
}
if (data.containsKey('duration_in_seconds')) {
if (data.containsKey('duration_ms')) {
context.handle(
_durationInSecondsMeta,
durationInSeconds.isAcceptableOrUnknown(
data['duration_in_seconds']!,
_durationInSecondsMeta,
),
_durationMsMeta,
durationMs.isAcceptableOrUnknown(data['duration_ms']!, _durationMsMeta),
);
}
if (data.containsKey('id')) {
@@ -800,9 +797,9 @@ class $LocalAssetEntityTable extends i3.LocalAssetEntity
i0.DriftSqlType.int,
data['${effectivePrefix}height'],
),
durationInSeconds: attachedDatabase.typeMapping.read(
durationMs: attachedDatabase.typeMapping.read(
i0.DriftSqlType.int,
data['${effectivePrefix}duration_in_seconds'],
data['${effectivePrefix}duration_ms'],
),
id: attachedDatabase.typeMapping.read(
i0.DriftSqlType.string,
@@ -870,7 +867,7 @@ class LocalAssetEntityData extends i0.DataClass
final DateTime updatedAt;
final int? width;
final int? height;
final int? durationInSeconds;
final int? durationMs;
final String id;
final String? checksum;
final bool isFavorite;
@@ -887,7 +884,7 @@ class LocalAssetEntityData extends i0.DataClass
required this.updatedAt,
this.width,
this.height,
this.durationInSeconds,
this.durationMs,
required this.id,
this.checksum,
required this.isFavorite,
@@ -915,8 +912,8 @@ class LocalAssetEntityData extends i0.DataClass
if (!nullToAbsent || height != null) {
map['height'] = i0.Variable<int>(height);
}
if (!nullToAbsent || durationInSeconds != null) {
map['duration_in_seconds'] = i0.Variable<int>(durationInSeconds);
if (!nullToAbsent || durationMs != null) {
map['duration_ms'] = i0.Variable<int>(durationMs);
}
map['id'] = i0.Variable<String>(id);
if (!nullToAbsent || checksum != null) {
@@ -958,7 +955,7 @@ class LocalAssetEntityData extends i0.DataClass
updatedAt: serializer.fromJson<DateTime>(json['updatedAt']),
width: serializer.fromJson<int?>(json['width']),
height: serializer.fromJson<int?>(json['height']),
durationInSeconds: serializer.fromJson<int?>(json['durationInSeconds']),
durationMs: serializer.fromJson<int?>(json['durationMs']),
id: serializer.fromJson<String>(json['id']),
checksum: serializer.fromJson<String?>(json['checksum']),
isFavorite: serializer.fromJson<bool>(json['isFavorite']),
@@ -984,7 +981,7 @@ class LocalAssetEntityData extends i0.DataClass
'updatedAt': serializer.toJson<DateTime>(updatedAt),
'width': serializer.toJson<int?>(width),
'height': serializer.toJson<int?>(height),
'durationInSeconds': serializer.toJson<int?>(durationInSeconds),
'durationMs': serializer.toJson<int?>(durationMs),
'id': serializer.toJson<String>(id),
'checksum': serializer.toJson<String?>(checksum),
'isFavorite': serializer.toJson<bool>(isFavorite),
@@ -1006,7 +1003,7 @@ class LocalAssetEntityData extends i0.DataClass
DateTime? updatedAt,
i0.Value<int?> width = const i0.Value.absent(),
i0.Value<int?> height = const i0.Value.absent(),
i0.Value<int?> durationInSeconds = const i0.Value.absent(),
i0.Value<int?> durationMs = const i0.Value.absent(),
String? id,
i0.Value<String?> checksum = const i0.Value.absent(),
bool? isFavorite,
@@ -1023,9 +1020,7 @@ class LocalAssetEntityData extends i0.DataClass
updatedAt: updatedAt ?? this.updatedAt,
width: width.present ? width.value : this.width,
height: height.present ? height.value : this.height,
durationInSeconds: durationInSeconds.present
? durationInSeconds.value
: this.durationInSeconds,
durationMs: durationMs.present ? durationMs.value : this.durationMs,
id: id ?? this.id,
checksum: checksum.present ? checksum.value : this.checksum,
isFavorite: isFavorite ?? this.isFavorite,
@@ -1046,9 +1041,9 @@ class LocalAssetEntityData extends i0.DataClass
updatedAt: data.updatedAt.present ? data.updatedAt.value : this.updatedAt,
width: data.width.present ? data.width.value : this.width,
height: data.height.present ? data.height.value : this.height,
durationInSeconds: data.durationInSeconds.present
? data.durationInSeconds.value
: this.durationInSeconds,
durationMs: data.durationMs.present
? data.durationMs.value
: this.durationMs,
id: data.id.present ? data.id.value : this.id,
checksum: data.checksum.present ? data.checksum.value : this.checksum,
isFavorite: data.isFavorite.present
@@ -1078,7 +1073,7 @@ class LocalAssetEntityData extends i0.DataClass
..write('updatedAt: $updatedAt, ')
..write('width: $width, ')
..write('height: $height, ')
..write('durationInSeconds: $durationInSeconds, ')
..write('durationMs: $durationMs, ')
..write('id: $id, ')
..write('checksum: $checksum, ')
..write('isFavorite: $isFavorite, ')
@@ -1100,7 +1095,7 @@ class LocalAssetEntityData extends i0.DataClass
updatedAt,
width,
height,
durationInSeconds,
durationMs,
id,
checksum,
isFavorite,
@@ -1121,7 +1116,7 @@ class LocalAssetEntityData extends i0.DataClass
other.updatedAt == this.updatedAt &&
other.width == this.width &&
other.height == this.height &&
other.durationInSeconds == this.durationInSeconds &&
other.durationMs == this.durationMs &&
other.id == this.id &&
other.checksum == this.checksum &&
other.isFavorite == this.isFavorite &&
@@ -1141,7 +1136,7 @@ class LocalAssetEntityCompanion
final i0.Value<DateTime> updatedAt;
final i0.Value<int?> width;
final i0.Value<int?> height;
final i0.Value<int?> durationInSeconds;
final i0.Value<int?> durationMs;
final i0.Value<String> id;
final i0.Value<String?> checksum;
final i0.Value<bool> isFavorite;
@@ -1158,7 +1153,7 @@ class LocalAssetEntityCompanion
this.updatedAt = const i0.Value.absent(),
this.width = const i0.Value.absent(),
this.height = const i0.Value.absent(),
this.durationInSeconds = const i0.Value.absent(),
this.durationMs = const i0.Value.absent(),
this.id = const i0.Value.absent(),
this.checksum = const i0.Value.absent(),
this.isFavorite = const i0.Value.absent(),
@@ -1176,7 +1171,7 @@ class LocalAssetEntityCompanion
this.updatedAt = const i0.Value.absent(),
this.width = const i0.Value.absent(),
this.height = const i0.Value.absent(),
this.durationInSeconds = const i0.Value.absent(),
this.durationMs = const i0.Value.absent(),
required String id,
this.checksum = const i0.Value.absent(),
this.isFavorite = const i0.Value.absent(),
@@ -1196,7 +1191,7 @@ class LocalAssetEntityCompanion
i0.Expression<DateTime>? updatedAt,
i0.Expression<int>? width,
i0.Expression<int>? height,
i0.Expression<int>? durationInSeconds,
i0.Expression<int>? durationMs,
i0.Expression<String>? id,
i0.Expression<String>? checksum,
i0.Expression<bool>? isFavorite,
@@ -1214,7 +1209,7 @@ class LocalAssetEntityCompanion
if (updatedAt != null) 'updated_at': updatedAt,
if (width != null) 'width': width,
if (height != null) 'height': height,
if (durationInSeconds != null) 'duration_in_seconds': durationInSeconds,
if (durationMs != null) 'duration_ms': durationMs,
if (id != null) 'id': id,
if (checksum != null) 'checksum': checksum,
if (isFavorite != null) 'is_favorite': isFavorite,
@@ -1234,7 +1229,7 @@ class LocalAssetEntityCompanion
i0.Value<DateTime>? updatedAt,
i0.Value<int?>? width,
i0.Value<int?>? height,
i0.Value<int?>? durationInSeconds,
i0.Value<int?>? durationMs,
i0.Value<String>? id,
i0.Value<String?>? checksum,
i0.Value<bool>? isFavorite,
@@ -1252,7 +1247,7 @@ class LocalAssetEntityCompanion
updatedAt: updatedAt ?? this.updatedAt,
width: width ?? this.width,
height: height ?? this.height,
durationInSeconds: durationInSeconds ?? this.durationInSeconds,
durationMs: durationMs ?? this.durationMs,
id: id ?? this.id,
checksum: checksum ?? this.checksum,
isFavorite: isFavorite ?? this.isFavorite,
@@ -1288,8 +1283,8 @@ class LocalAssetEntityCompanion
if (height.present) {
map['height'] = i0.Variable<int>(height.value);
}
if (durationInSeconds.present) {
map['duration_in_seconds'] = i0.Variable<int>(durationInSeconds.value);
if (durationMs.present) {
map['duration_ms'] = i0.Variable<int>(durationMs.value);
}
if (id.present) {
map['id'] = i0.Variable<String>(id.value);
@@ -1334,7 +1329,7 @@ class LocalAssetEntityCompanion
..write('updatedAt: $updatedAt, ')
..write('width: $width, ')
..write('height: $height, ')
..write('durationInSeconds: $durationInSeconds, ')
..write('durationMs: $durationMs, ')
..write('id: $id, ')
..write('checksum: $checksum, ')
..write('isFavorite: $isFavorite, ')

View File

@@ -14,7 +14,7 @@ SELECT
rae.updated_at,
rae.width,
rae.height,
rae.duration_in_seconds,
rae.duration_ms,
rae.is_favorite,
rae.thumb_hash,
rae.checksum,
@@ -52,7 +52,7 @@ SELECT
lae.updated_at,
lae.width,
lae.height,
lae.duration_in_seconds,
lae.duration_ms,
lae.is_favorite,
NULL as thumb_hash,
lae.checksum,

View File

@@ -29,7 +29,7 @@ class MergedAssetDrift extends i1.ModularAccessor {
);
$arrayStartIndex += generatedlimit.amountOfVariables;
return customSelect(
'SELECT rae.id AS remote_id, (SELECT lae.id FROM local_asset_entity AS lae WHERE lae.checksum = rae.checksum LIMIT 1) AS local_id, rae.name, rae.type, rae.created_at AS created_at, rae.updated_at, rae.width, rae.height, rae.duration_in_seconds, rae.is_favorite, rae.thumb_hash, rae.checksum, rae.owner_id, rae.live_photo_video_id, 0 AS orientation, rae.stack_id, NULL AS i_cloud_id, NULL AS latitude, NULL AS longitude, NULL AS adjustmentTime, rae.is_edited, 0 AS playback_style FROM remote_asset_entity AS rae LEFT JOIN stack_entity AS se ON rae.stack_id = se.id WHERE rae.deleted_at IS NULL AND rae.visibility = 0 AND rae.owner_id IN ($expandeduserIds) AND(rae.stack_id IS NULL OR rae.id = se.primary_asset_id)UNION ALL SELECT NULL AS remote_id, lae.id AS local_id, lae.name, lae.type, lae.created_at AS created_at, lae.updated_at, lae.width, lae.height, lae.duration_in_seconds, lae.is_favorite, NULL AS thumb_hash, lae.checksum, NULL AS owner_id, NULL AS live_photo_video_id, lae.orientation, NULL AS stack_id, lae.i_cloud_id, lae.latitude, lae.longitude, lae.adjustment_time, 0 AS is_edited, lae.playback_style FROM local_asset_entity AS lae WHERE NOT EXISTS (SELECT 1 FROM remote_asset_entity AS rae WHERE rae.checksum = lae.checksum AND rae.owner_id IN ($expandeduserIds)) AND EXISTS (SELECT 1 FROM local_album_asset_entity AS laa INNER JOIN local_album_entity AS la ON laa.album_id = la.id WHERE laa.asset_id = lae.id AND la.backup_selection = 0) AND NOT EXISTS (SELECT 1 FROM local_album_asset_entity AS laa INNER JOIN local_album_entity AS la ON laa.album_id = la.id WHERE laa.asset_id = lae.id AND la.backup_selection = 2) ORDER BY created_at DESC ${generatedlimit.sql}',
'SELECT rae.id AS remote_id, (SELECT lae.id FROM local_asset_entity AS lae WHERE lae.checksum = rae.checksum LIMIT 1) AS local_id, rae.name, rae.type, rae.created_at AS created_at, rae.updated_at, rae.width, rae.height, rae.duration_ms, rae.is_favorite, rae.thumb_hash, rae.checksum, rae.owner_id, rae.live_photo_video_id, 0 AS orientation, rae.stack_id, NULL AS i_cloud_id, NULL AS latitude, NULL AS longitude, NULL AS adjustmentTime, rae.is_edited, 0 AS playback_style FROM remote_asset_entity AS rae LEFT JOIN stack_entity AS se ON rae.stack_id = se.id WHERE rae.deleted_at IS NULL AND rae.visibility = 0 AND rae.owner_id IN ($expandeduserIds) AND(rae.stack_id IS NULL OR rae.id = se.primary_asset_id)UNION ALL SELECT NULL AS remote_id, lae.id AS local_id, lae.name, lae.type, lae.created_at AS created_at, lae.updated_at, lae.width, lae.height, lae.duration_ms, lae.is_favorite, NULL AS thumb_hash, lae.checksum, NULL AS owner_id, NULL AS live_photo_video_id, lae.orientation, NULL AS stack_id, lae.i_cloud_id, lae.latitude, lae.longitude, lae.adjustment_time, 0 AS is_edited, lae.playback_style FROM local_asset_entity AS lae WHERE NOT EXISTS (SELECT 1 FROM remote_asset_entity AS rae WHERE rae.checksum = lae.checksum AND rae.owner_id IN ($expandeduserIds)) AND EXISTS (SELECT 1 FROM local_album_asset_entity AS laa INNER JOIN local_album_entity AS la ON laa.album_id = la.id WHERE laa.asset_id = lae.id AND la.backup_selection = 0) AND NOT EXISTS (SELECT 1 FROM local_album_asset_entity AS laa INNER JOIN local_album_entity AS la ON laa.album_id = la.id WHERE laa.asset_id = lae.id AND la.backup_selection = 2) ORDER BY created_at DESC ${generatedlimit.sql}',
variables: [
for (var $ in userIds) i0.Variable<String>($),
...generatedlimit.introducedVariables,
@@ -54,7 +54,7 @@ class MergedAssetDrift extends i1.ModularAccessor {
updatedAt: row.read<DateTime>('updated_at'),
width: row.readNullable<int>('width'),
height: row.readNullable<int>('height'),
durationInSeconds: row.readNullable<int>('duration_in_seconds'),
durationMs: row.readNullable<int>('duration_ms'),
isFavorite: row.read<bool>('is_favorite'),
thumbHash: row.readNullable<String>('thumb_hash'),
checksum: row.readNullable<String>('checksum'),
@@ -127,7 +127,7 @@ class MergedAssetResult {
final DateTime updatedAt;
final int? width;
final int? height;
final int? durationInSeconds;
final int? durationMs;
final bool isFavorite;
final String? thumbHash;
final String? checksum;
@@ -150,7 +150,7 @@ class MergedAssetResult {
required this.updatedAt,
this.width,
this.height,
this.durationInSeconds,
this.durationMs,
required this.isFavorite,
this.thumbHash,
this.checksum,

View File

@@ -66,7 +66,7 @@ extension RemoteAssetEntityDataDomainEx on RemoteAssetEntityData {
type: type,
createdAt: createdAt,
updatedAt: updatedAt,
durationInSeconds: durationInSeconds,
durationMs: durationMs,
isFavorite: isFavorite,
height: height,
width: width,

View File

@@ -19,7 +19,7 @@ typedef $$RemoteAssetEntityTableCreateCompanionBuilder =
i0.Value<DateTime> updatedAt,
i0.Value<int?> width,
i0.Value<int?> height,
i0.Value<int?> durationInSeconds,
i0.Value<int?> durationMs,
required String id,
required String checksum,
i0.Value<bool> isFavorite,
@@ -41,7 +41,7 @@ typedef $$RemoteAssetEntityTableUpdateCompanionBuilder =
i0.Value<DateTime> updatedAt,
i0.Value<int?> width,
i0.Value<int?> height,
i0.Value<int?> durationInSeconds,
i0.Value<int?> durationMs,
i0.Value<String> id,
i0.Value<String> checksum,
i0.Value<bool> isFavorite,
@@ -142,8 +142,8 @@ class $$RemoteAssetEntityTableFilterComposer
builder: (column) => i0.ColumnFilters(column),
);
i0.ColumnFilters<int> get durationInSeconds => $composableBuilder(
column: $table.durationInSeconds,
i0.ColumnFilters<int> get durationMs => $composableBuilder(
column: $table.durationMs,
builder: (column) => i0.ColumnFilters(column),
);
@@ -270,8 +270,8 @@ class $$RemoteAssetEntityTableOrderingComposer
builder: (column) => i0.ColumnOrderings(column),
);
i0.ColumnOrderings<int> get durationInSeconds => $composableBuilder(
column: $table.durationInSeconds,
i0.ColumnOrderings<int> get durationMs => $composableBuilder(
column: $table.durationMs,
builder: (column) => i0.ColumnOrderings(column),
);
@@ -385,8 +385,8 @@ class $$RemoteAssetEntityTableAnnotationComposer
i0.GeneratedColumn<int> get height =>
$composableBuilder(column: $table.height, builder: (column) => column);
i0.GeneratedColumn<int> get durationInSeconds => $composableBuilder(
column: $table.durationInSeconds,
i0.GeneratedColumn<int> get durationMs => $composableBuilder(
column: $table.durationMs,
builder: (column) => column,
);
@@ -499,7 +499,7 @@ class $$RemoteAssetEntityTableTableManager
i0.Value<DateTime> updatedAt = const i0.Value.absent(),
i0.Value<int?> width = const i0.Value.absent(),
i0.Value<int?> height = const i0.Value.absent(),
i0.Value<int?> durationInSeconds = const i0.Value.absent(),
i0.Value<int?> durationMs = const i0.Value.absent(),
i0.Value<String> id = const i0.Value.absent(),
i0.Value<String> checksum = const i0.Value.absent(),
i0.Value<bool> isFavorite = const i0.Value.absent(),
@@ -520,7 +520,7 @@ class $$RemoteAssetEntityTableTableManager
updatedAt: updatedAt,
width: width,
height: height,
durationInSeconds: durationInSeconds,
durationMs: durationMs,
id: id,
checksum: checksum,
isFavorite: isFavorite,
@@ -542,7 +542,7 @@ class $$RemoteAssetEntityTableTableManager
i0.Value<DateTime> updatedAt = const i0.Value.absent(),
i0.Value<int?> width = const i0.Value.absent(),
i0.Value<int?> height = const i0.Value.absent(),
i0.Value<int?> durationInSeconds = const i0.Value.absent(),
i0.Value<int?> durationMs = const i0.Value.absent(),
required String id,
required String checksum,
i0.Value<bool> isFavorite = const i0.Value.absent(),
@@ -562,7 +562,7 @@ class $$RemoteAssetEntityTableTableManager
updatedAt: updatedAt,
width: width,
height: height,
durationInSeconds: durationInSeconds,
durationMs: durationMs,
id: id,
checksum: checksum,
isFavorite: isFavorite,
@@ -724,17 +724,17 @@ class $RemoteAssetEntityTable extends i3.RemoteAssetEntity
type: i0.DriftSqlType.int,
requiredDuringInsert: false,
);
static const i0.VerificationMeta _durationInSecondsMeta =
const i0.VerificationMeta('durationInSeconds');
static const i0.VerificationMeta _durationMsMeta = const i0.VerificationMeta(
'durationMs',
);
@override
late final i0.GeneratedColumn<int> durationInSeconds =
i0.GeneratedColumn<int>(
'duration_in_seconds',
aliasedName,
true,
type: i0.DriftSqlType.int,
requiredDuringInsert: false,
);
late final i0.GeneratedColumn<int> durationMs = i0.GeneratedColumn<int>(
'duration_ms',
aliasedName,
true,
type: i0.DriftSqlType.int,
requiredDuringInsert: false,
);
static const i0.VerificationMeta _idMeta = const i0.VerificationMeta('id');
@override
late final i0.GeneratedColumn<String> id = i0.GeneratedColumn<String>(
@@ -886,7 +886,7 @@ class $RemoteAssetEntityTable extends i3.RemoteAssetEntity
updatedAt,
width,
height,
durationInSeconds,
durationMs,
id,
checksum,
isFavorite,
@@ -944,13 +944,10 @@ class $RemoteAssetEntityTable extends i3.RemoteAssetEntity
height.isAcceptableOrUnknown(data['height']!, _heightMeta),
);
}
if (data.containsKey('duration_in_seconds')) {
if (data.containsKey('duration_ms')) {
context.handle(
_durationInSecondsMeta,
durationInSeconds.isAcceptableOrUnknown(
data['duration_in_seconds']!,
_durationInSecondsMeta,
),
_durationMsMeta,
durationMs.isAcceptableOrUnknown(data['duration_ms']!, _durationMsMeta),
);
}
if (data.containsKey('id')) {
@@ -1066,9 +1063,9 @@ class $RemoteAssetEntityTable extends i3.RemoteAssetEntity
i0.DriftSqlType.int,
data['${effectivePrefix}height'],
),
durationInSeconds: attachedDatabase.typeMapping.read(
durationMs: attachedDatabase.typeMapping.read(
i0.DriftSqlType.int,
data['${effectivePrefix}duration_in_seconds'],
data['${effectivePrefix}duration_ms'],
),
id: attachedDatabase.typeMapping.read(
i0.DriftSqlType.string,
@@ -1148,7 +1145,7 @@ class RemoteAssetEntityData extends i0.DataClass
final DateTime updatedAt;
final int? width;
final int? height;
final int? durationInSeconds;
final int? durationMs;
final String id;
final String checksum;
final bool isFavorite;
@@ -1168,7 +1165,7 @@ class RemoteAssetEntityData extends i0.DataClass
required this.updatedAt,
this.width,
this.height,
this.durationInSeconds,
this.durationMs,
required this.id,
required this.checksum,
required this.isFavorite,
@@ -1199,8 +1196,8 @@ class RemoteAssetEntityData extends i0.DataClass
if (!nullToAbsent || height != null) {
map['height'] = i0.Variable<int>(height);
}
if (!nullToAbsent || durationInSeconds != null) {
map['duration_in_seconds'] = i0.Variable<int>(durationInSeconds);
if (!nullToAbsent || durationMs != null) {
map['duration_ms'] = i0.Variable<int>(durationMs);
}
map['id'] = i0.Variable<String>(id);
map['checksum'] = i0.Variable<String>(checksum);
@@ -1247,7 +1244,7 @@ class RemoteAssetEntityData extends i0.DataClass
updatedAt: serializer.fromJson<DateTime>(json['updatedAt']),
width: serializer.fromJson<int?>(json['width']),
height: serializer.fromJson<int?>(json['height']),
durationInSeconds: serializer.fromJson<int?>(json['durationInSeconds']),
durationMs: serializer.fromJson<int?>(json['durationMs']),
id: serializer.fromJson<String>(json['id']),
checksum: serializer.fromJson<String>(json['checksum']),
isFavorite: serializer.fromJson<bool>(json['isFavorite']),
@@ -1276,7 +1273,7 @@ class RemoteAssetEntityData extends i0.DataClass
'updatedAt': serializer.toJson<DateTime>(updatedAt),
'width': serializer.toJson<int?>(width),
'height': serializer.toJson<int?>(height),
'durationInSeconds': serializer.toJson<int?>(durationInSeconds),
'durationMs': serializer.toJson<int?>(durationMs),
'id': serializer.toJson<String>(id),
'checksum': serializer.toJson<String>(checksum),
'isFavorite': serializer.toJson<bool>(isFavorite),
@@ -1301,7 +1298,7 @@ class RemoteAssetEntityData extends i0.DataClass
DateTime? updatedAt,
i0.Value<int?> width = const i0.Value.absent(),
i0.Value<int?> height = const i0.Value.absent(),
i0.Value<int?> durationInSeconds = const i0.Value.absent(),
i0.Value<int?> durationMs = const i0.Value.absent(),
String? id,
String? checksum,
bool? isFavorite,
@@ -1321,9 +1318,7 @@ class RemoteAssetEntityData extends i0.DataClass
updatedAt: updatedAt ?? this.updatedAt,
width: width.present ? width.value : this.width,
height: height.present ? height.value : this.height,
durationInSeconds: durationInSeconds.present
? durationInSeconds.value
: this.durationInSeconds,
durationMs: durationMs.present ? durationMs.value : this.durationMs,
id: id ?? this.id,
checksum: checksum ?? this.checksum,
isFavorite: isFavorite ?? this.isFavorite,
@@ -1349,9 +1344,9 @@ class RemoteAssetEntityData extends i0.DataClass
updatedAt: data.updatedAt.present ? data.updatedAt.value : this.updatedAt,
width: data.width.present ? data.width.value : this.width,
height: data.height.present ? data.height.value : this.height,
durationInSeconds: data.durationInSeconds.present
? data.durationInSeconds.value
: this.durationInSeconds,
durationMs: data.durationMs.present
? data.durationMs.value
: this.durationMs,
id: data.id.present ? data.id.value : this.id,
checksum: data.checksum.present ? data.checksum.value : this.checksum,
isFavorite: data.isFavorite.present
@@ -1384,7 +1379,7 @@ class RemoteAssetEntityData extends i0.DataClass
..write('updatedAt: $updatedAt, ')
..write('width: $width, ')
..write('height: $height, ')
..write('durationInSeconds: $durationInSeconds, ')
..write('durationMs: $durationMs, ')
..write('id: $id, ')
..write('checksum: $checksum, ')
..write('isFavorite: $isFavorite, ')
@@ -1409,7 +1404,7 @@ class RemoteAssetEntityData extends i0.DataClass
updatedAt,
width,
height,
durationInSeconds,
durationMs,
id,
checksum,
isFavorite,
@@ -1433,7 +1428,7 @@ class RemoteAssetEntityData extends i0.DataClass
other.updatedAt == this.updatedAt &&
other.width == this.width &&
other.height == this.height &&
other.durationInSeconds == this.durationInSeconds &&
other.durationMs == this.durationMs &&
other.id == this.id &&
other.checksum == this.checksum &&
other.isFavorite == this.isFavorite &&
@@ -1456,7 +1451,7 @@ class RemoteAssetEntityCompanion
final i0.Value<DateTime> updatedAt;
final i0.Value<int?> width;
final i0.Value<int?> height;
final i0.Value<int?> durationInSeconds;
final i0.Value<int?> durationMs;
final i0.Value<String> id;
final i0.Value<String> checksum;
final i0.Value<bool> isFavorite;
@@ -1476,7 +1471,7 @@ class RemoteAssetEntityCompanion
this.updatedAt = const i0.Value.absent(),
this.width = const i0.Value.absent(),
this.height = const i0.Value.absent(),
this.durationInSeconds = const i0.Value.absent(),
this.durationMs = const i0.Value.absent(),
this.id = const i0.Value.absent(),
this.checksum = const i0.Value.absent(),
this.isFavorite = const i0.Value.absent(),
@@ -1497,7 +1492,7 @@ class RemoteAssetEntityCompanion
this.updatedAt = const i0.Value.absent(),
this.width = const i0.Value.absent(),
this.height = const i0.Value.absent(),
this.durationInSeconds = const i0.Value.absent(),
this.durationMs = const i0.Value.absent(),
required String id,
required String checksum,
this.isFavorite = const i0.Value.absent(),
@@ -1523,7 +1518,7 @@ class RemoteAssetEntityCompanion
i0.Expression<DateTime>? updatedAt,
i0.Expression<int>? width,
i0.Expression<int>? height,
i0.Expression<int>? durationInSeconds,
i0.Expression<int>? durationMs,
i0.Expression<String>? id,
i0.Expression<String>? checksum,
i0.Expression<bool>? isFavorite,
@@ -1544,7 +1539,7 @@ class RemoteAssetEntityCompanion
if (updatedAt != null) 'updated_at': updatedAt,
if (width != null) 'width': width,
if (height != null) 'height': height,
if (durationInSeconds != null) 'duration_in_seconds': durationInSeconds,
if (durationMs != null) 'duration_ms': durationMs,
if (id != null) 'id': id,
if (checksum != null) 'checksum': checksum,
if (isFavorite != null) 'is_favorite': isFavorite,
@@ -1567,7 +1562,7 @@ class RemoteAssetEntityCompanion
i0.Value<DateTime>? updatedAt,
i0.Value<int?>? width,
i0.Value<int?>? height,
i0.Value<int?>? durationInSeconds,
i0.Value<int?>? durationMs,
i0.Value<String>? id,
i0.Value<String>? checksum,
i0.Value<bool>? isFavorite,
@@ -1588,7 +1583,7 @@ class RemoteAssetEntityCompanion
updatedAt: updatedAt ?? this.updatedAt,
width: width ?? this.width,
height: height ?? this.height,
durationInSeconds: durationInSeconds ?? this.durationInSeconds,
durationMs: durationMs ?? this.durationMs,
id: id ?? this.id,
checksum: checksum ?? this.checksum,
isFavorite: isFavorite ?? this.isFavorite,
@@ -1627,8 +1622,8 @@ class RemoteAssetEntityCompanion
if (height.present) {
map['height'] = i0.Variable<int>(height.value);
}
if (durationInSeconds.present) {
map['duration_in_seconds'] = i0.Variable<int>(durationInSeconds.value);
if (durationMs.present) {
map['duration_ms'] = i0.Variable<int>(durationMs.value);
}
if (id.present) {
map['id'] = i0.Variable<String>(id.value);
@@ -1680,7 +1675,7 @@ class RemoteAssetEntityCompanion
..write('updatedAt: $updatedAt, ')
..write('width: $width, ')
..write('height: $height, ')
..write('durationInSeconds: $durationInSeconds, ')
..write('durationMs: $durationMs, ')
..write('id: $id, ')
..write('checksum: $checksum, ')
..write('isFavorite: $isFavorite, ')

View File

@@ -42,7 +42,7 @@ extension TrashedLocalAssetEntityDataDomainExtension on TrashedLocalAssetEntityD
type: type,
createdAt: createdAt,
updatedAt: updatedAt,
durationInSeconds: durationInSeconds,
durationMs: durationMs,
isFavorite: isFavorite,
height: height,
width: width,

View File

@@ -16,7 +16,7 @@ typedef $$TrashedLocalAssetEntityTableCreateCompanionBuilder =
i0.Value<DateTime> updatedAt,
i0.Value<int?> width,
i0.Value<int?> height,
i0.Value<int?> durationInSeconds,
i0.Value<int?> durationMs,
required String id,
required String albumId,
i0.Value<String?> checksum,
@@ -33,7 +33,7 @@ typedef $$TrashedLocalAssetEntityTableUpdateCompanionBuilder =
i0.Value<DateTime> updatedAt,
i0.Value<int?> width,
i0.Value<int?> height,
i0.Value<int?> durationInSeconds,
i0.Value<int?> durationMs,
i0.Value<String> id,
i0.Value<String> albumId,
i0.Value<String?> checksum,
@@ -84,8 +84,8 @@ class $$TrashedLocalAssetEntityTableFilterComposer
builder: (column) => i0.ColumnFilters(column),
);
i0.ColumnFilters<int> get durationInSeconds => $composableBuilder(
column: $table.durationInSeconds,
i0.ColumnFilters<int> get durationMs => $composableBuilder(
column: $table.durationMs,
builder: (column) => i0.ColumnFilters(column),
);
@@ -171,8 +171,8 @@ class $$TrashedLocalAssetEntityTableOrderingComposer
builder: (column) => i0.ColumnOrderings(column),
);
i0.ColumnOrderings<int> get durationInSeconds => $composableBuilder(
column: $table.durationInSeconds,
i0.ColumnOrderings<int> get durationMs => $composableBuilder(
column: $table.durationMs,
builder: (column) => i0.ColumnOrderings(column),
);
@@ -240,8 +240,8 @@ class $$TrashedLocalAssetEntityTableAnnotationComposer
i0.GeneratedColumn<int> get height =>
$composableBuilder(column: $table.height, builder: (column) => column);
i0.GeneratedColumn<int> get durationInSeconds => $composableBuilder(
column: $table.durationInSeconds,
i0.GeneratedColumn<int> get durationMs => $composableBuilder(
column: $table.durationMs,
builder: (column) => column,
);
@@ -326,7 +326,7 @@ class $$TrashedLocalAssetEntityTableTableManager
i0.Value<DateTime> updatedAt = const i0.Value.absent(),
i0.Value<int?> width = const i0.Value.absent(),
i0.Value<int?> height = const i0.Value.absent(),
i0.Value<int?> durationInSeconds = const i0.Value.absent(),
i0.Value<int?> durationMs = const i0.Value.absent(),
i0.Value<String> id = const i0.Value.absent(),
i0.Value<String> albumId = const i0.Value.absent(),
i0.Value<String?> checksum = const i0.Value.absent(),
@@ -342,7 +342,7 @@ class $$TrashedLocalAssetEntityTableTableManager
updatedAt: updatedAt,
width: width,
height: height,
durationInSeconds: durationInSeconds,
durationMs: durationMs,
id: id,
albumId: albumId,
checksum: checksum,
@@ -359,7 +359,7 @@ class $$TrashedLocalAssetEntityTableTableManager
i0.Value<DateTime> updatedAt = const i0.Value.absent(),
i0.Value<int?> width = const i0.Value.absent(),
i0.Value<int?> height = const i0.Value.absent(),
i0.Value<int?> durationInSeconds = const i0.Value.absent(),
i0.Value<int?> durationMs = const i0.Value.absent(),
required String id,
required String albumId,
i0.Value<String?> checksum = const i0.Value.absent(),
@@ -375,7 +375,7 @@ class $$TrashedLocalAssetEntityTableTableManager
updatedAt: updatedAt,
width: width,
height: height,
durationInSeconds: durationInSeconds,
durationMs: durationMs,
id: id,
albumId: albumId,
checksum: checksum,
@@ -498,17 +498,17 @@ class $TrashedLocalAssetEntityTable extends i3.TrashedLocalAssetEntity
type: i0.DriftSqlType.int,
requiredDuringInsert: false,
);
static const i0.VerificationMeta _durationInSecondsMeta =
const i0.VerificationMeta('durationInSeconds');
static const i0.VerificationMeta _durationMsMeta = const i0.VerificationMeta(
'durationMs',
);
@override
late final i0.GeneratedColumn<int> durationInSeconds =
i0.GeneratedColumn<int>(
'duration_in_seconds',
aliasedName,
true,
type: i0.DriftSqlType.int,
requiredDuringInsert: false,
);
late final i0.GeneratedColumn<int> durationMs = i0.GeneratedColumn<int>(
'duration_ms',
aliasedName,
true,
type: i0.DriftSqlType.int,
requiredDuringInsert: false,
);
static const i0.VerificationMeta _idMeta = const i0.VerificationMeta('id');
@override
late final i0.GeneratedColumn<String> id = i0.GeneratedColumn<String>(
@@ -599,7 +599,7 @@ class $TrashedLocalAssetEntityTable extends i3.TrashedLocalAssetEntity
updatedAt,
width,
height,
durationInSeconds,
durationMs,
id,
albumId,
checksum,
@@ -652,13 +652,10 @@ class $TrashedLocalAssetEntityTable extends i3.TrashedLocalAssetEntity
height.isAcceptableOrUnknown(data['height']!, _heightMeta),
);
}
if (data.containsKey('duration_in_seconds')) {
if (data.containsKey('duration_ms')) {
context.handle(
_durationInSecondsMeta,
durationInSeconds.isAcceptableOrUnknown(
data['duration_in_seconds']!,
_durationInSecondsMeta,
),
_durationMsMeta,
durationMs.isAcceptableOrUnknown(data['duration_ms']!, _durationMsMeta),
);
}
if (data.containsKey('id')) {
@@ -733,9 +730,9 @@ class $TrashedLocalAssetEntityTable extends i3.TrashedLocalAssetEntity
i0.DriftSqlType.int,
data['${effectivePrefix}height'],
),
durationInSeconds: attachedDatabase.typeMapping.read(
durationMs: attachedDatabase.typeMapping.read(
i0.DriftSqlType.int,
data['${effectivePrefix}duration_in_seconds'],
data['${effectivePrefix}duration_ms'],
),
id: attachedDatabase.typeMapping.read(
i0.DriftSqlType.string,
@@ -800,7 +797,7 @@ class TrashedLocalAssetEntityData extends i0.DataClass
final DateTime updatedAt;
final int? width;
final int? height;
final int? durationInSeconds;
final int? durationMs;
final String id;
final String albumId;
final String? checksum;
@@ -815,7 +812,7 @@ class TrashedLocalAssetEntityData extends i0.DataClass
required this.updatedAt,
this.width,
this.height,
this.durationInSeconds,
this.durationMs,
required this.id,
required this.albumId,
this.checksum,
@@ -841,8 +838,8 @@ class TrashedLocalAssetEntityData extends i0.DataClass
if (!nullToAbsent || height != null) {
map['height'] = i0.Variable<int>(height);
}
if (!nullToAbsent || durationInSeconds != null) {
map['duration_in_seconds'] = i0.Variable<int>(durationInSeconds);
if (!nullToAbsent || durationMs != null) {
map['duration_ms'] = i0.Variable<int>(durationMs);
}
map['id'] = i0.Variable<String>(id);
map['album_id'] = i0.Variable<String>(albumId);
@@ -880,7 +877,7 @@ class TrashedLocalAssetEntityData extends i0.DataClass
updatedAt: serializer.fromJson<DateTime>(json['updatedAt']),
width: serializer.fromJson<int?>(json['width']),
height: serializer.fromJson<int?>(json['height']),
durationInSeconds: serializer.fromJson<int?>(json['durationInSeconds']),
durationMs: serializer.fromJson<int?>(json['durationMs']),
id: serializer.fromJson<String>(json['id']),
albumId: serializer.fromJson<String>(json['albumId']),
checksum: serializer.fromJson<String?>(json['checksum']),
@@ -905,7 +902,7 @@ class TrashedLocalAssetEntityData extends i0.DataClass
'updatedAt': serializer.toJson<DateTime>(updatedAt),
'width': serializer.toJson<int?>(width),
'height': serializer.toJson<int?>(height),
'durationInSeconds': serializer.toJson<int?>(durationInSeconds),
'durationMs': serializer.toJson<int?>(durationMs),
'id': serializer.toJson<String>(id),
'albumId': serializer.toJson<String>(albumId),
'checksum': serializer.toJson<String?>(checksum),
@@ -929,7 +926,7 @@ class TrashedLocalAssetEntityData extends i0.DataClass
DateTime? updatedAt,
i0.Value<int?> width = const i0.Value.absent(),
i0.Value<int?> height = const i0.Value.absent(),
i0.Value<int?> durationInSeconds = const i0.Value.absent(),
i0.Value<int?> durationMs = const i0.Value.absent(),
String? id,
String? albumId,
i0.Value<String?> checksum = const i0.Value.absent(),
@@ -944,9 +941,7 @@ class TrashedLocalAssetEntityData extends i0.DataClass
updatedAt: updatedAt ?? this.updatedAt,
width: width.present ? width.value : this.width,
height: height.present ? height.value : this.height,
durationInSeconds: durationInSeconds.present
? durationInSeconds.value
: this.durationInSeconds,
durationMs: durationMs.present ? durationMs.value : this.durationMs,
id: id ?? this.id,
albumId: albumId ?? this.albumId,
checksum: checksum.present ? checksum.value : this.checksum,
@@ -965,9 +960,9 @@ class TrashedLocalAssetEntityData extends i0.DataClass
updatedAt: data.updatedAt.present ? data.updatedAt.value : this.updatedAt,
width: data.width.present ? data.width.value : this.width,
height: data.height.present ? data.height.value : this.height,
durationInSeconds: data.durationInSeconds.present
? data.durationInSeconds.value
: this.durationInSeconds,
durationMs: data.durationMs.present
? data.durationMs.value
: this.durationMs,
id: data.id.present ? data.id.value : this.id,
albumId: data.albumId.present ? data.albumId.value : this.albumId,
checksum: data.checksum.present ? data.checksum.value : this.checksum,
@@ -993,7 +988,7 @@ class TrashedLocalAssetEntityData extends i0.DataClass
..write('updatedAt: $updatedAt, ')
..write('width: $width, ')
..write('height: $height, ')
..write('durationInSeconds: $durationInSeconds, ')
..write('durationMs: $durationMs, ')
..write('id: $id, ')
..write('albumId: $albumId, ')
..write('checksum: $checksum, ')
@@ -1013,7 +1008,7 @@ class TrashedLocalAssetEntityData extends i0.DataClass
updatedAt,
width,
height,
durationInSeconds,
durationMs,
id,
albumId,
checksum,
@@ -1032,7 +1027,7 @@ class TrashedLocalAssetEntityData extends i0.DataClass
other.updatedAt == this.updatedAt &&
other.width == this.width &&
other.height == this.height &&
other.durationInSeconds == this.durationInSeconds &&
other.durationMs == this.durationMs &&
other.id == this.id &&
other.albumId == this.albumId &&
other.checksum == this.checksum &&
@@ -1050,7 +1045,7 @@ class TrashedLocalAssetEntityCompanion
final i0.Value<DateTime> updatedAt;
final i0.Value<int?> width;
final i0.Value<int?> height;
final i0.Value<int?> durationInSeconds;
final i0.Value<int?> durationMs;
final i0.Value<String> id;
final i0.Value<String> albumId;
final i0.Value<String?> checksum;
@@ -1065,7 +1060,7 @@ class TrashedLocalAssetEntityCompanion
this.updatedAt = const i0.Value.absent(),
this.width = const i0.Value.absent(),
this.height = const i0.Value.absent(),
this.durationInSeconds = const i0.Value.absent(),
this.durationMs = const i0.Value.absent(),
this.id = const i0.Value.absent(),
this.albumId = const i0.Value.absent(),
this.checksum = const i0.Value.absent(),
@@ -1081,7 +1076,7 @@ class TrashedLocalAssetEntityCompanion
this.updatedAt = const i0.Value.absent(),
this.width = const i0.Value.absent(),
this.height = const i0.Value.absent(),
this.durationInSeconds = const i0.Value.absent(),
this.durationMs = const i0.Value.absent(),
required String id,
required String albumId,
this.checksum = const i0.Value.absent(),
@@ -1101,7 +1096,7 @@ class TrashedLocalAssetEntityCompanion
i0.Expression<DateTime>? updatedAt,
i0.Expression<int>? width,
i0.Expression<int>? height,
i0.Expression<int>? durationInSeconds,
i0.Expression<int>? durationMs,
i0.Expression<String>? id,
i0.Expression<String>? albumId,
i0.Expression<String>? checksum,
@@ -1117,7 +1112,7 @@ class TrashedLocalAssetEntityCompanion
if (updatedAt != null) 'updated_at': updatedAt,
if (width != null) 'width': width,
if (height != null) 'height': height,
if (durationInSeconds != null) 'duration_in_seconds': durationInSeconds,
if (durationMs != null) 'duration_ms': durationMs,
if (id != null) 'id': id,
if (albumId != null) 'album_id': albumId,
if (checksum != null) 'checksum': checksum,
@@ -1135,7 +1130,7 @@ class TrashedLocalAssetEntityCompanion
i0.Value<DateTime>? updatedAt,
i0.Value<int?>? width,
i0.Value<int?>? height,
i0.Value<int?>? durationInSeconds,
i0.Value<int?>? durationMs,
i0.Value<String>? id,
i0.Value<String>? albumId,
i0.Value<String?>? checksum,
@@ -1151,7 +1146,7 @@ class TrashedLocalAssetEntityCompanion
updatedAt: updatedAt ?? this.updatedAt,
width: width ?? this.width,
height: height ?? this.height,
durationInSeconds: durationInSeconds ?? this.durationInSeconds,
durationMs: durationMs ?? this.durationMs,
id: id ?? this.id,
albumId: albumId ?? this.albumId,
checksum: checksum ?? this.checksum,
@@ -1185,8 +1180,8 @@ class TrashedLocalAssetEntityCompanion
if (height.present) {
map['height'] = i0.Variable<int>(height.value);
}
if (durationInSeconds.present) {
map['duration_in_seconds'] = i0.Variable<int>(durationInSeconds.value);
if (durationMs.present) {
map['duration_ms'] = i0.Variable<int>(durationMs.value);
}
if (id.present) {
map['id'] = i0.Variable<String>(id.value);
@@ -1227,7 +1222,7 @@ class TrashedLocalAssetEntityCompanion
..write('updatedAt: $updatedAt, ')
..write('width: $width, ')
..write('height: $height, ')
..write('durationInSeconds: $durationInSeconds, ')
..write('durationMs: $durationMs, ')
..write('id: $id, ')
..write('albumId: $albumId, ')
..write('checksum: $checksum, ')

View File

@@ -10,6 +10,7 @@ import 'package:immich_mobile/infrastructure/entities/exif.entity.dart';
import 'package:immich_mobile/infrastructure/entities/local_album.entity.dart';
import 'package:immich_mobile/infrastructure/entities/local_album_asset.entity.dart';
import 'package:immich_mobile/infrastructure/entities/local_asset.entity.dart';
import 'package:immich_mobile/infrastructure/entities/local_asset.entity.drift.dart';
import 'package:immich_mobile/infrastructure/entities/memory.entity.dart';
import 'package:immich_mobile/infrastructure/entities/memory_asset.entity.dart';
import 'package:immich_mobile/infrastructure/entities/partner.entity.dart';
@@ -18,10 +19,12 @@ import 'package:immich_mobile/infrastructure/entities/remote_album.entity.dart';
import 'package:immich_mobile/infrastructure/entities/remote_album_asset.entity.dart';
import 'package:immich_mobile/infrastructure/entities/remote_album_user.entity.dart';
import 'package:immich_mobile/infrastructure/entities/remote_asset.entity.dart';
import 'package:immich_mobile/infrastructure/entities/remote_asset.entity.drift.dart';
import 'package:immich_mobile/infrastructure/entities/remote_asset_cloud_id.entity.dart';
import 'package:immich_mobile/infrastructure/entities/stack.entity.dart';
import 'package:immich_mobile/infrastructure/entities/store.entity.dart';
import 'package:immich_mobile/infrastructure/entities/trashed_local_asset.entity.dart';
import 'package:immich_mobile/infrastructure/entities/trashed_local_asset.entity.drift.dart';
import 'package:immich_mobile/infrastructure/entities/user.entity.dart';
import 'package:immich_mobile/infrastructure/entities/user_metadata.entity.dart';
import 'package:immich_mobile/infrastructure/repositories/db.repository.drift.dart';
@@ -81,7 +84,7 @@ class Drift extends $Drift {
}
@override
int get schemaVersion => 22;
int get schemaVersion => 23;
@override
MigrationStrategy get migration => MigrationStrategy(
@@ -222,6 +225,27 @@ class Drift extends $Drift {
await m.createTable(v22.assetEditEntity);
await m.createIndex(v22.idxAssetEditAssetId);
},
from22To23: (m, v23) async {
await m.renameColumn(v23.localAssetEntity, 'duration_in_seconds', v23.localAssetEntity.durationMs);
await m.renameColumn(v23.remoteAssetEntity, 'duration_in_seconds', v23.remoteAssetEntity.durationMs);
await m.renameColumn(
v23.trashedLocalAssetEntity,
'duration_in_seconds',
v23.trashedLocalAssetEntity.durationMs,
);
await localAssetEntity.update().write(
LocalAssetEntityCompanion.custom(durationMs: v23.localAssetEntity.durationMs * const Constant(1000)),
);
await remoteAssetEntity.update().write(
RemoteAssetEntityCompanion.custom(durationMs: v23.remoteAssetEntity.durationMs * const Constant(1000)),
);
await trashedLocalAssetEntity.update().write(
TrashedLocalAssetEntityCompanion.custom(
durationMs: v23.trashedLocalAssetEntity.durationMs * const Constant(1000),
),
);
},
),
);

File diff suppressed because it is too large Load Diff

View File

@@ -297,7 +297,7 @@ class DriftLocalAlbumRepository extends DriftDatabaseRepository {
updatedAt: Value(asset.updatedAt),
width: Value(asset.width),
height: Value(asset.height),
durationInSeconds: Value(asset.durationInSeconds),
durationMs: Value(asset.durationMs),
id: asset.id,
orientation: Value(asset.orientation),
isFavorite: Value(asset.isFavorite),
@@ -329,7 +329,7 @@ class DriftLocalAlbumRepository extends DriftDatabaseRepository {
updatedAt: Value(asset.updatedAt),
width: Value(asset.width),
height: Value(asset.height),
durationInSeconds: Value(asset.durationInSeconds),
durationMs: Value(asset.durationMs),
id: asset.id,
checksum: const Value(null),
orientation: Value(asset.orientation),

View File

@@ -9,6 +9,7 @@ import 'package:immich_mobile/domain/models/asset_edit.model.dart';
import 'package:immich_mobile/domain/models/memory.model.dart';
import 'package:immich_mobile/domain/models/user.model.dart';
import 'package:immich_mobile/domain/models/user_metadata.model.dart';
import 'package:immich_mobile/extensions/string_extensions.dart';
import 'package:immich_mobile/infrastructure/entities/asset_edit.entity.drift.dart';
import 'package:immich_mobile/infrastructure/entities/asset_face.entity.drift.dart';
import 'package:immich_mobile/infrastructure/entities/auth_user.entity.drift.dart';
@@ -190,7 +191,7 @@ class SyncStreamRepository extends DriftDatabaseRepository {
type: Value(asset.type.toAssetType()),
createdAt: Value.absentIfNull(asset.fileCreatedAt),
updatedAt: Value.absentIfNull(asset.fileModifiedAt),
durationInSeconds: Value(asset.duration?.toDuration()?.inSeconds ?? 0),
durationMs: Value(asset.duration?.toDuration()?.inMilliseconds ?? 0),
checksum: Value(asset.checksum),
isFavorite: Value(asset.isFavorite),
ownerId: Value(asset.ownerId),
@@ -843,18 +844,6 @@ extension on api.UserMetadataKey {
};
}
extension on String {
Duration? toDuration() {
try {
final parts = split(':').map((e) => double.parse(e).toInt()).toList(growable: false);
return Duration(hours: parts[0], minutes: parts[1], seconds: parts[2]);
} catch (_) {
return null;
}
}
}
extension on UserAvatarColor {
AvatarColor? toAvatarColor() => AvatarColor.values.firstWhereOrNull((c) => c.name == value);
}

View File

@@ -83,7 +83,7 @@ class DriftTimelineRepository extends DriftDatabaseRepository {
width: row.width,
height: row.height,
isFavorite: row.isFavorite,
durationInSeconds: row.durationInSeconds,
durationMs: row.durationMs,
livePhotoVideoId: row.livePhotoVideoId,
stackId: row.stackId,
isEdited: row.isEdited,
@@ -99,7 +99,7 @@ class DriftTimelineRepository extends DriftDatabaseRepository {
width: row.width,
height: row.height,
isFavorite: row.isFavorite,
durationInSeconds: row.durationInSeconds,
durationMs: row.durationMs,
orientation: row.orientation,
playbackStyle: AssetPlaybackStyle.values[row.playbackStyle],
cloudId: row.iCloudId,

View File

@@ -82,7 +82,7 @@ class DriftTrashedLocalAssetRepository extends DriftDatabaseRepository {
updatedAt: Value(item.asset.updatedAt),
width: Value(item.asset.width),
height: Value(item.asset.height),
durationInSeconds: Value(item.asset.durationInSeconds),
durationMs: Value(item.asset.durationMs),
isFavorite: Value(item.asset.isFavorite),
orientation: Value(item.asset.orientation),
playbackStyle: Value(item.asset.playbackStyle),
@@ -145,7 +145,7 @@ class DriftTrashedLocalAssetRepository extends DriftDatabaseRepository {
type: Value(asset.type),
width: Value(asset.width),
height: Value(asset.height),
durationInSeconds: Value(asset.durationInSeconds),
durationMs: Value(asset.durationMs),
isFavorite: Value(asset.isFavorite),
orientation: Value(asset.orientation),
playbackStyle: Value(asset.playbackStyle),
@@ -193,7 +193,7 @@ class DriftTrashedLocalAssetRepository extends DriftDatabaseRepository {
updatedAt: Value(e.updatedAt),
width: Value(e.width),
height: Value(e.height),
durationInSeconds: Value(e.durationInSeconds),
durationMs: Value(e.durationMs),
checksum: Value(e.checksum),
isFavorite: Value(e.isFavorite),
orientation: Value(e.orientation),
@@ -244,7 +244,7 @@ class DriftTrashedLocalAssetRepository extends DriftDatabaseRepository {
updatedAt: Value(e.asset.updatedAt),
width: Value(e.asset.width),
height: Value(e.asset.height),
durationInSeconds: Value(e.asset.durationInSeconds),
durationMs: Value(e.asset.durationMs),
checksum: Value(e.asset.checksum),
isFavorite: Value(e.asset.isFavorite),
orientation: Value(e.asset.orientation),

View File

@@ -8,5 +8,5 @@ mixin AssetEntityMixin on Table {
DateTimeColumn get updatedAt => dateTime().withDefault(currentDateAndTime)();
IntColumn get width => integer().nullable()();
IntColumn get height => integer().nullable()();
IntColumn get durationInSeconds => integer().nullable()();
IntColumn get durationMs => integer().nullable()();
}

View File

@@ -97,7 +97,7 @@ class PlatformAsset {
this.updatedAt,
this.width,
this.height,
required this.durationInSeconds,
required this.durationMs,
required this.orientation,
required this.isFavorite,
this.adjustmentTime,
@@ -120,7 +120,7 @@ class PlatformAsset {
int? height;
int durationInSeconds;
int durationMs;
int orientation;
@@ -143,7 +143,7 @@ class PlatformAsset {
updatedAt,
width,
height,
durationInSeconds,
durationMs,
orientation,
isFavorite,
adjustmentTime,
@@ -167,7 +167,7 @@ class PlatformAsset {
updatedAt: result[4] as int?,
width: result[5] as int?,
height: result[6] as int?,
durationInSeconds: result[7]! as int,
durationMs: result[7]! as int,
orientation: result[8]! as int,
isFavorite: result[9]! as bool,
adjustmentTime: result[10] as int?,
@@ -193,7 +193,7 @@ class PlatformAsset {
_deepEquals(updatedAt, other.updatedAt) &&
_deepEquals(width, other.width) &&
_deepEquals(height, other.height) &&
_deepEquals(durationInSeconds, other.durationInSeconds) &&
_deepEquals(durationMs, other.durationMs) &&
_deepEquals(orientation, other.orientation) &&
_deepEquals(isFavorite, other.isFavorite) &&
_deepEquals(adjustmentTime, other.adjustmentTime) &&

View File

@@ -112,10 +112,7 @@ class _AssetPropertiesSectionState extends ConsumerState<_AssetPropertiesSection
_PropertyItem(label: 'Updated At', value: asset.updatedAt.toString()),
_PropertyItem(label: 'Width', value: asset.width?.toString()),
_PropertyItem(label: 'Height', value: asset.height?.toString()),
_PropertyItem(
label: 'Duration',
value: asset.durationInSeconds != null ? '${asset.durationInSeconds} seconds' : null,
),
_PropertyItem(label: 'Duration', value: asset.durationMs != null ? '${asset.durationMs} ms' : null),
_PropertyItem(label: 'Is Favorite', value: asset.isFavorite.toString()),
_PropertyItem(label: 'Live Photo Video ID', value: asset.livePhotoVideoId),
_PropertyItem(label: 'Is Edited', value: asset.isEdited.toString()),

View File

@@ -148,7 +148,7 @@ class _NativeVideoViewerState extends ConsumerState<NativeVideoViewer> with Widg
if (ref.read(assetViewerProvider).showingDetails) return;
final autoPlayVideo = AppSetting.get(Setting.autoPlayVideo);
if (autoPlayVideo) await _notifier.play();
if (autoPlayVideo || widget.asset.isMotionPhoto) await _notifier.play();
}
void _onPlaybackEnded() {

View File

@@ -45,7 +45,6 @@ mixin CancellableImageProviderMixin<T extends Object> on CancellableImageProvide
completer.operation.valueOrCancellation().whenComplete(() {
cachedStream.removeListener(listener);
cachedOperation = null;
});
cachedOperation = completer.operation;
return null;
@@ -106,18 +105,33 @@ mixin CancellableImageProviderMixin<T extends Object> on CancellableImageProvide
}
}
Stream<ImageInfo> initialImageStream() async* {
Stream<ImageInfo> initialImageStream({required bool isFinal}) async* {
final cachedOperation = this.cachedOperation;
if (isCancelled) {
return;
}
if (cachedOperation == null) {
// image resolved synchronously
isFinished = isFinal;
return;
}
try {
final cachedImage = await cachedOperation.valueOrCancellation();
if (cachedImage != null && !isCancelled) {
yield cachedImage;
if (isCancelled || cachedImage == null) {
return;
}
isFinished = isFinal;
yield cachedImage;
} catch (e, stack) {
if (isCancelled) {
return;
}
if (isFinal) {
isFinished = true;
PaintingBinding.instance.imageCache.evict(this);
rethrow;
}
_log.severe('Error loading initial image', e, stack);
} finally {
this.cachedOperation = null;

View File

@@ -1,8 +1,8 @@
import 'package:flutter/foundation.dart';
import 'package:flutter/widgets.dart';
import 'package:immich_mobile/domain/models/asset/base_asset.model.dart';
import 'package:immich_mobile/domain/models/store.model.dart';
import 'package:immich_mobile/entities/store.entity.dart';
import 'package:immich_mobile/domain/models/setting.model.dart';
import 'package:immich_mobile/domain/services/setting.service.dart';
import 'package:immich_mobile/infrastructure/loaders/image_request.dart';
import 'package:immich_mobile/presentation/widgets/images/animated_image_stream_completer.dart';
import 'package:immich_mobile/presentation/widgets/images/image_provider.dart';
@@ -97,51 +97,55 @@ class LocalFullImageProvider extends CancellableImageProvider<LocalFullImageProv
}
Stream<ImageInfo> _codec(LocalFullImageProvider key, ImageDecoderCallback decode) async* {
yield* initialImageStream();
final loadOriginal = AppSetting.get(Setting.loadOriginal);
final loadPreview = AppSetting.get(Setting.loadPreview);
yield* initialImageStream(isFinal: !loadOriginal && !loadPreview);
if (isCancelled) {
return;
}
final loadOriginal = Store.get(StoreKey.loadOriginal, false);
final devicePixelRatio = PlatformDispatcher.instance.views.first.devicePixelRatio;
var request = this.request = LocalImageRequest(
localId: key.id,
size: Size(size.width * devicePixelRatio, size.height * devicePixelRatio),
assetType: key.assetType,
);
yield* loadRequest(request, decode, isFinal: !loadOriginal);
if (loadPreview) {
final devicePixelRatio = PlatformDispatcher.instance.views.first.devicePixelRatio;
final previewRequest = request = LocalImageRequest(
localId: key.id,
size: Size(size.width * devicePixelRatio, size.height * devicePixelRatio),
assetType: key.assetType,
);
yield* loadRequest(previewRequest, decode, isFinal: !loadOriginal);
if (isCancelled) {
return;
}
}
if (!loadOriginal) {
return;
}
if (isCancelled) {
return;
}
request = this.request = LocalImageRequest(localId: key.id, assetType: key.assetType, size: Size.zero);
yield* loadRequest(request, decode, isFinal: true);
final originalRequest = request = LocalImageRequest(localId: key.id, assetType: key.assetType, size: Size.zero);
yield* loadRequest(originalRequest, decode, isFinal: true);
}
Stream<Object> _animatedCodec(LocalFullImageProvider key, ImageDecoderCallback decode) async* {
yield* initialImageStream();
yield* initialImageStream(isFinal: false);
if (isCancelled) {
return;
}
final devicePixelRatio = PlatformDispatcher.instance.views.first.devicePixelRatio;
final previewRequest = request = LocalImageRequest(
localId: key.id,
size: Size(size.width * devicePixelRatio, size.height * devicePixelRatio),
assetType: key.assetType,
);
yield* loadRequest(previewRequest, decode, isFinal: false);
if (AppSetting.get(Setting.loadPreview)) {
final devicePixelRatio = PlatformDispatcher.instance.views.first.devicePixelRatio;
final previewRequest = request = LocalImageRequest(
localId: key.id,
size: Size(size.width * devicePixelRatio, size.height * devicePixelRatio),
assetType: key.assetType,
);
yield* loadRequest(previewRequest, decode, isFinal: false);
if (isCancelled) {
return;
if (isCancelled) {
return;
}
}
// always try original for animated, since previews don't support animation

View File

@@ -107,31 +107,35 @@ class RemoteFullImageProvider extends CancellableImageProvider<RemoteFullImagePr
}
Stream<ImageInfo> _codec(RemoteFullImageProvider key, ImageDecoderCallback decode) async* {
yield* initialImageStream();
final isImage = assetType == AssetType.image;
final loadOriginal = isImage && AppSetting.get(Setting.loadOriginal);
final loadPreview = isImage && AppSetting.get(Setting.loadPreview);
yield* initialImageStream(isFinal: !loadOriginal && !loadPreview);
if (isCancelled) {
return;
}
final previewRequest = request = RemoteImageRequest(
uri: getThumbnailUrlForRemoteId(
key.assetId,
type: AssetMediaSize.preview,
thumbhash: key.thumbhash,
edited: key.edited,
),
);
final loadOriginal = assetType == AssetType.image && AppSetting.get(Setting.loadOriginal);
yield* loadRequest(previewRequest, decode, isFinal: !loadOriginal);
if (loadPreview) {
final previewRequest = request = RemoteImageRequest(
uri: getThumbnailUrlForRemoteId(
key.assetId,
type: AssetMediaSize.preview,
thumbhash: key.thumbhash,
edited: key.edited,
),
);
yield* loadRequest(previewRequest, decode, isFinal: !loadOriginal);
if (isCancelled) {
return;
}
}
if (!loadOriginal) {
return;
}
if (isCancelled) {
return;
}
final originalRequest = request = RemoteImageRequest(
uri: getOriginalUrlForRemoteId(key.assetId, edited: key.edited),
);
@@ -139,24 +143,26 @@ class RemoteFullImageProvider extends CancellableImageProvider<RemoteFullImagePr
}
Stream<Object> _animatedCodec(RemoteFullImageProvider key, ImageDecoderCallback decode) async* {
yield* initialImageStream();
yield* initialImageStream(isFinal: false);
if (isCancelled) {
return;
}
final previewRequest = request = RemoteImageRequest(
uri: getThumbnailUrlForRemoteId(
key.assetId,
type: AssetMediaSize.preview,
thumbhash: key.thumbhash,
edited: key.edited,
),
);
yield* loadRequest(previewRequest, decode, isFinal: false);
if (AppSetting.get(Setting.loadPreview)) {
final previewRequest = request = RemoteImageRequest(
uri: getThumbnailUrlForRemoteId(
key.assetId,
type: AssetMediaSize.preview,
thumbhash: key.thumbhash,
edited: key.edited,
),
);
yield* loadRequest(previewRequest, decode, isFinal: false);
if (isCancelled) {
return;
if (isCancelled) {
return;
}
}
// always try original for animated, since previews don't support animation

View File

@@ -129,7 +129,7 @@ class _ThumbnailTileState extends ConsumerState<ThumbnailTile> {
}
animation.addStatusListener(animationStatusListener);
return to.widget;
return direction == HeroFlightDirection.push ? from.widget : to.widget;
},
),
),

View File

@@ -7,13 +7,15 @@ import 'package:immich_mobile/domain/services/store.service.dart';
import 'package:immich_mobile/entities/store.entity.dart';
import 'package:immich_mobile/routing/router.dart';
import 'package:immich_mobile/services/api.service.dart';
import 'package:immich_mobile/services/auth.service.dart';
import 'package:logging/logging.dart';
import 'package:openapi/api.dart';
class AuthGuard extends AutoRouteGuard {
final ApiService _apiService;
final AuthService _authService;
final _log = Logger("AuthGuard");
AuthGuard(this._apiService);
AuthGuard(this._apiService, this._authService);
@override
void onNavigation(NavigationResolver resolver, StackRouter router) async {
resolver.next(true);
@@ -27,7 +29,7 @@ class AuthGuard extends AutoRouteGuard {
if (res == null || res.authStatus != true) {
// If the access token is invalid, take user back to login
_log.fine('User token is invalid. Redirecting to login');
unawaited(router.replaceAll([const LoginRoute()]));
unawaited(router.replaceAll([const LoginRoute()]).then((_) => _authService.clearLocalData()));
}
} on StoreKeyNotFoundException catch (_) {
// If there is no access token, take us to the login page
@@ -38,7 +40,7 @@ class AuthGuard extends AutoRouteGuard {
// On an unauthorized request, take us to the login page
if (e.code == HttpStatus.unauthorized) {
_log.warning("Unauthorized access token.");
unawaited(router.replaceAll([const LoginRoute()]));
unawaited(router.replaceAll([const LoginRoute()]).then((_) => _authService.clearLocalData()));
return;
}
} catch (e) {

View File

@@ -73,6 +73,7 @@ import 'package:immich_mobile/routing/auth_guard.dart';
import 'package:immich_mobile/routing/duplicate_guard.dart';
import 'package:immich_mobile/routing/locked_guard.dart';
import 'package:immich_mobile/services/api.service.dart';
import 'package:immich_mobile/services/auth.service.dart';
import 'package:immich_mobile/services/local_auth.service.dart';
import 'package:immich_mobile/services/secure_storage.service.dart';
import 'package:maplibre_gl/maplibre_gl.dart';
@@ -82,6 +83,7 @@ part 'router.gr.dart';
final appRouterProvider = Provider(
(ref) => AppRouter(
ref.watch(apiServiceProvider),
ref.watch(authServiceProvider),
ref.watch(galleryPermissionNotifier.notifier),
ref.watch(secureStorageServiceProvider),
ref.watch(localAuthServiceProvider),
@@ -96,11 +98,12 @@ class AppRouter extends RootStackRouter {
AppRouter(
ApiService apiService,
AuthService authService,
GalleryPermissionNotifier galleryPermissionNotifier,
SecureStorageService secureStorageService,
LocalAuthService localAuthService,
) {
_authGuard = AuthGuard(apiService);
_authGuard = AuthGuard(apiService, authService);
_duplicateGuard = const DuplicateGuard();
_lockedGuard = LockedGuard(apiService, secureStorageService, localAuthService);
}

View File

@@ -54,6 +54,9 @@ class _Executor extends Mixinable<_Executor> with _ExecutorLogger {
var _dynamicSpawning = false;
var _isolatesCount = numberOfProcessors;
@visibleForTesting
UnmodifiableListView<Worker> get pool => UnmodifiableListView(_pool);
@override
Future<void> init({int? isolatesCount, bool? dynamicSpawning}) async {
if (_pool.isNotEmpty) {
@@ -76,7 +79,9 @@ class _Executor extends Mixinable<_Executor> with _ExecutorLogger {
Future<void> dispose() async {
_queue.clear();
for (final worker in _pool) {
worker.kill();
if (worker.initialized || worker.initializing) {
worker.kill();
}
}
_pool.clear();
super.dispose();
@@ -157,9 +162,7 @@ class _Executor extends Mixinable<_Executor> with _ExecutorLogger {
_nextTaskId++;
late final Task<R> task;
final completer = Completer<R>();
if (execution is Execute<R>) {
task = TaskRegular<R>(id: id, workPriority: priority, execution: execution, completer: completer);
} else if (execution is ExecuteWithPort<R>) {
if (execution is ExecuteWithPort<R>) {
task = TaskWithPort<R>(
id: id,
workPriority: priority,
@@ -177,6 +180,8 @@ class _Executor extends Mixinable<_Executor> with _ExecutorLogger {
completer: completer,
onMessage: onMessage!,
);
} else if (execution is Execute<R>) {
task = TaskRegular<R>(id: id, workPriority: priority, execution: execution, completer: completer);
}
_queue.add(task);
_schedule();
@@ -199,7 +204,7 @@ class _Executor extends Mixinable<_Executor> with _ExecutorLogger {
if (_pool.every((worker) => worker.taskId != null)) {
return;
}
if (_dynamicSpawning) {
if (_dynamicSpawning && _queue.isNotEmpty) {
final freeWorker = _pool.firstWhereOrNull(
(worker) => worker.taskId == null && !worker.initialized && !worker.initializing,
);
@@ -221,7 +226,7 @@ class _Executor extends Mixinable<_Executor> with _ExecutorLogger {
.work(task)
.then(
(value) {
//could be completed already by cancel and it is normal.
//might be completed by cancel and it is normal.
//Assuming that worker finished with error and cleaned gracefully
task.complete(value, null, null);
},

View File

@@ -1,5 +1,5 @@
[tools]
flutter = "3.41.6"
flutter = "3.41.7"
[tools."github:CQLabs/homebrew-dcm"]
version = "1.30.0"

View File

@@ -24,13 +24,11 @@ class AssetMediaStatus {
String toJson() => value;
static const created = AssetMediaStatus._(r'created');
static const replaced = AssetMediaStatus._(r'replaced');
static const duplicate = AssetMediaStatus._(r'duplicate');
/// List of all possible values in this [enum][AssetMediaStatus].
static const values = <AssetMediaStatus>[
created,
replaced,
duplicate,
];
@@ -71,7 +69,6 @@ class AssetMediaStatusTypeTransformer {
if (data != null) {
switch (data) {
case r'created': return AssetMediaStatus.created;
case r'replaced': return AssetMediaStatus.replaced;
case r'duplicate': return AssetMediaStatus.duplicate;
default:
if (!allowNull) {

View File

@@ -32,7 +32,7 @@ class PlatformAsset {
final int? updatedAt;
final int? width;
final int? height;
final int durationInSeconds;
final int durationMs;
final int orientation;
final bool isFavorite;
@@ -50,7 +50,7 @@ class PlatformAsset {
this.updatedAt,
this.width,
this.height,
this.durationInSeconds = 0,
this.durationMs = 0,
this.orientation = 0,
this.isFavorite = false,
this.adjustmentTime,

View File

@@ -29,10 +29,10 @@ packages:
dependency: transitive
description:
name: archive
sha256: "0c64e928dcbefddecd234205422bcfc2b5e6d31be0b86fef0d0dd48d7b4c9742"
sha256: a96e8b390886ee8abb49b7bd3ac8df6f451c621619f52a26e815fdcf568959ff
url: "https://pub.dev"
source: hosted
version: "4.0.4"
version: "4.0.9"
args:
dependency: transitive
description:
@@ -45,10 +45,10 @@ packages:
dependency: "direct main"
description:
name: async
sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb"
sha256: e2eb0491ba5ddb6177742d2da23904574082139b07c1e33b8503b9f46f3e1a37
url: "https://pub.dev"
source: hosted
version: "2.13.0"
version: "2.13.1"
auto_route:
dependency: "direct main"
description:
@@ -69,12 +69,12 @@ packages:
dependency: "direct main"
description:
name: background_downloader
sha256: a913b37cc47a656a225e9562b69576000d516f705482f392e2663500e6ff6032
sha256: "4cb23d9ad4f5060944f38164e7b90d4bf99b57b2472a3bd4676e59b2db4afd06"
url: "https://pub.dev"
source: hosted
version: "9.3.0"
version: "9.5.4"
bonsoir:
dependency: transitive
dependency: "direct overridden"
description:
name: bonsoir
sha256: "2e2cf3be580deccad9a48dcaddddf90de092e74b7de2015ef58fb24e11d66496"
@@ -149,10 +149,10 @@ packages:
dependency: transitive
description:
name: build_daemon
sha256: "8e928697a82be082206edb0b9c99c5a4ad6bc31c9e9b8b2f291ae65cd4a25daa"
sha256: bf05f6e12cfea92d3c09308d7bcdab1906cd8a179b023269eed00c071004b957
url: "https://pub.dev"
source: hosted
version: "4.0.4"
version: "4.1.1"
build_runner:
dependency: "direct dev"
description:
@@ -205,10 +205,10 @@ packages:
dependency: transitive
description:
name: checked_yaml
sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff
sha256: "959525d3162f249993882720d52b7e0c833978df229be20702b33d48d91de70f"
url: "https://pub.dev"
source: hosted
version: "2.0.3"
version: "2.0.4"
cli_util:
dependency: transitive
description:
@@ -261,10 +261,10 @@ packages:
dependency: transitive
description:
name: connectivity_plus_platform_interface
sha256: "42657c1715d48b167930d5f34d00222ac100475f73d10162ddf43e714932f204"
sha256: "3c09627c536d22fd24691a905cdd8b14520de69da52c7a97499c8be5284a32ed"
url: "https://pub.dev"
source: hosted
version: "2.0.1"
version: "2.1.0"
convert:
dependency: transitive
description:
@@ -277,26 +277,26 @@ packages:
dependency: "direct main"
description:
name: crop_image
sha256: "4fdebd00d0c7d1a6e3abeb1e3843efbc202204b867f3e377fcebcf77aaf69a17"
sha256: "27cbce1685a595efee62caab81c98b49b636f765c1da86353f58f5b2bf2775d8"
url: "https://pub.dev"
source: hosted
version: "1.0.16"
version: "1.0.17"
cross_file:
dependency: transitive
description:
name: cross_file
sha256: "7caf6a750a0c04effbb52a676dce9a4a592e10ad35c34d6d2d0e4811160d5670"
sha256: "28bb3ae56f117b5aec029d702a90f57d285cd975c3c5c281eaca38dbc47c5937"
url: "https://pub.dev"
source: hosted
version: "0.3.4+2"
version: "0.3.5+2"
crypto:
dependency: "direct main"
description:
name: crypto
sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855"
sha256: c8ea0233063ba03258fbcf2ca4d6dadfefe14f02fab57702265467a19f27fadf
url: "https://pub.dev"
source: hosted
version: "3.0.6"
version: "3.0.7"
csslib:
dependency: transitive
description:
@@ -326,10 +326,10 @@ packages:
dependency: transitive
description:
name: dbus
sha256: "79e0c23480ff85dc68de79e2cd6334add97e48f7f4865d17686dd6ea81a47e8c"
sha256: d0c98dcd4f5169878b6cf8f6e0a52403a9dff371a3e2f019697accbf6f44a270
url: "https://pub.dev"
source: hosted
version: "0.7.11"
version: "0.7.12"
desktop_webview_window:
dependency: transitive
description:
@@ -342,10 +342,10 @@ packages:
dependency: "direct main"
description:
name: device_info_plus
sha256: dd0e8e02186b2196c7848c9d394a5fd6e5b57a43a546082c5820b1ec72317e33
sha256: b4fed1b2835da9d670d7bed7db79ae2a94b0f5ad6312268158a9b5479abbacdd
url: "https://pub.dev"
source: hosted
version: "12.2.0"
version: "12.4.0"
device_info_plus_platform_interface:
dependency: transitive
description:
@@ -414,10 +414,10 @@ packages:
dependency: "direct main"
description:
name: ffi
sha256: "289279317b4b16eb2bb7e271abccd4bf84ec9bdcbe999e278a94b804f5630418"
sha256: "6d7fd89431262d8f3125e81b50d3847a091d846eafcd4fdb88dd06f36d705a45"
url: "https://pub.dev"
source: hosted
version: "2.1.4"
version: "2.2.0"
file:
dependency: "direct dev"
description:
@@ -430,34 +430,34 @@ packages:
dependency: transitive
description:
name: file_selector_linux
sha256: "54cbbd957e1156d29548c7d9b9ec0c0ebb6de0a90452198683a7d23aed617a33"
sha256: "2567f398e06ac72dcf2e98a0c95df2a9edd03c2c2e0cacd4780f20cdf56263a0"
url: "https://pub.dev"
source: hosted
version: "0.9.3+2"
version: "0.9.4"
file_selector_macos:
dependency: transitive
description:
name: file_selector_macos
sha256: "271ab9986df0c135d45c3cdb6bd0faa5db6f4976d3e4b437cf7d0f258d941bfc"
sha256: "5e0bbe9c312416f1787a68259ea1505b52f258c587f12920422671807c4d618a"
url: "https://pub.dev"
source: hosted
version: "0.9.4+2"
version: "0.9.5"
file_selector_platform_interface:
dependency: transitive
description:
name: file_selector_platform_interface
sha256: a3994c26f10378a039faa11de174d7b78eb8f79e4dd0af2a451410c1a5c3f66b
sha256: "35e0bd61ebcdb91a3505813b055b09b79dfdc7d0aee9c09a7ba59ae4bb13dc85"
url: "https://pub.dev"
source: hosted
version: "2.6.2"
version: "2.7.0"
file_selector_windows:
dependency: transitive
description:
name: file_selector_windows
sha256: "320fcfb6f33caa90f0b58380489fc5ac05d99ee94b61aa96ec2bff0ba81d3c2b"
sha256: "62197474ae75893a62df75939c777763d39c2bc5f73ce5b88497208bc269abfd"
url: "https://pub.dev"
source: hosted
version: "0.9.3+4"
version: "0.9.3+5"
fixnum:
dependency: transitive
description:
@@ -471,14 +471,6 @@ packages:
description: flutter
source: sdk
version: "0.0.0"
flutter_cache_manager:
dependency: "direct main"
description:
name: flutter_cache_manager
sha256: "400b6592f16a4409a7f2bb929a9a7e38c72cceb8ffb99ee57bbf2cb2cecf8386"
url: "https://pub.dev"
source: hosted
version: "3.4.1"
flutter_displaymode:
dependency: "direct main"
description:
@@ -557,10 +549,10 @@ packages:
dependency: transitive
description:
name: flutter_plugin_android_lifecycle
sha256: "5a1e6fb2c0561958d7e4c33574674bda7b77caaca7a33b758876956f2902eea3"
sha256: "38d1c268de9097ff59cf0e844ac38759fc78f76836d37edad06fa21e182055a0"
url: "https://pub.dev"
source: hosted
version: "2.0.27"
version: "2.0.34"
flutter_riverpod:
dependency: transitive
description:
@@ -621,10 +613,10 @@ packages:
dependency: "direct main"
description:
name: flutter_svg
sha256: b9c2ad5872518a27507ab432d1fb97e8813b05f0fc693f9d40fad06d073e0678
sha256: "1ded017b39c8e15c8948ea855070a5ff8ff8b3d5e83f3446e02d6bb12add7ad9"
url: "https://pub.dev"
source: hosted
version: "2.2.1"
version: "2.2.4"
flutter_test:
dependency: "direct dev"
description: flutter
@@ -634,26 +626,26 @@ packages:
dependency: "direct main"
description:
name: flutter_udid
sha256: "166bee5989a58c66b8b62000ea65edccc7c8167bbafdbb08022638db330dd030"
sha256: fc599671cbe8b328e509c961ec121880406ed994dde659cc9ece9c7503cd31c7
url: "https://pub.dev"
source: hosted
version: "4.0.0"
version: "4.1.2"
flutter_web_auth_2:
dependency: "direct main"
description:
name: flutter_web_auth_2
sha256: "561c32d32ed537853de43852c35849cf1d37f3482f41f22b718ab6112f96b333"
sha256: d354998934ddc338e69b999b2abaeb33c6fd09999d3a5f92ead1a6b49b49712e
url: "https://pub.dev"
source: hosted
version: "5.0.0-alpha.0"
version: "5.0.2"
flutter_web_auth_2_platform_interface:
dependency: transitive
description:
name: flutter_web_auth_2_platform_interface
sha256: "45927587ebb2364cd273675ec95f6f67b81725754b416cef2b65cdc63fd3e853"
sha256: ba0fbba55bffb47242025f96852ad1ffba34bc451568f56ef36e613612baffab
url: "https://pub.dev"
source: hosted
version: "5.0.0-alpha.0"
version: "5.0.0"
flutter_web_plugins:
dependency: transitive
description: flutter
@@ -663,10 +655,10 @@ packages:
dependency: "direct main"
description:
name: fluttertoast
sha256: "25e51620424d92d3db3832464774a6143b5053f15e382d8ffbfd40b6e795dcf1"
sha256: "90778fe0497fe3a09166e8cf2e0867310ff434b794526589e77ec03cf08ba8e8"
url: "https://pub.dev"
source: hosted
version: "8.2.12"
version: "8.2.14"
frontend_server_client:
dependency: transitive
description:
@@ -700,18 +692,18 @@ packages:
dependency: transitive
description:
name: geolocator_android
sha256: "114072db5d1dce0ec0b36af2697f55c133bc89a2c8dd513e137c0afe59696ed4"
sha256: "179c3cb66dfa674fc9ccbf2be872a02658724d1c067634e2c427cf6df7df901a"
url: "https://pub.dev"
source: hosted
version: "5.0.1+1"
version: "5.0.2"
geolocator_apple:
dependency: transitive
description:
name: geolocator_apple
sha256: c4ecead17985ede9634f21500072edfcb3dba0ef7b97f8d7bc556d2d722b3ba3
sha256: dbdd8789d5aaf14cf69f74d4925ad1336b4433a6efdf2fce91e8955dc921bf22
url: "https://pub.dev"
source: hosted
version: "2.3.9"
version: "2.3.13"
geolocator_linux:
dependency: transitive
description:
@@ -724,10 +716,10 @@ packages:
dependency: transitive
description:
name: geolocator_platform_interface
sha256: "386ce3d9cce47838355000070b1d0b13efb5bc430f8ecda7e9238c8409ace012"
sha256: "30cb64f0b9adcc0fb36f628b4ebf4f731a2961a0ebd849f4b56200205056fe67"
url: "https://pub.dev"
source: hosted
version: "4.2.4"
version: "4.2.6"
geolocator_web:
dependency: transitive
description:
@@ -740,10 +732,10 @@ packages:
dependency: transitive
description:
name: geolocator_windows
sha256: "53da08937d07c24b0d9952eb57a3b474e29aae2abf9dd717f7e1230995f13f0e"
sha256: "175435404d20278ffd220de83c2ca293b73db95eafbdc8131fe8609be1421eb6"
url: "https://pub.dev"
source: hosted
version: "0.2.3"
version: "0.2.5"
glob:
dependency: transitive
description:
@@ -812,10 +804,10 @@ packages:
dependency: "direct main"
description:
name: http
sha256: bb2ce4590bc2667c96f318d68cac1b5a7987ec819351d32b1c987239a815e007
sha256: "87721a4a50b19c7f1d49001e51409bddc46303966ce89a65af4f4e6004896412"
url: "https://pub.dev"
source: hosted
version: "1.5.0"
version: "1.6.0"
http_multi_server:
dependency: transitive
description:
@@ -844,42 +836,42 @@ packages:
dependency: transitive
description:
name: image
sha256: "4e973fcf4caae1a4be2fa0a13157aa38a8f9cb049db6529aa00b4d71abc4d928"
sha256: f9881ff4998044947ec38d098bc7c8316ae1186fa786eddffdb867b9bc94dfce
url: "https://pub.dev"
source: hosted
version: "4.5.4"
version: "4.8.0"
image_picker:
dependency: "direct main"
description:
name: image_picker
sha256: "736eb56a911cf24d1859315ad09ddec0b66104bc41a7f8c5b96b4e2620cf5041"
sha256: "784210112be18ea55f69d7076e2c656a4e24949fa9e76429fe53af0c0f4fa320"
url: "https://pub.dev"
source: hosted
version: "1.2.0"
version: "1.2.1"
image_picker_android:
dependency: transitive
description:
name: image_picker_android
sha256: "58a85e6f09fe9c4484d53d18a0bd6271b72c53fce1d05e6f745ae36d8c18efca"
sha256: "66810af8e99b2657ee98e5c6f02064f69bb63f7a70e343937f70946c5f8c6622"
url: "https://pub.dev"
source: hosted
version: "0.8.13+5"
version: "0.8.13+16"
image_picker_for_web:
dependency: transitive
description:
name: image_picker_for_web
sha256: "40c2a6a0da15556dc0f8e38a3246064a971a9f512386c3339b89f76db87269b6"
sha256: "66257a3191ab360d23a55c8241c91a6e329d31e94efa7be9cf7a212e65850214"
url: "https://pub.dev"
source: hosted
version: "3.1.0"
version: "3.1.1"
image_picker_ios:
dependency: transitive
description:
name: image_picker_ios
sha256: e675c22790bcc24e9abd455deead2b7a88de4b79f7327a281812f14de1a56f58
sha256: b9c4a438a9ff4f60808c9cf0039b93a42bb6c2211ef6ebb647394b2b3fa84588
url: "https://pub.dev"
source: hosted
version: "0.8.13+1"
version: "0.8.13+6"
image_picker_linux:
dependency: transitive
description:
@@ -900,10 +892,10 @@ packages:
dependency: transitive
description:
name: image_picker_platform_interface
sha256: "9f143b0dba3e459553209e20cc425c9801af48e6dfa4f01a0fcf927be3f41665"
sha256: "567e056716333a1647c64bb6bd873cff7622233a5c3f694be28a583d4715690c"
url: "https://pub.dev"
source: hosted
version: "2.11.0"
version: "2.11.1"
image_picker_windows:
dependency: transitive
description:
@@ -960,10 +952,10 @@ packages:
dependency: transitive
description:
name: json_annotation
sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1"
sha256: cb09e7dac6210041fad964ed7fbee004f14258b4eca4040f72d1234062ace4c8
url: "https://pub.dev"
source: hosted
version: "4.9.0"
version: "4.11.0"
leak_tracker:
dependency: transitive
description:
@@ -1016,26 +1008,26 @@ packages:
dependency: transitive
description:
name: local_auth_android
sha256: "63ad7ca6396290626dc0cb34725a939e4cfe965d80d36112f08d49cf13a8136e"
sha256: a0bdfcc0607050a26ef5b31d6b4b254581c3d3ce3c1816ab4d4f4a9173e84467
url: "https://pub.dev"
source: hosted
version: "1.0.49"
version: "1.0.56"
local_auth_darwin:
dependency: transitive
description:
name: local_auth_darwin
sha256: "630996cd7b7f28f5ab92432c4b35d055dd03a747bc319e5ffbb3c4806a3e50d2"
sha256: "699873970067a40ef2f2c09b4c72eb1cfef64224ef041b3df9fdc5c4c1f91f49"
url: "https://pub.dev"
source: hosted
version: "1.4.3"
version: "1.6.1"
local_auth_platform_interface:
dependency: transitive
description:
name: local_auth_platform_interface
sha256: "1b842ff177a7068442eae093b64abe3592f816afd2a533c0ebcdbe40f9d2075a"
sha256: f98b8e388588583d3f781f6806e4f4c9f9e189d898d27f0c249b93a1973dd122
url: "https://pub.dev"
source: hosted
version: "1.0.10"
version: "1.1.0"
local_auth_windows:
dependency: transitive
description:
@@ -1112,10 +1104,10 @@ packages:
dependency: "direct dev"
description:
name: mocktail
sha256: "890df3f9688106f25755f26b1c60589a92b3ab91a22b8b224947ad041bf172d8"
sha256: "5e1bf53cc7baa8062a33b84424deb61513858ea05c601b8509e683815b5914aa"
url: "https://pub.dev"
source: hosted
version: "1.0.4"
version: "1.0.5"
native_toolchain_c:
dependency: transitive
description:
@@ -1137,10 +1129,10 @@ packages:
dependency: "direct main"
description:
name: network_info_plus
sha256: "08f4166bbb77da9e407edef6322a33f87b18c0ca46483fb25606cb3d2bfcdd2a"
sha256: f926b2ba86aa0086a0dfbb9e5072089bc213d854135c1712f1d29fc89ba3c877
url: "https://pub.dev"
source: hosted
version: "6.1.3"
version: "6.1.4"
network_info_plus_platform_interface:
dependency: transitive
description:
@@ -1161,10 +1153,10 @@ packages:
dependency: transitive
description:
name: objective_c
sha256: "1f81ed9e41909d44162d7ec8663b2c647c202317cc0b56d3d56f6a13146a0b64"
sha256: "100a1c87616ab6ed41ec263b083c0ef3261ee6cd1dc3b0f35f8ddfa4f996fe52"
url: "https://pub.dev"
source: hosted
version: "9.1.0"
version: "9.3.0"
octo_image:
dependency: "direct main"
description:
@@ -1193,26 +1185,26 @@ packages:
dependency: transitive
description:
name: package_config
sha256: "92d4488434b520a62570293fbd33bb556c7d49230791c1b4bbd973baf6d2dc67"
sha256: f096c55ebb7deb7e384101542bfba8c52696c1b56fca2eb62827989ef2353bbc
url: "https://pub.dev"
source: hosted
version: "2.1.1"
version: "2.2.0"
package_info_plus:
dependency: "direct main"
description:
name: package_info_plus
sha256: "7976bfe4c583170d6cdc7077e3237560b364149fcd268b5f53d95a991963b191"
sha256: "16eee997588c60225bda0488b6dcfac69280a6b7a3cf02c741895dd370a02968"
url: "https://pub.dev"
source: hosted
version: "8.3.0"
version: "8.3.1"
package_info_plus_platform_interface:
dependency: transitive
description:
name: package_info_plus_platform_interface
sha256: "6c935fb612dff8e3cc9632c2b301720c77450a126114126ffaafe28d2e87956c"
sha256: "202a487f08836a592a6bd4f901ac69b3a8f146af552bbd14407b6b41e1c3f086"
url: "https://pub.dev"
source: hosted
version: "3.2.0"
version: "3.2.1"
path:
dependency: "direct main"
description:
@@ -1241,18 +1233,18 @@ packages:
dependency: transitive
description:
name: path_provider_android
sha256: "0ca7359dad67fd7063cb2892ab0c0737b2daafd807cf1acecd62374c8fae6c12"
sha256: "149441ca6e4f38193b2e004c0ca6376a3d11f51fa5a77552d8bd4d2b0c0912ba"
url: "https://pub.dev"
source: hosted
version: "2.2.16"
version: "2.2.23"
path_provider_foundation:
dependency: "direct main"
description:
name: path_provider_foundation
sha256: efaec349ddfc181528345c56f8eda9d6cccd71c177511b132c6a0ddaefaa2738
sha256: "2a376b7d6392d80cd3705782d2caa734ca4727776db0b6ec36ef3f1855197699"
url: "https://pub.dev"
source: hosted
version: "2.4.3"
version: "2.6.0"
path_provider_linux:
dependency: transitive
description:
@@ -1297,10 +1289,10 @@ packages:
dependency: transitive
description:
name: permission_handler_apple
sha256: f84a188e79a35c687c132a0a0556c254747a08561e99ab933f12f6ca71ef3c98
sha256: f000131e755c54cf4d84a5d8bd6e4149e262cc31c5a8b1d698de1ac85fa41023
url: "https://pub.dev"
source: hosted
version: "9.4.6"
version: "9.4.7"
permission_handler_html:
dependency: transitive
description:
@@ -1329,18 +1321,18 @@ packages:
dependency: transitive
description:
name: petitparser
sha256: "1a97266a94f7350d30ae522c0af07890c70b8e62c71e8e3920d1db4d23c057d1"
sha256: "91bd59303e9f769f108f8df05e371341b15d59e995e6806aefab827b58336675"
url: "https://pub.dev"
source: hosted
version: "7.0.1"
version: "7.0.2"
photo_manager:
dependency: "direct main"
description:
name: photo_manager
sha256: a0d9a7a9bc35eda02d33766412bde6d883a8b0acb86bbe37dac5f691a0894e8a
sha256: fb3bc8ea653370f88742b3baa304700107c83d12748aa58b2b9f2ed3ef15e6c2
url: "https://pub.dev"
source: hosted
version: "3.7.1"
version: "3.9.0"
pigeon:
dependency: "direct dev"
description:
@@ -1377,26 +1369,26 @@ packages:
dependency: transitive
description:
name: pool
sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a"
sha256: "978783255c543aa3586a1b3c21f6e9d720eb315376a915872c61ef8b5c20177d"
url: "https://pub.dev"
source: hosted
version: "1.5.1"
version: "1.5.2"
posix:
dependency: transitive
description:
name: posix
sha256: a0117dc2167805aa9125b82eee515cc891819bac2f538c83646d355b16f58b9a
sha256: "185ef7606574f789b40f289c233efa52e96dead518aed988e040a10737febb07"
url: "https://pub.dev"
source: hosted
version: "6.0.1"
version: "6.5.0"
process:
dependency: transitive
description:
name: process
sha256: "107d8be718f120bbba9dcd1e95e3bd325b1b4a4f07db64154635ba03f2567a0d"
sha256: c6248e4526673988586e8c00bb22a49210c258dc91df5227d5da9748ecf79744
url: "https://pub.dev"
source: hosted
version: "5.0.3"
version: "5.0.5"
protobuf:
dependency: transitive
description:
@@ -1445,14 +1437,6 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.6.1"
rxdart:
dependency: transitive
description:
name: rxdart
sha256: "5c3004a4a8dbb94bd4bf5412a4def4acdaa12e12f269737a5751369e12d1a962"
url: "https://pub.dev"
source: hosted
version: "0.28.0"
scroll_date_picker:
dependency: "direct main"
description:
@@ -1521,26 +1505,26 @@ packages:
dependency: transitive
description:
name: shared_preferences
sha256: "846849e3e9b68f3ef4b60c60cf4b3e02e9321bc7f4d8c4692cf87ffa82fc8a3a"
sha256: c3025c5534b01739267eb7d76959bbc25a6d10f6988e1c2a3036940133dd10bf
url: "https://pub.dev"
source: hosted
version: "2.5.2"
version: "2.5.5"
shared_preferences_android:
dependency: transitive
description:
name: shared_preferences_android
sha256: "3ec7210872c4ba945e3244982918e502fa2bfb5230dff6832459ca0e1879b7ad"
sha256: e8d4762b1e2e8578fc4d0fd548cebf24afd24f49719c08974df92834565e2c53
url: "https://pub.dev"
source: hosted
version: "2.4.8"
version: "2.4.23"
shared_preferences_foundation:
dependency: transitive
description:
name: shared_preferences_foundation
sha256: "6a52cfcdaeac77cad8c97b539ff688ccfc458c007b4db12be584fbe5c0e49e03"
sha256: "4e7eaffc2b17ba398759f1151415869a34771ba11ebbccd1b0145472a619a64f"
url: "https://pub.dev"
source: hosted
version: "2.5.4"
version: "2.5.6"
shared_preferences_linux:
dependency: transitive
description:
@@ -1553,10 +1537,10 @@ packages:
dependency: transitive
description:
name: shared_preferences_platform_interface
sha256: "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80"
sha256: "649dc798a33931919ea356c4305c2d1f81619ea6e92244070b520187b5140ef9"
url: "https://pub.dev"
source: hosted
version: "2.4.1"
version: "2.4.2"
shared_preferences_web:
dependency: transitive
description:
@@ -1635,54 +1619,6 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.10.2"
sprintf:
dependency: transitive
description:
name: sprintf
sha256: "1fc9ffe69d4df602376b52949af107d8f5703b77cda567c4d7d86a0693120f23"
url: "https://pub.dev"
source: hosted
version: "7.0.0"
sqflite:
dependency: transitive
description:
name: sqflite
sha256: e2297b1da52f127bc7a3da11439985d9b536f75070f3325e62ada69a5c585d03
url: "https://pub.dev"
source: hosted
version: "2.4.2"
sqflite_android:
dependency: transitive
description:
name: sqflite_android
sha256: "2b3070c5fa881839f8b402ee4a39c1b4d561704d4ebbbcfb808a119bc2a1701b"
url: "https://pub.dev"
source: hosted
version: "2.4.1"
sqflite_common:
dependency: transitive
description:
name: sqflite_common
sha256: "84731e8bfd8303a3389903e01fb2141b6e59b5973cacbb0929021df08dddbe8b"
url: "https://pub.dev"
source: hosted
version: "2.5.5"
sqflite_darwin:
dependency: transitive
description:
name: sqflite_darwin
sha256: "279832e5cde3fe99e8571879498c9211f3ca6391b0d818df4e17d9fff5c6ccb3"
url: "https://pub.dev"
source: hosted
version: "2.4.2"
sqflite_platform_interface:
dependency: transitive
description:
name: sqflite_platform_interface
sha256: "8dd4515c7bdcae0a785b0062859336de775e8c65db81ae33dd5445f35be61920"
url: "https://pub.dev"
source: hosted
version: "2.4.0"
sqlcipher_flutter_libs:
dependency: transitive
description:
@@ -1763,14 +1699,6 @@ packages:
url: "https://pub.dev"
source: hosted
version: "0.3.1"
synchronized:
dependency: transitive
description:
name: synchronized
sha256: "0669c70faae6270521ee4f05bffd2919892d42d1276e6c495be80174b6bc0ef6"
url: "https://pub.dev"
source: hosted
version: "3.3.1"
term_glyph:
dependency: transitive
description:
@@ -1815,10 +1743,10 @@ packages:
dependency: transitive
description:
name: universal_io
sha256: "1722b2dcc462b4b2f3ee7d188dad008b6eb4c40bbd03a3de451d82c78bba9aad"
sha256: f63cbc48103236abf48e345e07a03ce5757ea86285ed313a6a032596ed9301e2
url: "https://pub.dev"
source: hosted
version: "2.2.2"
version: "2.3.1"
universal_platform:
dependency: transitive
description:
@@ -1839,34 +1767,34 @@ packages:
dependency: transitive
description:
name: url_launcher_android
sha256: "1d0eae19bd7606ef60fe69ef3b312a437a16549476c42321d5dc1506c9ca3bf4"
sha256: "3bb000251e55d4a209aa0e2e563309dc9bb2befea2295fd0cec1f51760aac572"
url: "https://pub.dev"
source: hosted
version: "6.3.15"
version: "6.3.29"
url_launcher_ios:
dependency: transitive
description:
name: url_launcher_ios
sha256: "16a513b6c12bb419304e72ea0ae2ab4fed569920d1c7cb850263fe3acc824626"
sha256: "580fe5dfb51671ae38191d316e027f6b76272b026370708c2d898799750a02b0"
url: "https://pub.dev"
source: hosted
version: "6.3.2"
version: "6.4.1"
url_launcher_linux:
dependency: transitive
description:
name: url_launcher_linux
sha256: "4e9ba368772369e3e08f231d2301b4ef72b9ff87c31192ef471b380ef29a4935"
sha256: d5e14138b3bc193a0f63c10a53c94b91d399df0512b1f29b94a043db7482384a
url: "https://pub.dev"
source: hosted
version: "3.2.1"
version: "3.2.2"
url_launcher_macos:
dependency: transitive
description:
name: url_launcher_macos
sha256: "17ba2000b847f334f16626a574c702b196723af2a289e7a93ffcb79acff855c2"
sha256: "368adf46f71ad3c21b8f06614adb38346f193f3a59ba8fe9a2fd74133070ba18"
url: "https://pub.dev"
source: hosted
version: "3.2.2"
version: "3.2.5"
url_launcher_platform_interface:
dependency: transitive
description:
@@ -1879,34 +1807,34 @@ packages:
dependency: transitive
description:
name: url_launcher_web
sha256: "3ba963161bd0fe395917ba881d320b9c4f6dd3c4a233da62ab18a5025c85f1e9"
sha256: d0412fcf4c6b31ecfdb7762359b7206ffba3bbffd396c6d9f9c4616ece476c1f
url: "https://pub.dev"
source: hosted
version: "2.4.0"
version: "2.4.2"
url_launcher_windows:
dependency: transitive
description:
name: url_launcher_windows
sha256: "3284b6d2ac454cf34f114e1d3319866fdd1e19cdc329999057e44ffe936cfa77"
sha256: "712c70ab1b99744ff066053cbe3e80c73332b38d46e5e945c98689b2e66fc15f"
url: "https://pub.dev"
source: hosted
version: "3.1.4"
version: "3.1.5"
uuid:
dependency: "direct main"
description:
name: uuid
sha256: a5be9ef6618a7ac1e964353ef476418026db906c4facdedaa299b7a2e71690ff
sha256: "1fef9e8e11e2991bb773070d4656b7bd5d850967a2456cfc83cf47925ba79489"
url: "https://pub.dev"
source: hosted
version: "4.5.1"
version: "4.5.3"
vector_graphics:
dependency: transitive
description:
name: vector_graphics
sha256: "44cc7104ff32563122a929e4620cf3efd584194eec6d1d913eb5ba593dbcf6de"
sha256: "81da85e9ca8885ade47f9685b953cb098970d11be4821ac765580a6607ea4373"
url: "https://pub.dev"
source: hosted
version: "1.1.18"
version: "1.1.21"
vector_graphics_codec:
dependency: transitive
description:
@@ -1919,10 +1847,10 @@ packages:
dependency: transitive
description:
name: vector_graphics_compiler
sha256: d354a7ec6931e6047785f4db12a1f61ec3d43b207fc0790f863818543f8ff0dc
sha256: "5a88dd14c0954a5398af544651c7fb51b457a2a556949bfb25369b210ef73a74"
url: "https://pub.dev"
source: hosted
version: "1.1.19"
version: "1.2.0"
vector_math:
dependency: transitive
description:
@@ -1935,10 +1863,10 @@ packages:
dependency: transitive
description:
name: vm_service
sha256: ddfa8d30d89985b96407efce8acbdd124701f96741f2d981ca860662f1c0dc02
sha256: "046d3928e16fa4dc46e8350415661755ab759d9fc97fc21b5ab295f71e4f0499"
url: "https://pub.dev"
source: hosted
version: "15.0.0"
version: "15.1.0"
wakelock_plus:
dependency: "direct main"
description:
@@ -1951,10 +1879,10 @@ packages:
dependency: transitive
description:
name: wakelock_plus_platform_interface
sha256: "036deb14cd62f558ca3b73006d52ce049fabcdcb2eddfe0bf0fe4e8a943b5cf2"
sha256: "14b2e5b9e35c2631e656913c47adecdd71633ae92896a27a64c8f1fcfabc21cc"
url: "https://pub.dev"
source: hosted
version: "1.3.0"
version: "1.5.0"
watcher:
dependency: transitive
description:
@@ -1999,10 +1927,10 @@ packages:
dependency: transitive
description:
name: win32
sha256: b89e6e24d1454e149ab20fbb225af58660f0c0bf4475544650700d8e2da54aef
sha256: d7cb55e04cd34096cd3a79b3330245f54cb96a370a1c27adb3c84b917de8b08e
url: "https://pub.dev"
source: hosted
version: "5.11.0"
version: "5.15.0"
win32_registry:
dependency: transitive
description:
@@ -2023,10 +1951,10 @@ packages:
dependency: "direct main"
description:
name: worker_manager
sha256: "1bce9f894a0c187856f5fc0e150e7fe1facce326f048ca6172947754dac3d4f3"
sha256: "887587eb97e517bca88dea761bea96edc495513ec91e4c489dcf110967ba79ff"
url: "https://pub.dev"
source: hosted
version: "7.2.7"
version: "7.2.9"
xdg_directories:
dependency: transitive
description:
@@ -2061,4 +1989,4 @@ packages:
version: "3.1.3"
sdks:
dart: ">=3.11.0 <4.0.0"
flutter: "3.41.6"
flutter: "3.41.7"

View File

@@ -6,40 +6,38 @@ version: 2.7.5+3046
environment:
sdk: '>=3.11.0 <4.0.0'
flutter: 3.41.6
flutter: 3.41.7
dependencies:
async: ^2.13.0
async: ^2.13.1
auto_route: ^11.1.0
background_downloader: ^9.3.0
background_downloader: ^9.5.4
cast: ^2.1.0
collection: ^1.19.1
connectivity_plus: ^6.1.3
crop_image: ^1.0.16
crypto: ^3.0.6
device_info_plus: ^12.2.0
# DB
connectivity_plus: ^6.1.5
crop_image: ^1.0.17
crypto: ^3.0.7
device_info_plus: ^12.4.0
drift: ^2.32.1
drift_flutter: ^0.3.0
dynamic_color: ^1.8.1
easy_localization: ^3.0.8
ffi: ^2.1.4
ffi: ^2.2.0
flutter:
sdk: flutter
flutter_cache_manager: ^3.4.1
flutter_displaymode: ^0.7.0
flutter_hooks: ^0.21.3+1
flutter_local_notifications: ^17.2.1+2
flutter_local_notifications: ^17.2.4
flutter_secure_storage: ^9.2.4
flutter_svg: ^2.2.1
flutter_udid: ^4.0.0
flutter_web_auth_2: ^5.0.0-alpha.0
fluttertoast: ^8.2.12
flutter_svg: ^2.2.4
flutter_udid: ^4.1.2
flutter_web_auth_2: ^5.0.2
fluttertoast: ^8.2.14
geolocator: ^14.0.2
home_widget: ^0.8.1
hooks_riverpod: ^2.6.1
http: ^1.5.0
image_picker: ^1.2.0
http: ^1.6.0
image_picker: ^1.2.1
immich_ui:
path: './packages/ui'
intl: ^0.20.2
@@ -50,16 +48,16 @@ dependencies:
git:
url: https://github.com/immich-app/native_video_player
ref: 'cdf621bdb7edaf996e118a58a48f6441187d79c6'
network_info_plus: ^6.1.3
network_info_plus: ^6.1.4
octo_image: ^2.1.0
openapi:
path: openapi
package_info_plus: ^8.3.0
package_info_plus: ^8.3.1
path: ^1.9.1
path_provider: ^2.1.5
path_provider_foundation: ^2.4.3
path_provider_foundation: ^2.6.0
permission_handler: ^11.4.0
photo_manager: ^3.7.1
photo_manager: ^3.9.0
pinput: ^5.0.2
punycode: ^1.0.0
scroll_date_picker: ^3.8.0
@@ -71,9 +69,9 @@ dependencies:
thumbhash: 0.1.0+1
timezone: ^0.9.4
url_launcher: ^6.3.2
uuid: ^4.5.1
wakelock_plus: ^1.3.0
worker_manager: ^7.2.7
uuid: ^4.5.3
wakelock_plus: ^1.3.3
worker_manager: ^7.2.9
web_socket: ^1.0.1
socket_io_client:
git:
@@ -92,7 +90,7 @@ dependencies:
dev_dependencies:
auto_route_generator: ^10.5.0
build_runner: ^2.4.8
build_runner: ^2.13.1
# Drift generator
drift_dev: ^2.32.1
fake_async: ^1.3.3
@@ -104,9 +102,14 @@ dev_dependencies:
sdk: flutter
integration_test:
sdk: flutter
mocktail: ^1.0.4
mocktail: ^1.0.5
# Type safe platform code
pigeon: ^26.0.2
pigeon: ^26.3.4
# cast 2.1.0 declares a loose bonsoir range but its code targets the 5.x API.
# Pin bonsoir to 5.x until cast releases a version compatible with bonsoir 6.x.
dependency_overrides:
bonsoir: ^5.1.11
flutter:
uses-material-design: true

View File

@@ -1,194 +0,0 @@
import 'package:flutter_test/flutter_test.dart';
import 'package:immich_mobile/domain/models/album/local_album.model.dart';
import 'package:immich_mobile/domain/services/hash.service.dart';
import 'package:immich_mobile/platform/native_sync_api.g.dart';
import 'package:mocktail/mocktail.dart';
import '../../fixtures/album.stub.dart';
import '../../fixtures/asset.stub.dart';
import '../../infrastructure/repository.mock.dart';
import '../service.mock.dart';
void main() {
late HashService sut;
late MockLocalAlbumRepository mockAlbumRepo;
late MockLocalAssetRepository mockAssetRepo;
late MockNativeSyncApi mockNativeApi;
late MockTrashedLocalAssetRepository mockTrashedAssetRepo;
setUp(() {
mockAlbumRepo = MockLocalAlbumRepository();
mockAssetRepo = MockLocalAssetRepository();
mockNativeApi = MockNativeSyncApi();
mockTrashedAssetRepo = MockTrashedLocalAssetRepository();
sut = HashService(
localAlbumRepository: mockAlbumRepo,
localAssetRepository: mockAssetRepo,
nativeSyncApi: mockNativeApi,
trashedLocalAssetRepository: mockTrashedAssetRepo,
);
registerFallbackValue(LocalAlbumStub.recent);
registerFallbackValue(LocalAssetStub.image1);
registerFallbackValue(<String, String>{});
when(() => mockAssetRepo.reconcileHashesFromCloudId()).thenAnswer((_) async => {});
when(() => mockAssetRepo.updateHashes(any())).thenAnswer((_) async => {});
});
group('HashService hashAssets', () {
test('skips albums with no assets to hash', () async {
when(
() => mockAlbumRepo.getBackupAlbums(),
).thenAnswer((_) async => [LocalAlbumStub.recent.copyWith(assetCount: 0)]);
when(() => mockAlbumRepo.getAssetsToHash(LocalAlbumStub.recent.id)).thenAnswer((_) async => []);
await sut.hashAssets();
verifyNever(() => mockNativeApi.hashAssets(any(), allowNetworkAccess: any(named: 'allowNetworkAccess')));
});
});
group('HashService _hashAssets', () {
test('skips empty batches', () async {
final album = LocalAlbumStub.recent;
when(() => mockAlbumRepo.getBackupAlbums()).thenAnswer((_) async => [album]);
when(() => mockAlbumRepo.getAssetsToHash(album.id)).thenAnswer((_) async => []);
await sut.hashAssets();
verifyNever(() => mockNativeApi.hashAssets(any(), allowNetworkAccess: any(named: 'allowNetworkAccess')));
});
test('processes assets when available', () async {
final album = LocalAlbumStub.recent;
final asset = LocalAssetStub.image1;
when(() => mockAlbumRepo.getBackupAlbums()).thenAnswer((_) async => [album]);
when(() => mockAlbumRepo.getAssetsToHash(album.id)).thenAnswer((_) async => [asset]);
when(
() => mockNativeApi.hashAssets([asset.id], allowNetworkAccess: false),
).thenAnswer((_) async => [HashResult(assetId: asset.id, hash: 'test-hash')]);
await sut.hashAssets();
verify(() => mockNativeApi.hashAssets([asset.id], allowNetworkAccess: false)).called(1);
final captured = verify(() => mockAssetRepo.updateHashes(captureAny())).captured.first as Map<String, String>;
expect(captured.length, 1);
expect(captured[asset.id], 'test-hash');
});
test('handles failed hashes', () async {
final album = LocalAlbumStub.recent;
final asset = LocalAssetStub.image1;
when(() => mockAlbumRepo.getBackupAlbums()).thenAnswer((_) async => [album]);
when(() => mockAlbumRepo.getAssetsToHash(album.id)).thenAnswer((_) async => [asset]);
when(
() => mockNativeApi.hashAssets([asset.id], allowNetworkAccess: false),
).thenAnswer((_) async => [HashResult(assetId: asset.id, error: 'Failed to hash')]);
await sut.hashAssets();
final captured = verify(() => mockAssetRepo.updateHashes(captureAny())).captured.first as Map<String, String>;
expect(captured.length, 0);
});
test('handles null hash results', () async {
final album = LocalAlbumStub.recent;
final asset = LocalAssetStub.image1;
when(() => mockAlbumRepo.getBackupAlbums()).thenAnswer((_) async => [album]);
when(() => mockAlbumRepo.getAssetsToHash(album.id)).thenAnswer((_) async => [asset]);
when(
() => mockNativeApi.hashAssets([asset.id], allowNetworkAccess: false),
).thenAnswer((_) async => [HashResult(assetId: asset.id, hash: null)]);
await sut.hashAssets();
final captured = verify(() => mockAssetRepo.updateHashes(captureAny())).captured.first as Map<String, String>;
expect(captured.length, 0);
});
test('batches by size limit', () async {
const batchSize = 2;
final sut = HashService(
localAlbumRepository: mockAlbumRepo,
localAssetRepository: mockAssetRepo,
nativeSyncApi: mockNativeApi,
batchSize: batchSize,
trashedLocalAssetRepository: mockTrashedAssetRepo,
);
final album = LocalAlbumStub.recent;
final asset1 = LocalAssetStub.image1;
final asset2 = LocalAssetStub.image2;
final asset3 = LocalAssetStub.image1.copyWith(id: 'image3', name: 'image3.jpg');
final capturedCalls = <List<String>>[];
when(() => mockAssetRepo.updateHashes(any())).thenAnswer((_) async => {});
when(() => mockAlbumRepo.getBackupAlbums()).thenAnswer((_) async => [album]);
when(() => mockAlbumRepo.getAssetsToHash(album.id)).thenAnswer((_) async => [asset1, asset2, asset3]);
when(() => mockNativeApi.hashAssets(any(), allowNetworkAccess: any(named: 'allowNetworkAccess'))).thenAnswer((
invocation,
) async {
final assetIds = invocation.positionalArguments[0] as List<String>;
capturedCalls.add(List<String>.from(assetIds));
return assetIds.map((id) => HashResult(assetId: id, hash: '$id-hash')).toList();
});
await sut.hashAssets();
expect(capturedCalls.length, 2, reason: 'Should make exactly 2 calls to hashAssets');
expect(capturedCalls[0], [asset1.id, asset2.id], reason: 'First call should batch the first two assets');
expect(capturedCalls[1], [asset3.id], reason: 'Second call should have the remaining asset');
verify(() => mockAssetRepo.updateHashes(any())).called(2);
});
test('handles mixed success and failure in batch', () async {
final album = LocalAlbumStub.recent;
final asset1 = LocalAssetStub.image1;
final asset2 = LocalAssetStub.image2;
when(() => mockAlbumRepo.getBackupAlbums()).thenAnswer((_) async => [album]);
when(() => mockAlbumRepo.getAssetsToHash(album.id)).thenAnswer((_) async => [asset1, asset2]);
when(() => mockNativeApi.hashAssets([asset1.id, asset2.id], allowNetworkAccess: false)).thenAnswer(
(_) async => [
HashResult(assetId: asset1.id, hash: 'asset1-hash'),
HashResult(assetId: asset2.id, error: 'Failed to hash asset2'),
],
);
await sut.hashAssets();
final captured = verify(() => mockAssetRepo.updateHashes(captureAny())).captured.first as Map<String, String>;
expect(captured.length, 1);
expect(captured[asset1.id], 'asset1-hash');
});
test('uses allowNetworkAccess based on album backup selection', () async {
final selectedAlbum = LocalAlbumStub.recent.copyWith(backupSelection: BackupSelection.selected);
final nonSelectedAlbum = LocalAlbumStub.recent.copyWith(id: 'album2', backupSelection: BackupSelection.excluded);
final asset1 = LocalAssetStub.image1;
final asset2 = LocalAssetStub.image2;
when(() => mockAlbumRepo.getBackupAlbums()).thenAnswer((_) async => [selectedAlbum, nonSelectedAlbum]);
when(() => mockAlbumRepo.getAssetsToHash(selectedAlbum.id)).thenAnswer((_) async => [asset1]);
when(() => mockAlbumRepo.getAssetsToHash(nonSelectedAlbum.id)).thenAnswer((_) async => [asset2]);
when(() => mockNativeApi.hashAssets(any(), allowNetworkAccess: any(named: 'allowNetworkAccess'))).thenAnswer((
invocation,
) async {
final assetIds = invocation.positionalArguments[0] as List<String>;
return assetIds.map((id) => HashResult(assetId: id, hash: '$id-hash')).toList();
});
await sut.hashAssets();
verify(() => mockNativeApi.hashAssets([asset1.id], allowNetworkAccess: true)).called(1);
verify(() => mockNativeApi.hashAssets([asset2.id], allowNetworkAccess: false)).called(1);
});
});
}

View File

@@ -128,7 +128,7 @@ void main() {
id: 'remote-id',
name: 'remote.jpg',
type: AssetType.image.index,
durationInSeconds: 0,
durationMs: 0,
orientation: 0,
isFavorite: false,
playbackStyle: PlatformAssetPlaybackStyle.image
@@ -210,7 +210,7 @@ void main() {
id: 'test-id',
name: 'test.jpg',
type: AssetType.image.index,
durationInSeconds: 0,
durationMs: 0,
orientation: 0,
isFavorite: false,
createdAt: 1700000000,

View File

@@ -1,6 +1,7 @@
// dart format width=80
// GENERATED CODE, DO NOT EDIT BY HAND.
// ignore_for_file: type=lint
// GENERATED BY drift_dev, DO NOT MODIFY.
// ignore_for_file: type=lint,unused_import
//
import 'package:drift/drift.dart';
import 'package:drift/internal/migrations.dart';
import 'schema_v1.dart' as v1;
@@ -25,6 +26,7 @@ import 'schema_v19.dart' as v19;
import 'schema_v20.dart' as v20;
import 'schema_v21.dart' as v21;
import 'schema_v22.dart' as v22;
import 'schema_v23.dart' as v23;
class GeneratedHelper implements SchemaInstantiationHelper {
@override
@@ -74,6 +76,8 @@ class GeneratedHelper implements SchemaInstantiationHelper {
return v21.DatabaseAtV21(db);
case 22:
return v22.DatabaseAtV22(db);
case 23:
return v23.DatabaseAtV23(db);
default:
throw MissingSchemaException(version, versions);
}
@@ -102,5 +106,6 @@ class GeneratedHelper implements SchemaInstantiationHelper {
20,
21,
22,
23,
];
}

View File

@@ -1,6 +1,8 @@
// dart format width=80
// GENERATED CODE, DO NOT EDIT BY HAND.
// ignore_for_file: type=lint
import 'dart:typed_data' as i2;
// GENERATED BY drift_dev, DO NOT MODIFY.
// ignore_for_file: type=lint,unused_import
//
import 'package:drift/drift.dart';
class UserEntity extends Table with TableInfo<UserEntity, UserEntityData> {
@@ -1974,13 +1976,14 @@ class UserMetadataEntity extends Table
type: DriftSqlType.int,
requiredDuringInsert: true,
);
late final GeneratedColumn<Uint8List> value = GeneratedColumn<Uint8List>(
'value',
aliasedName,
false,
type: DriftSqlType.blob,
requiredDuringInsert: true,
);
late final GeneratedColumn<i2.Uint8List> value =
GeneratedColumn<i2.Uint8List>(
'value',
aliasedName,
false,
type: DriftSqlType.blob,
requiredDuringInsert: true,
);
@override
List<GeneratedColumn> get $columns => [userId, key, value];
@override
@@ -2024,7 +2027,7 @@ class UserMetadataEntityData extends DataClass
implements Insertable<UserMetadataEntityData> {
final String userId;
final int key;
final Uint8List value;
final i2.Uint8List value;
const UserMetadataEntityData({
required this.userId,
required this.key,
@@ -2035,7 +2038,7 @@ class UserMetadataEntityData extends DataClass
final map = <String, Expression>{};
map['user_id'] = Variable<String>(userId);
map['key'] = Variable<int>(key);
map['value'] = Variable<Uint8List>(value);
map['value'] = Variable<i2.Uint8List>(value);
return map;
}
@@ -2047,7 +2050,7 @@ class UserMetadataEntityData extends DataClass
return UserMetadataEntityData(
userId: serializer.fromJson<String>(json['userId']),
key: serializer.fromJson<int>(json['key']),
value: serializer.fromJson<Uint8List>(json['value']),
value: serializer.fromJson<i2.Uint8List>(json['value']),
);
}
@override
@@ -2056,14 +2059,14 @@ class UserMetadataEntityData extends DataClass
return <String, dynamic>{
'userId': serializer.toJson<String>(userId),
'key': serializer.toJson<int>(key),
'value': serializer.toJson<Uint8List>(value),
'value': serializer.toJson<i2.Uint8List>(value),
};
}
UserMetadataEntityData copyWith({
String? userId,
int? key,
Uint8List? value,
i2.Uint8List? value,
}) => UserMetadataEntityData(
userId: userId ?? this.userId,
key: key ?? this.key,
@@ -2102,7 +2105,7 @@ class UserMetadataEntityCompanion
extends UpdateCompanion<UserMetadataEntityData> {
final Value<String> userId;
final Value<int> key;
final Value<Uint8List> value;
final Value<i2.Uint8List> value;
const UserMetadataEntityCompanion({
this.userId = const Value.absent(),
this.key = const Value.absent(),
@@ -2111,14 +2114,14 @@ class UserMetadataEntityCompanion
UserMetadataEntityCompanion.insert({
required String userId,
required int key,
required Uint8List value,
required i2.Uint8List value,
}) : userId = Value(userId),
key = Value(key),
value = Value(value);
static Insertable<UserMetadataEntityData> custom({
Expression<String>? userId,
Expression<int>? key,
Expression<Uint8List>? value,
Expression<i2.Uint8List>? value,
}) {
return RawValuesInsertable({
if (userId != null) 'user_id': userId,
@@ -2130,7 +2133,7 @@ class UserMetadataEntityCompanion
UserMetadataEntityCompanion copyWith({
Value<String>? userId,
Value<int>? key,
Value<Uint8List>? value,
Value<i2.Uint8List>? value,
}) {
return UserMetadataEntityCompanion(
userId: userId ?? this.userId,
@@ -2149,7 +2152,7 @@ class UserMetadataEntityCompanion
map['key'] = Variable<int>(key.value);
}
if (value.present) {
map['value'] = Variable<Uint8List>(value.value);
map['value'] = Variable<i2.Uint8List>(value.value);
}
return map;
}

View File

@@ -1,6 +1,8 @@
// dart format width=80
// GENERATED CODE, DO NOT EDIT BY HAND.
// ignore_for_file: type=lint
import 'dart:typed_data' as i2;
// GENERATED BY drift_dev, DO NOT MODIFY.
// ignore_for_file: type=lint,unused_import
//
import 'package:drift/drift.dart';
class UserEntity extends Table with TableInfo<UserEntity, UserEntityData> {
@@ -3430,13 +3432,14 @@ class UserMetadataEntity extends Table
type: DriftSqlType.int,
requiredDuringInsert: true,
);
late final GeneratedColumn<Uint8List> value = GeneratedColumn<Uint8List>(
'value',
aliasedName,
false,
type: DriftSqlType.blob,
requiredDuringInsert: true,
);
late final GeneratedColumn<i2.Uint8List> value =
GeneratedColumn<i2.Uint8List>(
'value',
aliasedName,
false,
type: DriftSqlType.blob,
requiredDuringInsert: true,
);
@override
List<GeneratedColumn> get $columns => [userId, key, value];
@override
@@ -3480,7 +3483,7 @@ class UserMetadataEntityData extends DataClass
implements Insertable<UserMetadataEntityData> {
final String userId;
final int key;
final Uint8List value;
final i2.Uint8List value;
const UserMetadataEntityData({
required this.userId,
required this.key,
@@ -3491,7 +3494,7 @@ class UserMetadataEntityData extends DataClass
final map = <String, Expression>{};
map['user_id'] = Variable<String>(userId);
map['key'] = Variable<int>(key);
map['value'] = Variable<Uint8List>(value);
map['value'] = Variable<i2.Uint8List>(value);
return map;
}
@@ -3503,7 +3506,7 @@ class UserMetadataEntityData extends DataClass
return UserMetadataEntityData(
userId: serializer.fromJson<String>(json['userId']),
key: serializer.fromJson<int>(json['key']),
value: serializer.fromJson<Uint8List>(json['value']),
value: serializer.fromJson<i2.Uint8List>(json['value']),
);
}
@override
@@ -3512,14 +3515,14 @@ class UserMetadataEntityData extends DataClass
return <String, dynamic>{
'userId': serializer.toJson<String>(userId),
'key': serializer.toJson<int>(key),
'value': serializer.toJson<Uint8List>(value),
'value': serializer.toJson<i2.Uint8List>(value),
};
}
UserMetadataEntityData copyWith({
String? userId,
int? key,
Uint8List? value,
i2.Uint8List? value,
}) => UserMetadataEntityData(
userId: userId ?? this.userId,
key: key ?? this.key,
@@ -3558,7 +3561,7 @@ class UserMetadataEntityCompanion
extends UpdateCompanion<UserMetadataEntityData> {
final Value<String> userId;
final Value<int> key;
final Value<Uint8List> value;
final Value<i2.Uint8List> value;
const UserMetadataEntityCompanion({
this.userId = const Value.absent(),
this.key = const Value.absent(),
@@ -3567,14 +3570,14 @@ class UserMetadataEntityCompanion
UserMetadataEntityCompanion.insert({
required String userId,
required int key,
required Uint8List value,
required i2.Uint8List value,
}) : userId = Value(userId),
key = Value(key),
value = Value(value);
static Insertable<UserMetadataEntityData> custom({
Expression<String>? userId,
Expression<int>? key,
Expression<Uint8List>? value,
Expression<i2.Uint8List>? value,
}) {
return RawValuesInsertable({
if (userId != null) 'user_id': userId,
@@ -3586,7 +3589,7 @@ class UserMetadataEntityCompanion
UserMetadataEntityCompanion copyWith({
Value<String>? userId,
Value<int>? key,
Value<Uint8List>? value,
Value<i2.Uint8List>? value,
}) {
return UserMetadataEntityCompanion(
userId: userId ?? this.userId,
@@ -3605,7 +3608,7 @@ class UserMetadataEntityCompanion
map['key'] = Variable<int>(key.value);
}
if (value.present) {
map['value'] = Variable<Uint8List>(value.value);
map['value'] = Variable<i2.Uint8List>(value.value);
}
return map;
}

View File

@@ -1,6 +1,8 @@
// dart format width=80
// GENERATED CODE, DO NOT EDIT BY HAND.
// ignore_for_file: type=lint
import 'dart:typed_data' as i2;
// GENERATED BY drift_dev, DO NOT MODIFY.
// ignore_for_file: type=lint,unused_import
//
import 'package:drift/drift.dart';
class UserEntity extends Table with TableInfo<UserEntity, UserEntityData> {
@@ -3469,13 +3471,14 @@ class UserMetadataEntity extends Table
type: DriftSqlType.int,
requiredDuringInsert: true,
);
late final GeneratedColumn<Uint8List> value = GeneratedColumn<Uint8List>(
'value',
aliasedName,
false,
type: DriftSqlType.blob,
requiredDuringInsert: true,
);
late final GeneratedColumn<i2.Uint8List> value =
GeneratedColumn<i2.Uint8List>(
'value',
aliasedName,
false,
type: DriftSqlType.blob,
requiredDuringInsert: true,
);
@override
List<GeneratedColumn> get $columns => [userId, key, value];
@override
@@ -3519,7 +3522,7 @@ class UserMetadataEntityData extends DataClass
implements Insertable<UserMetadataEntityData> {
final String userId;
final int key;
final Uint8List value;
final i2.Uint8List value;
const UserMetadataEntityData({
required this.userId,
required this.key,
@@ -3530,7 +3533,7 @@ class UserMetadataEntityData extends DataClass
final map = <String, Expression>{};
map['user_id'] = Variable<String>(userId);
map['key'] = Variable<int>(key);
map['value'] = Variable<Uint8List>(value);
map['value'] = Variable<i2.Uint8List>(value);
return map;
}
@@ -3542,7 +3545,7 @@ class UserMetadataEntityData extends DataClass
return UserMetadataEntityData(
userId: serializer.fromJson<String>(json['userId']),
key: serializer.fromJson<int>(json['key']),
value: serializer.fromJson<Uint8List>(json['value']),
value: serializer.fromJson<i2.Uint8List>(json['value']),
);
}
@override
@@ -3551,14 +3554,14 @@ class UserMetadataEntityData extends DataClass
return <String, dynamic>{
'userId': serializer.toJson<String>(userId),
'key': serializer.toJson<int>(key),
'value': serializer.toJson<Uint8List>(value),
'value': serializer.toJson<i2.Uint8List>(value),
};
}
UserMetadataEntityData copyWith({
String? userId,
int? key,
Uint8List? value,
i2.Uint8List? value,
}) => UserMetadataEntityData(
userId: userId ?? this.userId,
key: key ?? this.key,
@@ -3597,7 +3600,7 @@ class UserMetadataEntityCompanion
extends UpdateCompanion<UserMetadataEntityData> {
final Value<String> userId;
final Value<int> key;
final Value<Uint8List> value;
final Value<i2.Uint8List> value;
const UserMetadataEntityCompanion({
this.userId = const Value.absent(),
this.key = const Value.absent(),
@@ -3606,14 +3609,14 @@ class UserMetadataEntityCompanion
UserMetadataEntityCompanion.insert({
required String userId,
required int key,
required Uint8List value,
required i2.Uint8List value,
}) : userId = Value(userId),
key = Value(key),
value = Value(value);
static Insertable<UserMetadataEntityData> custom({
Expression<String>? userId,
Expression<int>? key,
Expression<Uint8List>? value,
Expression<i2.Uint8List>? value,
}) {
return RawValuesInsertable({
if (userId != null) 'user_id': userId,
@@ -3625,7 +3628,7 @@ class UserMetadataEntityCompanion
UserMetadataEntityCompanion copyWith({
Value<String>? userId,
Value<int>? key,
Value<Uint8List>? value,
Value<i2.Uint8List>? value,
}) {
return UserMetadataEntityCompanion(
userId: userId ?? this.userId,
@@ -3644,7 +3647,7 @@ class UserMetadataEntityCompanion
map['key'] = Variable<int>(key.value);
}
if (value.present) {
map['value'] = Variable<Uint8List>(value.value);
map['value'] = Variable<i2.Uint8List>(value.value);
}
return map;
}

View File

@@ -1,6 +1,8 @@
// dart format width=80
// GENERATED CODE, DO NOT EDIT BY HAND.
// ignore_for_file: type=lint
import 'dart:typed_data' as i2;
// GENERATED BY drift_dev, DO NOT MODIFY.
// ignore_for_file: type=lint,unused_import
//
import 'package:drift/drift.dart';
class UserEntity extends Table with TableInfo<UserEntity, UserEntityData> {
@@ -3469,13 +3471,14 @@ class UserMetadataEntity extends Table
type: DriftSqlType.int,
requiredDuringInsert: true,
);
late final GeneratedColumn<Uint8List> value = GeneratedColumn<Uint8List>(
'value',
aliasedName,
false,
type: DriftSqlType.blob,
requiredDuringInsert: true,
);
late final GeneratedColumn<i2.Uint8List> value =
GeneratedColumn<i2.Uint8List>(
'value',
aliasedName,
false,
type: DriftSqlType.blob,
requiredDuringInsert: true,
);
@override
List<GeneratedColumn> get $columns => [userId, key, value];
@override
@@ -3519,7 +3522,7 @@ class UserMetadataEntityData extends DataClass
implements Insertable<UserMetadataEntityData> {
final String userId;
final int key;
final Uint8List value;
final i2.Uint8List value;
const UserMetadataEntityData({
required this.userId,
required this.key,
@@ -3530,7 +3533,7 @@ class UserMetadataEntityData extends DataClass
final map = <String, Expression>{};
map['user_id'] = Variable<String>(userId);
map['key'] = Variable<int>(key);
map['value'] = Variable<Uint8List>(value);
map['value'] = Variable<i2.Uint8List>(value);
return map;
}
@@ -3542,7 +3545,7 @@ class UserMetadataEntityData extends DataClass
return UserMetadataEntityData(
userId: serializer.fromJson<String>(json['userId']),
key: serializer.fromJson<int>(json['key']),
value: serializer.fromJson<Uint8List>(json['value']),
value: serializer.fromJson<i2.Uint8List>(json['value']),
);
}
@override
@@ -3551,14 +3554,14 @@ class UserMetadataEntityData extends DataClass
return <String, dynamic>{
'userId': serializer.toJson<String>(userId),
'key': serializer.toJson<int>(key),
'value': serializer.toJson<Uint8List>(value),
'value': serializer.toJson<i2.Uint8List>(value),
};
}
UserMetadataEntityData copyWith({
String? userId,
int? key,
Uint8List? value,
i2.Uint8List? value,
}) => UserMetadataEntityData(
userId: userId ?? this.userId,
key: key ?? this.key,
@@ -3597,7 +3600,7 @@ class UserMetadataEntityCompanion
extends UpdateCompanion<UserMetadataEntityData> {
final Value<String> userId;
final Value<int> key;
final Value<Uint8List> value;
final Value<i2.Uint8List> value;
const UserMetadataEntityCompanion({
this.userId = const Value.absent(),
this.key = const Value.absent(),
@@ -3606,14 +3609,14 @@ class UserMetadataEntityCompanion
UserMetadataEntityCompanion.insert({
required String userId,
required int key,
required Uint8List value,
required i2.Uint8List value,
}) : userId = Value(userId),
key = Value(key),
value = Value(value);
static Insertable<UserMetadataEntityData> custom({
Expression<String>? userId,
Expression<int>? key,
Expression<Uint8List>? value,
Expression<i2.Uint8List>? value,
}) {
return RawValuesInsertable({
if (userId != null) 'user_id': userId,
@@ -3625,7 +3628,7 @@ class UserMetadataEntityCompanion
UserMetadataEntityCompanion copyWith({
Value<String>? userId,
Value<int>? key,
Value<Uint8List>? value,
Value<i2.Uint8List>? value,
}) {
return UserMetadataEntityCompanion(
userId: userId ?? this.userId,
@@ -3644,7 +3647,7 @@ class UserMetadataEntityCompanion
map['key'] = Variable<int>(key.value);
}
if (value.present) {
map['value'] = Variable<Uint8List>(value.value);
map['value'] = Variable<i2.Uint8List>(value.value);
}
return map;
}

View File

@@ -1,6 +1,8 @@
// dart format width=80
// GENERATED CODE, DO NOT EDIT BY HAND.
// ignore_for_file: type=lint
import 'dart:typed_data' as i2;
// GENERATED BY drift_dev, DO NOT MODIFY.
// ignore_for_file: type=lint,unused_import
//
import 'package:drift/drift.dart';
class UserEntity extends Table with TableInfo<UserEntity, UserEntityData> {
@@ -3469,13 +3471,14 @@ class UserMetadataEntity extends Table
type: DriftSqlType.int,
requiredDuringInsert: true,
);
late final GeneratedColumn<Uint8List> value = GeneratedColumn<Uint8List>(
'value',
aliasedName,
false,
type: DriftSqlType.blob,
requiredDuringInsert: true,
);
late final GeneratedColumn<i2.Uint8List> value =
GeneratedColumn<i2.Uint8List>(
'value',
aliasedName,
false,
type: DriftSqlType.blob,
requiredDuringInsert: true,
);
@override
List<GeneratedColumn> get $columns => [userId, key, value];
@override
@@ -3519,7 +3522,7 @@ class UserMetadataEntityData extends DataClass
implements Insertable<UserMetadataEntityData> {
final String userId;
final int key;
final Uint8List value;
final i2.Uint8List value;
const UserMetadataEntityData({
required this.userId,
required this.key,
@@ -3530,7 +3533,7 @@ class UserMetadataEntityData extends DataClass
final map = <String, Expression>{};
map['user_id'] = Variable<String>(userId);
map['key'] = Variable<int>(key);
map['value'] = Variable<Uint8List>(value);
map['value'] = Variable<i2.Uint8List>(value);
return map;
}
@@ -3542,7 +3545,7 @@ class UserMetadataEntityData extends DataClass
return UserMetadataEntityData(
userId: serializer.fromJson<String>(json['userId']),
key: serializer.fromJson<int>(json['key']),
value: serializer.fromJson<Uint8List>(json['value']),
value: serializer.fromJson<i2.Uint8List>(json['value']),
);
}
@override
@@ -3551,14 +3554,14 @@ class UserMetadataEntityData extends DataClass
return <String, dynamic>{
'userId': serializer.toJson<String>(userId),
'key': serializer.toJson<int>(key),
'value': serializer.toJson<Uint8List>(value),
'value': serializer.toJson<i2.Uint8List>(value),
};
}
UserMetadataEntityData copyWith({
String? userId,
int? key,
Uint8List? value,
i2.Uint8List? value,
}) => UserMetadataEntityData(
userId: userId ?? this.userId,
key: key ?? this.key,
@@ -3597,7 +3600,7 @@ class UserMetadataEntityCompanion
extends UpdateCompanion<UserMetadataEntityData> {
final Value<String> userId;
final Value<int> key;
final Value<Uint8List> value;
final Value<i2.Uint8List> value;
const UserMetadataEntityCompanion({
this.userId = const Value.absent(),
this.key = const Value.absent(),
@@ -3606,14 +3609,14 @@ class UserMetadataEntityCompanion
UserMetadataEntityCompanion.insert({
required String userId,
required int key,
required Uint8List value,
required i2.Uint8List value,
}) : userId = Value(userId),
key = Value(key),
value = Value(value);
static Insertable<UserMetadataEntityData> custom({
Expression<String>? userId,
Expression<int>? key,
Expression<Uint8List>? value,
Expression<i2.Uint8List>? value,
}) {
return RawValuesInsertable({
if (userId != null) 'user_id': userId,
@@ -3625,7 +3628,7 @@ class UserMetadataEntityCompanion
UserMetadataEntityCompanion copyWith({
Value<String>? userId,
Value<int>? key,
Value<Uint8List>? value,
Value<i2.Uint8List>? value,
}) {
return UserMetadataEntityCompanion(
userId: userId ?? this.userId,
@@ -3644,7 +3647,7 @@ class UserMetadataEntityCompanion
map['key'] = Variable<int>(key.value);
}
if (value.present) {
map['value'] = Variable<Uint8List>(value.value);
map['value'] = Variable<i2.Uint8List>(value.value);
}
return map;
}

View File

@@ -1,6 +1,8 @@
// dart format width=80
// GENERATED CODE, DO NOT EDIT BY HAND.
// ignore_for_file: type=lint
import 'dart:typed_data' as i2;
// GENERATED BY drift_dev, DO NOT MODIFY.
// ignore_for_file: type=lint,unused_import
//
import 'package:drift/drift.dart';
class UserEntity extends Table with TableInfo<UserEntity, UserEntityData> {
@@ -3582,13 +3584,14 @@ class UserMetadataEntity extends Table
type: DriftSqlType.int,
requiredDuringInsert: true,
);
late final GeneratedColumn<Uint8List> value = GeneratedColumn<Uint8List>(
'value',
aliasedName,
false,
type: DriftSqlType.blob,
requiredDuringInsert: true,
);
late final GeneratedColumn<i2.Uint8List> value =
GeneratedColumn<i2.Uint8List>(
'value',
aliasedName,
false,
type: DriftSqlType.blob,
requiredDuringInsert: true,
);
@override
List<GeneratedColumn> get $columns => [userId, key, value];
@override
@@ -3632,7 +3635,7 @@ class UserMetadataEntityData extends DataClass
implements Insertable<UserMetadataEntityData> {
final String userId;
final int key;
final Uint8List value;
final i2.Uint8List value;
const UserMetadataEntityData({
required this.userId,
required this.key,
@@ -3643,7 +3646,7 @@ class UserMetadataEntityData extends DataClass
final map = <String, Expression>{};
map['user_id'] = Variable<String>(userId);
map['key'] = Variable<int>(key);
map['value'] = Variable<Uint8List>(value);
map['value'] = Variable<i2.Uint8List>(value);
return map;
}
@@ -3655,7 +3658,7 @@ class UserMetadataEntityData extends DataClass
return UserMetadataEntityData(
userId: serializer.fromJson<String>(json['userId']),
key: serializer.fromJson<int>(json['key']),
value: serializer.fromJson<Uint8List>(json['value']),
value: serializer.fromJson<i2.Uint8List>(json['value']),
);
}
@override
@@ -3664,14 +3667,14 @@ class UserMetadataEntityData extends DataClass
return <String, dynamic>{
'userId': serializer.toJson<String>(userId),
'key': serializer.toJson<int>(key),
'value': serializer.toJson<Uint8List>(value),
'value': serializer.toJson<i2.Uint8List>(value),
};
}
UserMetadataEntityData copyWith({
String? userId,
int? key,
Uint8List? value,
i2.Uint8List? value,
}) => UserMetadataEntityData(
userId: userId ?? this.userId,
key: key ?? this.key,
@@ -3710,7 +3713,7 @@ class UserMetadataEntityCompanion
extends UpdateCompanion<UserMetadataEntityData> {
final Value<String> userId;
final Value<int> key;
final Value<Uint8List> value;
final Value<i2.Uint8List> value;
const UserMetadataEntityCompanion({
this.userId = const Value.absent(),
this.key = const Value.absent(),
@@ -3719,14 +3722,14 @@ class UserMetadataEntityCompanion
UserMetadataEntityCompanion.insert({
required String userId,
required int key,
required Uint8List value,
required i2.Uint8List value,
}) : userId = Value(userId),
key = Value(key),
value = Value(value);
static Insertable<UserMetadataEntityData> custom({
Expression<String>? userId,
Expression<int>? key,
Expression<Uint8List>? value,
Expression<i2.Uint8List>? value,
}) {
return RawValuesInsertable({
if (userId != null) 'user_id': userId,
@@ -3738,7 +3741,7 @@ class UserMetadataEntityCompanion
UserMetadataEntityCompanion copyWith({
Value<String>? userId,
Value<int>? key,
Value<Uint8List>? value,
Value<i2.Uint8List>? value,
}) {
return UserMetadataEntityCompanion(
userId: userId ?? this.userId,
@@ -3757,7 +3760,7 @@ class UserMetadataEntityCompanion
map['key'] = Variable<int>(key.value);
}
if (value.present) {
map['value'] = Variable<Uint8List>(value.value);
map['value'] = Variable<i2.Uint8List>(value.value);
}
return map;
}

View File

@@ -1,6 +1,8 @@
// dart format width=80
// GENERATED CODE, DO NOT EDIT BY HAND.
// ignore_for_file: type=lint
import 'dart:typed_data' as i2;
// GENERATED BY drift_dev, DO NOT MODIFY.
// ignore_for_file: type=lint,unused_import
//
import 'package:drift/drift.dart';
class UserEntity extends Table with TableInfo<UserEntity, UserEntityData> {
@@ -3582,13 +3584,14 @@ class UserMetadataEntity extends Table
type: DriftSqlType.int,
requiredDuringInsert: true,
);
late final GeneratedColumn<Uint8List> value = GeneratedColumn<Uint8List>(
'value',
aliasedName,
false,
type: DriftSqlType.blob,
requiredDuringInsert: true,
);
late final GeneratedColumn<i2.Uint8List> value =
GeneratedColumn<i2.Uint8List>(
'value',
aliasedName,
false,
type: DriftSqlType.blob,
requiredDuringInsert: true,
);
@override
List<GeneratedColumn> get $columns => [userId, key, value];
@override
@@ -3632,7 +3635,7 @@ class UserMetadataEntityData extends DataClass
implements Insertable<UserMetadataEntityData> {
final String userId;
final int key;
final Uint8List value;
final i2.Uint8List value;
const UserMetadataEntityData({
required this.userId,
required this.key,
@@ -3643,7 +3646,7 @@ class UserMetadataEntityData extends DataClass
final map = <String, Expression>{};
map['user_id'] = Variable<String>(userId);
map['key'] = Variable<int>(key);
map['value'] = Variable<Uint8List>(value);
map['value'] = Variable<i2.Uint8List>(value);
return map;
}
@@ -3655,7 +3658,7 @@ class UserMetadataEntityData extends DataClass
return UserMetadataEntityData(
userId: serializer.fromJson<String>(json['userId']),
key: serializer.fromJson<int>(json['key']),
value: serializer.fromJson<Uint8List>(json['value']),
value: serializer.fromJson<i2.Uint8List>(json['value']),
);
}
@override
@@ -3664,14 +3667,14 @@ class UserMetadataEntityData extends DataClass
return <String, dynamic>{
'userId': serializer.toJson<String>(userId),
'key': serializer.toJson<int>(key),
'value': serializer.toJson<Uint8List>(value),
'value': serializer.toJson<i2.Uint8List>(value),
};
}
UserMetadataEntityData copyWith({
String? userId,
int? key,
Uint8List? value,
i2.Uint8List? value,
}) => UserMetadataEntityData(
userId: userId ?? this.userId,
key: key ?? this.key,
@@ -3710,7 +3713,7 @@ class UserMetadataEntityCompanion
extends UpdateCompanion<UserMetadataEntityData> {
final Value<String> userId;
final Value<int> key;
final Value<Uint8List> value;
final Value<i2.Uint8List> value;
const UserMetadataEntityCompanion({
this.userId = const Value.absent(),
this.key = const Value.absent(),
@@ -3719,14 +3722,14 @@ class UserMetadataEntityCompanion
UserMetadataEntityCompanion.insert({
required String userId,
required int key,
required Uint8List value,
required i2.Uint8List value,
}) : userId = Value(userId),
key = Value(key),
value = Value(value);
static Insertable<UserMetadataEntityData> custom({
Expression<String>? userId,
Expression<int>? key,
Expression<Uint8List>? value,
Expression<i2.Uint8List>? value,
}) {
return RawValuesInsertable({
if (userId != null) 'user_id': userId,
@@ -3738,7 +3741,7 @@ class UserMetadataEntityCompanion
UserMetadataEntityCompanion copyWith({
Value<String>? userId,
Value<int>? key,
Value<Uint8List>? value,
Value<i2.Uint8List>? value,
}) {
return UserMetadataEntityCompanion(
userId: userId ?? this.userId,
@@ -3757,7 +3760,7 @@ class UserMetadataEntityCompanion
map['key'] = Variable<int>(key.value);
}
if (value.present) {
map['value'] = Variable<Uint8List>(value.value);
map['value'] = Variable<i2.Uint8List>(value.value);
}
return map;
}

View File

@@ -1,6 +1,8 @@
// dart format width=80
// GENERATED CODE, DO NOT EDIT BY HAND.
// ignore_for_file: type=lint
import 'dart:typed_data' as i2;
// GENERATED BY drift_dev, DO NOT MODIFY.
// ignore_for_file: type=lint,unused_import
//
import 'package:drift/drift.dart';
class UserEntity extends Table with TableInfo<UserEntity, UserEntityData> {
@@ -3618,13 +3620,14 @@ class UserMetadataEntity extends Table
type: DriftSqlType.int,
requiredDuringInsert: true,
);
late final GeneratedColumn<Uint8List> value = GeneratedColumn<Uint8List>(
'value',
aliasedName,
false,
type: DriftSqlType.blob,
requiredDuringInsert: true,
);
late final GeneratedColumn<i2.Uint8List> value =
GeneratedColumn<i2.Uint8List>(
'value',
aliasedName,
false,
type: DriftSqlType.blob,
requiredDuringInsert: true,
);
@override
List<GeneratedColumn> get $columns => [userId, key, value];
@override
@@ -3668,7 +3671,7 @@ class UserMetadataEntityData extends DataClass
implements Insertable<UserMetadataEntityData> {
final String userId;
final int key;
final Uint8List value;
final i2.Uint8List value;
const UserMetadataEntityData({
required this.userId,
required this.key,
@@ -3679,7 +3682,7 @@ class UserMetadataEntityData extends DataClass
final map = <String, Expression>{};
map['user_id'] = Variable<String>(userId);
map['key'] = Variable<int>(key);
map['value'] = Variable<Uint8List>(value);
map['value'] = Variable<i2.Uint8List>(value);
return map;
}
@@ -3691,7 +3694,7 @@ class UserMetadataEntityData extends DataClass
return UserMetadataEntityData(
userId: serializer.fromJson<String>(json['userId']),
key: serializer.fromJson<int>(json['key']),
value: serializer.fromJson<Uint8List>(json['value']),
value: serializer.fromJson<i2.Uint8List>(json['value']),
);
}
@override
@@ -3700,14 +3703,14 @@ class UserMetadataEntityData extends DataClass
return <String, dynamic>{
'userId': serializer.toJson<String>(userId),
'key': serializer.toJson<int>(key),
'value': serializer.toJson<Uint8List>(value),
'value': serializer.toJson<i2.Uint8List>(value),
};
}
UserMetadataEntityData copyWith({
String? userId,
int? key,
Uint8List? value,
i2.Uint8List? value,
}) => UserMetadataEntityData(
userId: userId ?? this.userId,
key: key ?? this.key,
@@ -3746,7 +3749,7 @@ class UserMetadataEntityCompanion
extends UpdateCompanion<UserMetadataEntityData> {
final Value<String> userId;
final Value<int> key;
final Value<Uint8List> value;
final Value<i2.Uint8List> value;
const UserMetadataEntityCompanion({
this.userId = const Value.absent(),
this.key = const Value.absent(),
@@ -3755,14 +3758,14 @@ class UserMetadataEntityCompanion
UserMetadataEntityCompanion.insert({
required String userId,
required int key,
required Uint8List value,
required i2.Uint8List value,
}) : userId = Value(userId),
key = Value(key),
value = Value(value);
static Insertable<UserMetadataEntityData> custom({
Expression<String>? userId,
Expression<int>? key,
Expression<Uint8List>? value,
Expression<i2.Uint8List>? value,
}) {
return RawValuesInsertable({
if (userId != null) 'user_id': userId,
@@ -3774,7 +3777,7 @@ class UserMetadataEntityCompanion
UserMetadataEntityCompanion copyWith({
Value<String>? userId,
Value<int>? key,
Value<Uint8List>? value,
Value<i2.Uint8List>? value,
}) {
return UserMetadataEntityCompanion(
userId: userId ?? this.userId,
@@ -3793,7 +3796,7 @@ class UserMetadataEntityCompanion
map['key'] = Variable<int>(key.value);
}
if (value.present) {
map['value'] = Variable<Uint8List>(value.value);
map['value'] = Variable<i2.Uint8List>(value.value);
}
return map;
}

View File

@@ -1,6 +1,8 @@
// dart format width=80
// GENERATED CODE, DO NOT EDIT BY HAND.
// ignore_for_file: type=lint
import 'dart:typed_data' as i2;
// GENERATED BY drift_dev, DO NOT MODIFY.
// ignore_for_file: type=lint,unused_import
//
import 'package:drift/drift.dart';
class UserEntity extends Table with TableInfo<UserEntity, UserEntityData> {
@@ -3656,13 +3658,14 @@ class UserMetadataEntity extends Table
type: DriftSqlType.int,
requiredDuringInsert: true,
);
late final GeneratedColumn<Uint8List> value = GeneratedColumn<Uint8List>(
'value',
aliasedName,
false,
type: DriftSqlType.blob,
requiredDuringInsert: true,
);
late final GeneratedColumn<i2.Uint8List> value =
GeneratedColumn<i2.Uint8List>(
'value',
aliasedName,
false,
type: DriftSqlType.blob,
requiredDuringInsert: true,
);
@override
List<GeneratedColumn> get $columns => [userId, key, value];
@override
@@ -3706,7 +3709,7 @@ class UserMetadataEntityData extends DataClass
implements Insertable<UserMetadataEntityData> {
final String userId;
final int key;
final Uint8List value;
final i2.Uint8List value;
const UserMetadataEntityData({
required this.userId,
required this.key,
@@ -3717,7 +3720,7 @@ class UserMetadataEntityData extends DataClass
final map = <String, Expression>{};
map['user_id'] = Variable<String>(userId);
map['key'] = Variable<int>(key);
map['value'] = Variable<Uint8List>(value);
map['value'] = Variable<i2.Uint8List>(value);
return map;
}
@@ -3729,7 +3732,7 @@ class UserMetadataEntityData extends DataClass
return UserMetadataEntityData(
userId: serializer.fromJson<String>(json['userId']),
key: serializer.fromJson<int>(json['key']),
value: serializer.fromJson<Uint8List>(json['value']),
value: serializer.fromJson<i2.Uint8List>(json['value']),
);
}
@override
@@ -3738,14 +3741,14 @@ class UserMetadataEntityData extends DataClass
return <String, dynamic>{
'userId': serializer.toJson<String>(userId),
'key': serializer.toJson<int>(key),
'value': serializer.toJson<Uint8List>(value),
'value': serializer.toJson<i2.Uint8List>(value),
};
}
UserMetadataEntityData copyWith({
String? userId,
int? key,
Uint8List? value,
i2.Uint8List? value,
}) => UserMetadataEntityData(
userId: userId ?? this.userId,
key: key ?? this.key,
@@ -3784,7 +3787,7 @@ class UserMetadataEntityCompanion
extends UpdateCompanion<UserMetadataEntityData> {
final Value<String> userId;
final Value<int> key;
final Value<Uint8List> value;
final Value<i2.Uint8List> value;
const UserMetadataEntityCompanion({
this.userId = const Value.absent(),
this.key = const Value.absent(),
@@ -3793,14 +3796,14 @@ class UserMetadataEntityCompanion
UserMetadataEntityCompanion.insert({
required String userId,
required int key,
required Uint8List value,
required i2.Uint8List value,
}) : userId = Value(userId),
key = Value(key),
value = Value(value);
static Insertable<UserMetadataEntityData> custom({
Expression<String>? userId,
Expression<int>? key,
Expression<Uint8List>? value,
Expression<i2.Uint8List>? value,
}) {
return RawValuesInsertable({
if (userId != null) 'user_id': userId,
@@ -3812,7 +3815,7 @@ class UserMetadataEntityCompanion
UserMetadataEntityCompanion copyWith({
Value<String>? userId,
Value<int>? key,
Value<Uint8List>? value,
Value<i2.Uint8List>? value,
}) {
return UserMetadataEntityCompanion(
userId: userId ?? this.userId,
@@ -3831,7 +3834,7 @@ class UserMetadataEntityCompanion
map['key'] = Variable<int>(key.value);
}
if (value.present) {
map['value'] = Variable<Uint8List>(value.value);
map['value'] = Variable<i2.Uint8List>(value.value);
}
return map;
}

View File

@@ -1,6 +1,8 @@
// dart format width=80
// GENERATED CODE, DO NOT EDIT BY HAND.
// ignore_for_file: type=lint
import 'dart:typed_data' as i2;
// GENERATED BY drift_dev, DO NOT MODIFY.
// ignore_for_file: type=lint,unused_import
//
import 'package:drift/drift.dart';
class UserEntity extends Table with TableInfo<UserEntity, UserEntityData> {
@@ -3656,13 +3658,14 @@ class UserMetadataEntity extends Table
type: DriftSqlType.int,
requiredDuringInsert: true,
);
late final GeneratedColumn<Uint8List> value = GeneratedColumn<Uint8List>(
'value',
aliasedName,
false,
type: DriftSqlType.blob,
requiredDuringInsert: true,
);
late final GeneratedColumn<i2.Uint8List> value =
GeneratedColumn<i2.Uint8List>(
'value',
aliasedName,
false,
type: DriftSqlType.blob,
requiredDuringInsert: true,
);
@override
List<GeneratedColumn> get $columns => [userId, key, value];
@override
@@ -3706,7 +3709,7 @@ class UserMetadataEntityData extends DataClass
implements Insertable<UserMetadataEntityData> {
final String userId;
final int key;
final Uint8List value;
final i2.Uint8List value;
const UserMetadataEntityData({
required this.userId,
required this.key,
@@ -3717,7 +3720,7 @@ class UserMetadataEntityData extends DataClass
final map = <String, Expression>{};
map['user_id'] = Variable<String>(userId);
map['key'] = Variable<int>(key);
map['value'] = Variable<Uint8List>(value);
map['value'] = Variable<i2.Uint8List>(value);
return map;
}
@@ -3729,7 +3732,7 @@ class UserMetadataEntityData extends DataClass
return UserMetadataEntityData(
userId: serializer.fromJson<String>(json['userId']),
key: serializer.fromJson<int>(json['key']),
value: serializer.fromJson<Uint8List>(json['value']),
value: serializer.fromJson<i2.Uint8List>(json['value']),
);
}
@override
@@ -3738,14 +3741,14 @@ class UserMetadataEntityData extends DataClass
return <String, dynamic>{
'userId': serializer.toJson<String>(userId),
'key': serializer.toJson<int>(key),
'value': serializer.toJson<Uint8List>(value),
'value': serializer.toJson<i2.Uint8List>(value),
};
}
UserMetadataEntityData copyWith({
String? userId,
int? key,
Uint8List? value,
i2.Uint8List? value,
}) => UserMetadataEntityData(
userId: userId ?? this.userId,
key: key ?? this.key,
@@ -3784,7 +3787,7 @@ class UserMetadataEntityCompanion
extends UpdateCompanion<UserMetadataEntityData> {
final Value<String> userId;
final Value<int> key;
final Value<Uint8List> value;
final Value<i2.Uint8List> value;
const UserMetadataEntityCompanion({
this.userId = const Value.absent(),
this.key = const Value.absent(),
@@ -3793,14 +3796,14 @@ class UserMetadataEntityCompanion
UserMetadataEntityCompanion.insert({
required String userId,
required int key,
required Uint8List value,
required i2.Uint8List value,
}) : userId = Value(userId),
key = Value(key),
value = Value(value);
static Insertable<UserMetadataEntityData> custom({
Expression<String>? userId,
Expression<int>? key,
Expression<Uint8List>? value,
Expression<i2.Uint8List>? value,
}) {
return RawValuesInsertable({
if (userId != null) 'user_id': userId,
@@ -3812,7 +3815,7 @@ class UserMetadataEntityCompanion
UserMetadataEntityCompanion copyWith({
Value<String>? userId,
Value<int>? key,
Value<Uint8List>? value,
Value<i2.Uint8List>? value,
}) {
return UserMetadataEntityCompanion(
userId: userId ?? this.userId,
@@ -3831,7 +3834,7 @@ class UserMetadataEntityCompanion
map['key'] = Variable<int>(key.value);
}
if (value.present) {
map['value'] = Variable<Uint8List>(value.value);
map['value'] = Variable<i2.Uint8List>(value.value);
}
return map;
}

View File

@@ -1,6 +1,8 @@
// dart format width=80
// GENERATED CODE, DO NOT EDIT BY HAND.
// ignore_for_file: type=lint
import 'dart:typed_data' as i2;
// GENERATED BY drift_dev, DO NOT MODIFY.
// ignore_for_file: type=lint,unused_import
//
import 'package:drift/drift.dart';
class UserEntity extends Table with TableInfo<UserEntity, UserEntityData> {
@@ -3656,13 +3658,14 @@ class UserMetadataEntity extends Table
type: DriftSqlType.int,
requiredDuringInsert: true,
);
late final GeneratedColumn<Uint8List> value = GeneratedColumn<Uint8List>(
'value',
aliasedName,
false,
type: DriftSqlType.blob,
requiredDuringInsert: true,
);
late final GeneratedColumn<i2.Uint8List> value =
GeneratedColumn<i2.Uint8List>(
'value',
aliasedName,
false,
type: DriftSqlType.blob,
requiredDuringInsert: true,
);
@override
List<GeneratedColumn> get $columns => [userId, key, value];
@override
@@ -3706,7 +3709,7 @@ class UserMetadataEntityData extends DataClass
implements Insertable<UserMetadataEntityData> {
final String userId;
final int key;
final Uint8List value;
final i2.Uint8List value;
const UserMetadataEntityData({
required this.userId,
required this.key,
@@ -3717,7 +3720,7 @@ class UserMetadataEntityData extends DataClass
final map = <String, Expression>{};
map['user_id'] = Variable<String>(userId);
map['key'] = Variable<int>(key);
map['value'] = Variable<Uint8List>(value);
map['value'] = Variable<i2.Uint8List>(value);
return map;
}
@@ -3729,7 +3732,7 @@ class UserMetadataEntityData extends DataClass
return UserMetadataEntityData(
userId: serializer.fromJson<String>(json['userId']),
key: serializer.fromJson<int>(json['key']),
value: serializer.fromJson<Uint8List>(json['value']),
value: serializer.fromJson<i2.Uint8List>(json['value']),
);
}
@override
@@ -3738,14 +3741,14 @@ class UserMetadataEntityData extends DataClass
return <String, dynamic>{
'userId': serializer.toJson<String>(userId),
'key': serializer.toJson<int>(key),
'value': serializer.toJson<Uint8List>(value),
'value': serializer.toJson<i2.Uint8List>(value),
};
}
UserMetadataEntityData copyWith({
String? userId,
int? key,
Uint8List? value,
i2.Uint8List? value,
}) => UserMetadataEntityData(
userId: userId ?? this.userId,
key: key ?? this.key,
@@ -3784,7 +3787,7 @@ class UserMetadataEntityCompanion
extends UpdateCompanion<UserMetadataEntityData> {
final Value<String> userId;
final Value<int> key;
final Value<Uint8List> value;
final Value<i2.Uint8List> value;
const UserMetadataEntityCompanion({
this.userId = const Value.absent(),
this.key = const Value.absent(),
@@ -3793,14 +3796,14 @@ class UserMetadataEntityCompanion
UserMetadataEntityCompanion.insert({
required String userId,
required int key,
required Uint8List value,
required i2.Uint8List value,
}) : userId = Value(userId),
key = Value(key),
value = Value(value);
static Insertable<UserMetadataEntityData> custom({
Expression<String>? userId,
Expression<int>? key,
Expression<Uint8List>? value,
Expression<i2.Uint8List>? value,
}) {
return RawValuesInsertable({
if (userId != null) 'user_id': userId,
@@ -3812,7 +3815,7 @@ class UserMetadataEntityCompanion
UserMetadataEntityCompanion copyWith({
Value<String>? userId,
Value<int>? key,
Value<Uint8List>? value,
Value<i2.Uint8List>? value,
}) {
return UserMetadataEntityCompanion(
userId: userId ?? this.userId,
@@ -3831,7 +3834,7 @@ class UserMetadataEntityCompanion
map['key'] = Variable<int>(key.value);
}
if (value.present) {
map['value'] = Variable<Uint8List>(value.value);
map['value'] = Variable<i2.Uint8List>(value.value);
}
return map;
}

View File

@@ -1,6 +1,8 @@
// dart format width=80
// GENERATED CODE, DO NOT EDIT BY HAND.
// ignore_for_file: type=lint
import 'dart:typed_data' as i2;
// GENERATED BY drift_dev, DO NOT MODIFY.
// ignore_for_file: type=lint,unused_import
//
import 'package:drift/drift.dart';
class UserEntity extends Table with TableInfo<UserEntity, UserEntityData> {
@@ -1974,13 +1976,14 @@ class UserMetadataEntity extends Table
type: DriftSqlType.int,
requiredDuringInsert: true,
);
late final GeneratedColumn<Uint8List> value = GeneratedColumn<Uint8List>(
'value',
aliasedName,
false,
type: DriftSqlType.blob,
requiredDuringInsert: true,
);
late final GeneratedColumn<i2.Uint8List> value =
GeneratedColumn<i2.Uint8List>(
'value',
aliasedName,
false,
type: DriftSqlType.blob,
requiredDuringInsert: true,
);
@override
List<GeneratedColumn> get $columns => [userId, key, value];
@override
@@ -2024,7 +2027,7 @@ class UserMetadataEntityData extends DataClass
implements Insertable<UserMetadataEntityData> {
final String userId;
final int key;
final Uint8List value;
final i2.Uint8List value;
const UserMetadataEntityData({
required this.userId,
required this.key,
@@ -2035,7 +2038,7 @@ class UserMetadataEntityData extends DataClass
final map = <String, Expression>{};
map['user_id'] = Variable<String>(userId);
map['key'] = Variable<int>(key);
map['value'] = Variable<Uint8List>(value);
map['value'] = Variable<i2.Uint8List>(value);
return map;
}
@@ -2047,7 +2050,7 @@ class UserMetadataEntityData extends DataClass
return UserMetadataEntityData(
userId: serializer.fromJson<String>(json['userId']),
key: serializer.fromJson<int>(json['key']),
value: serializer.fromJson<Uint8List>(json['value']),
value: serializer.fromJson<i2.Uint8List>(json['value']),
);
}
@override
@@ -2056,14 +2059,14 @@ class UserMetadataEntityData extends DataClass
return <String, dynamic>{
'userId': serializer.toJson<String>(userId),
'key': serializer.toJson<int>(key),
'value': serializer.toJson<Uint8List>(value),
'value': serializer.toJson<i2.Uint8List>(value),
};
}
UserMetadataEntityData copyWith({
String? userId,
int? key,
Uint8List? value,
i2.Uint8List? value,
}) => UserMetadataEntityData(
userId: userId ?? this.userId,
key: key ?? this.key,
@@ -2102,7 +2105,7 @@ class UserMetadataEntityCompanion
extends UpdateCompanion<UserMetadataEntityData> {
final Value<String> userId;
final Value<int> key;
final Value<Uint8List> value;
final Value<i2.Uint8List> value;
const UserMetadataEntityCompanion({
this.userId = const Value.absent(),
this.key = const Value.absent(),
@@ -2111,14 +2114,14 @@ class UserMetadataEntityCompanion
UserMetadataEntityCompanion.insert({
required String userId,
required int key,
required Uint8List value,
required i2.Uint8List value,
}) : userId = Value(userId),
key = Value(key),
value = Value(value);
static Insertable<UserMetadataEntityData> custom({
Expression<String>? userId,
Expression<int>? key,
Expression<Uint8List>? value,
Expression<i2.Uint8List>? value,
}) {
return RawValuesInsertable({
if (userId != null) 'user_id': userId,
@@ -2130,7 +2133,7 @@ class UserMetadataEntityCompanion
UserMetadataEntityCompanion copyWith({
Value<String>? userId,
Value<int>? key,
Value<Uint8List>? value,
Value<i2.Uint8List>? value,
}) {
return UserMetadataEntityCompanion(
userId: userId ?? this.userId,
@@ -2149,7 +2152,7 @@ class UserMetadataEntityCompanion
map['key'] = Variable<int>(key.value);
}
if (value.present) {
map['value'] = Variable<Uint8List>(value.value);
map['value'] = Variable<i2.Uint8List>(value.value);
}
return map;
}

View File

@@ -1,6 +1,8 @@
// dart format width=80
// GENERATED CODE, DO NOT EDIT BY HAND.
// ignore_for_file: type=lint
import 'dart:typed_data' as i2;
// GENERATED BY drift_dev, DO NOT MODIFY.
// ignore_for_file: type=lint,unused_import
//
import 'package:drift/drift.dart';
class UserEntity extends Table with TableInfo<UserEntity, UserEntityData> {
@@ -3656,13 +3658,14 @@ class UserMetadataEntity extends Table
type: DriftSqlType.int,
requiredDuringInsert: true,
);
late final GeneratedColumn<Uint8List> value = GeneratedColumn<Uint8List>(
'value',
aliasedName,
false,
type: DriftSqlType.blob,
requiredDuringInsert: true,
);
late final GeneratedColumn<i2.Uint8List> value =
GeneratedColumn<i2.Uint8List>(
'value',
aliasedName,
false,
type: DriftSqlType.blob,
requiredDuringInsert: true,
);
@override
List<GeneratedColumn> get $columns => [userId, key, value];
@override
@@ -3706,7 +3709,7 @@ class UserMetadataEntityData extends DataClass
implements Insertable<UserMetadataEntityData> {
final String userId;
final int key;
final Uint8List value;
final i2.Uint8List value;
const UserMetadataEntityData({
required this.userId,
required this.key,
@@ -3717,7 +3720,7 @@ class UserMetadataEntityData extends DataClass
final map = <String, Expression>{};
map['user_id'] = Variable<String>(userId);
map['key'] = Variable<int>(key);
map['value'] = Variable<Uint8List>(value);
map['value'] = Variable<i2.Uint8List>(value);
return map;
}
@@ -3729,7 +3732,7 @@ class UserMetadataEntityData extends DataClass
return UserMetadataEntityData(
userId: serializer.fromJson<String>(json['userId']),
key: serializer.fromJson<int>(json['key']),
value: serializer.fromJson<Uint8List>(json['value']),
value: serializer.fromJson<i2.Uint8List>(json['value']),
);
}
@override
@@ -3738,14 +3741,14 @@ class UserMetadataEntityData extends DataClass
return <String, dynamic>{
'userId': serializer.toJson<String>(userId),
'key': serializer.toJson<int>(key),
'value': serializer.toJson<Uint8List>(value),
'value': serializer.toJson<i2.Uint8List>(value),
};
}
UserMetadataEntityData copyWith({
String? userId,
int? key,
Uint8List? value,
i2.Uint8List? value,
}) => UserMetadataEntityData(
userId: userId ?? this.userId,
key: key ?? this.key,
@@ -3784,7 +3787,7 @@ class UserMetadataEntityCompanion
extends UpdateCompanion<UserMetadataEntityData> {
final Value<String> userId;
final Value<int> key;
final Value<Uint8List> value;
final Value<i2.Uint8List> value;
const UserMetadataEntityCompanion({
this.userId = const Value.absent(),
this.key = const Value.absent(),
@@ -3793,14 +3796,14 @@ class UserMetadataEntityCompanion
UserMetadataEntityCompanion.insert({
required String userId,
required int key,
required Uint8List value,
required i2.Uint8List value,
}) : userId = Value(userId),
key = Value(key),
value = Value(value);
static Insertable<UserMetadataEntityData> custom({
Expression<String>? userId,
Expression<int>? key,
Expression<Uint8List>? value,
Expression<i2.Uint8List>? value,
}) {
return RawValuesInsertable({
if (userId != null) 'user_id': userId,
@@ -3812,7 +3815,7 @@ class UserMetadataEntityCompanion
UserMetadataEntityCompanion copyWith({
Value<String>? userId,
Value<int>? key,
Value<Uint8List>? value,
Value<i2.Uint8List>? value,
}) {
return UserMetadataEntityCompanion(
userId: userId ?? this.userId,
@@ -3831,7 +3834,7 @@ class UserMetadataEntityCompanion
map['key'] = Variable<int>(key.value);
}
if (value.present) {
map['value'] = Variable<Uint8List>(value.value);
map['value'] = Variable<i2.Uint8List>(value.value);
}
return map;
}

View File

@@ -1,6 +1,8 @@
// dart format width=80
// GENERATED CODE, DO NOT EDIT BY HAND.
// ignore_for_file: type=lint
import 'dart:typed_data' as i2;
// GENERATED BY drift_dev, DO NOT MODIFY.
// ignore_for_file: type=lint,unused_import
//
import 'package:drift/drift.dart';
class UserEntity extends Table with TableInfo<UserEntity, UserEntityData> {
@@ -3693,13 +3695,14 @@ class UserMetadataEntity extends Table
type: DriftSqlType.int,
requiredDuringInsert: true,
);
late final GeneratedColumn<Uint8List> value = GeneratedColumn<Uint8List>(
'value',
aliasedName,
false,
type: DriftSqlType.blob,
requiredDuringInsert: true,
);
late final GeneratedColumn<i2.Uint8List> value =
GeneratedColumn<i2.Uint8List>(
'value',
aliasedName,
false,
type: DriftSqlType.blob,
requiredDuringInsert: true,
);
@override
List<GeneratedColumn> get $columns => [userId, key, value];
@override
@@ -3743,7 +3746,7 @@ class UserMetadataEntityData extends DataClass
implements Insertable<UserMetadataEntityData> {
final String userId;
final int key;
final Uint8List value;
final i2.Uint8List value;
const UserMetadataEntityData({
required this.userId,
required this.key,
@@ -3754,7 +3757,7 @@ class UserMetadataEntityData extends DataClass
final map = <String, Expression>{};
map['user_id'] = Variable<String>(userId);
map['key'] = Variable<int>(key);
map['value'] = Variable<Uint8List>(value);
map['value'] = Variable<i2.Uint8List>(value);
return map;
}
@@ -3766,7 +3769,7 @@ class UserMetadataEntityData extends DataClass
return UserMetadataEntityData(
userId: serializer.fromJson<String>(json['userId']),
key: serializer.fromJson<int>(json['key']),
value: serializer.fromJson<Uint8List>(json['value']),
value: serializer.fromJson<i2.Uint8List>(json['value']),
);
}
@override
@@ -3775,14 +3778,14 @@ class UserMetadataEntityData extends DataClass
return <String, dynamic>{
'userId': serializer.toJson<String>(userId),
'key': serializer.toJson<int>(key),
'value': serializer.toJson<Uint8List>(value),
'value': serializer.toJson<i2.Uint8List>(value),
};
}
UserMetadataEntityData copyWith({
String? userId,
int? key,
Uint8List? value,
i2.Uint8List? value,
}) => UserMetadataEntityData(
userId: userId ?? this.userId,
key: key ?? this.key,
@@ -3821,7 +3824,7 @@ class UserMetadataEntityCompanion
extends UpdateCompanion<UserMetadataEntityData> {
final Value<String> userId;
final Value<int> key;
final Value<Uint8List> value;
final Value<i2.Uint8List> value;
const UserMetadataEntityCompanion({
this.userId = const Value.absent(),
this.key = const Value.absent(),
@@ -3830,14 +3833,14 @@ class UserMetadataEntityCompanion
UserMetadataEntityCompanion.insert({
required String userId,
required int key,
required Uint8List value,
required i2.Uint8List value,
}) : userId = Value(userId),
key = Value(key),
value = Value(value);
static Insertable<UserMetadataEntityData> custom({
Expression<String>? userId,
Expression<int>? key,
Expression<Uint8List>? value,
Expression<i2.Uint8List>? value,
}) {
return RawValuesInsertable({
if (userId != null) 'user_id': userId,
@@ -3849,7 +3852,7 @@ class UserMetadataEntityCompanion
UserMetadataEntityCompanion copyWith({
Value<String>? userId,
Value<int>? key,
Value<Uint8List>? value,
Value<i2.Uint8List>? value,
}) {
return UserMetadataEntityCompanion(
userId: userId ?? this.userId,
@@ -3868,7 +3871,7 @@ class UserMetadataEntityCompanion
map['key'] = Variable<int>(key.value);
}
if (value.present) {
map['value'] = Variable<Uint8List>(value.value);
map['value'] = Variable<i2.Uint8List>(value.value);
}
return map;
}

View File

@@ -1,6 +1,8 @@
// dart format width=80
// GENERATED CODE, DO NOT EDIT BY HAND.
// ignore_for_file: type=lint
import 'dart:typed_data' as i2;
// GENERATED BY drift_dev, DO NOT MODIFY.
// ignore_for_file: type=lint,unused_import
//
import 'package:drift/drift.dart';
class UserEntity extends Table with TableInfo<UserEntity, UserEntityData> {
@@ -3693,13 +3695,14 @@ class UserMetadataEntity extends Table
type: DriftSqlType.int,
requiredDuringInsert: true,
);
late final GeneratedColumn<Uint8List> value = GeneratedColumn<Uint8List>(
'value',
aliasedName,
false,
type: DriftSqlType.blob,
requiredDuringInsert: true,
);
late final GeneratedColumn<i2.Uint8List> value =
GeneratedColumn<i2.Uint8List>(
'value',
aliasedName,
false,
type: DriftSqlType.blob,
requiredDuringInsert: true,
);
@override
List<GeneratedColumn> get $columns => [userId, key, value];
@override
@@ -3743,7 +3746,7 @@ class UserMetadataEntityData extends DataClass
implements Insertable<UserMetadataEntityData> {
final String userId;
final int key;
final Uint8List value;
final i2.Uint8List value;
const UserMetadataEntityData({
required this.userId,
required this.key,
@@ -3754,7 +3757,7 @@ class UserMetadataEntityData extends DataClass
final map = <String, Expression>{};
map['user_id'] = Variable<String>(userId);
map['key'] = Variable<int>(key);
map['value'] = Variable<Uint8List>(value);
map['value'] = Variable<i2.Uint8List>(value);
return map;
}
@@ -3766,7 +3769,7 @@ class UserMetadataEntityData extends DataClass
return UserMetadataEntityData(
userId: serializer.fromJson<String>(json['userId']),
key: serializer.fromJson<int>(json['key']),
value: serializer.fromJson<Uint8List>(json['value']),
value: serializer.fromJson<i2.Uint8List>(json['value']),
);
}
@override
@@ -3775,14 +3778,14 @@ class UserMetadataEntityData extends DataClass
return <String, dynamic>{
'userId': serializer.toJson<String>(userId),
'key': serializer.toJson<int>(key),
'value': serializer.toJson<Uint8List>(value),
'value': serializer.toJson<i2.Uint8List>(value),
};
}
UserMetadataEntityData copyWith({
String? userId,
int? key,
Uint8List? value,
i2.Uint8List? value,
}) => UserMetadataEntityData(
userId: userId ?? this.userId,
key: key ?? this.key,
@@ -3821,7 +3824,7 @@ class UserMetadataEntityCompanion
extends UpdateCompanion<UserMetadataEntityData> {
final Value<String> userId;
final Value<int> key;
final Value<Uint8List> value;
final Value<i2.Uint8List> value;
const UserMetadataEntityCompanion({
this.userId = const Value.absent(),
this.key = const Value.absent(),
@@ -3830,14 +3833,14 @@ class UserMetadataEntityCompanion
UserMetadataEntityCompanion.insert({
required String userId,
required int key,
required Uint8List value,
required i2.Uint8List value,
}) : userId = Value(userId),
key = Value(key),
value = Value(value);
static Insertable<UserMetadataEntityData> custom({
Expression<String>? userId,
Expression<int>? key,
Expression<Uint8List>? value,
Expression<i2.Uint8List>? value,
}) {
return RawValuesInsertable({
if (userId != null) 'user_id': userId,
@@ -3849,7 +3852,7 @@ class UserMetadataEntityCompanion
UserMetadataEntityCompanion copyWith({
Value<String>? userId,
Value<int>? key,
Value<Uint8List>? value,
Value<i2.Uint8List>? value,
}) {
return UserMetadataEntityCompanion(
userId: userId ?? this.userId,
@@ -3868,7 +3871,7 @@ class UserMetadataEntityCompanion
map['key'] = Variable<int>(key.value);
}
if (value.present) {
map['value'] = Variable<Uint8List>(value.value);
map['value'] = Variable<i2.Uint8List>(value.value);
}
return map;
}
@@ -8409,13 +8412,14 @@ class AssetEditEntity extends Table
type: DriftSqlType.int,
requiredDuringInsert: true,
);
late final GeneratedColumn<Uint8List> parameters = GeneratedColumn<Uint8List>(
'parameters',
aliasedName,
false,
type: DriftSqlType.blob,
requiredDuringInsert: true,
);
late final GeneratedColumn<i2.Uint8List> parameters =
GeneratedColumn<i2.Uint8List>(
'parameters',
aliasedName,
false,
type: DriftSqlType.blob,
requiredDuringInsert: true,
);
late final GeneratedColumn<int> sequence = GeneratedColumn<int>(
'sequence',
aliasedName,
@@ -8481,7 +8485,7 @@ class AssetEditEntityData extends DataClass
final String id;
final String assetId;
final int action;
final Uint8List parameters;
final i2.Uint8List parameters;
final int sequence;
const AssetEditEntityData({
required this.id,
@@ -8496,7 +8500,7 @@ class AssetEditEntityData extends DataClass
map['id'] = Variable<String>(id);
map['asset_id'] = Variable<String>(assetId);
map['action'] = Variable<int>(action);
map['parameters'] = Variable<Uint8List>(parameters);
map['parameters'] = Variable<i2.Uint8List>(parameters);
map['sequence'] = Variable<int>(sequence);
return map;
}
@@ -8510,7 +8514,7 @@ class AssetEditEntityData extends DataClass
id: serializer.fromJson<String>(json['id']),
assetId: serializer.fromJson<String>(json['assetId']),
action: serializer.fromJson<int>(json['action']),
parameters: serializer.fromJson<Uint8List>(json['parameters']),
parameters: serializer.fromJson<i2.Uint8List>(json['parameters']),
sequence: serializer.fromJson<int>(json['sequence']),
);
}
@@ -8521,7 +8525,7 @@ class AssetEditEntityData extends DataClass
'id': serializer.toJson<String>(id),
'assetId': serializer.toJson<String>(assetId),
'action': serializer.toJson<int>(action),
'parameters': serializer.toJson<Uint8List>(parameters),
'parameters': serializer.toJson<i2.Uint8List>(parameters),
'sequence': serializer.toJson<int>(sequence),
};
}
@@ -8530,7 +8534,7 @@ class AssetEditEntityData extends DataClass
String? id,
String? assetId,
int? action,
Uint8List? parameters,
i2.Uint8List? parameters,
int? sequence,
}) => AssetEditEntityData(
id: id ?? this.id,
@@ -8586,7 +8590,7 @@ class AssetEditEntityCompanion extends UpdateCompanion<AssetEditEntityData> {
final Value<String> id;
final Value<String> assetId;
final Value<int> action;
final Value<Uint8List> parameters;
final Value<i2.Uint8List> parameters;
final Value<int> sequence;
const AssetEditEntityCompanion({
this.id = const Value.absent(),
@@ -8599,7 +8603,7 @@ class AssetEditEntityCompanion extends UpdateCompanion<AssetEditEntityData> {
required String id,
required String assetId,
required int action,
required Uint8List parameters,
required i2.Uint8List parameters,
required int sequence,
}) : id = Value(id),
assetId = Value(assetId),
@@ -8610,7 +8614,7 @@ class AssetEditEntityCompanion extends UpdateCompanion<AssetEditEntityData> {
Expression<String>? id,
Expression<String>? assetId,
Expression<int>? action,
Expression<Uint8List>? parameters,
Expression<i2.Uint8List>? parameters,
Expression<int>? sequence,
}) {
return RawValuesInsertable({
@@ -8626,7 +8630,7 @@ class AssetEditEntityCompanion extends UpdateCompanion<AssetEditEntityData> {
Value<String>? id,
Value<String>? assetId,
Value<int>? action,
Value<Uint8List>? parameters,
Value<i2.Uint8List>? parameters,
Value<int>? sequence,
}) {
return AssetEditEntityCompanion(
@@ -8651,7 +8655,7 @@ class AssetEditEntityCompanion extends UpdateCompanion<AssetEditEntityData> {
map['action'] = Variable<int>(action.value);
}
if (parameters.present) {
map['parameters'] = Variable<Uint8List>(parameters.value);
map['parameters'] = Variable<i2.Uint8List>(parameters.value);
}
if (sequence.present) {
map['sequence'] = Variable<int>(sequence.value);

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,8 @@
// dart format width=80
// GENERATED CODE, DO NOT EDIT BY HAND.
// ignore_for_file: type=lint
import 'dart:typed_data' as i2;
// GENERATED BY drift_dev, DO NOT MODIFY.
// ignore_for_file: type=lint,unused_import
//
import 'package:drift/drift.dart';
class UserEntity extends Table with TableInfo<UserEntity, UserEntityData> {
@@ -1971,13 +1973,14 @@ class UserMetadataEntity extends Table
type: DriftSqlType.int,
requiredDuringInsert: true,
);
late final GeneratedColumn<Uint8List> value = GeneratedColumn<Uint8List>(
'value',
aliasedName,
false,
type: DriftSqlType.blob,
requiredDuringInsert: true,
);
late final GeneratedColumn<i2.Uint8List> value =
GeneratedColumn<i2.Uint8List>(
'value',
aliasedName,
false,
type: DriftSqlType.blob,
requiredDuringInsert: true,
);
@override
List<GeneratedColumn> get $columns => [userId, key, value];
@override
@@ -2021,7 +2024,7 @@ class UserMetadataEntityData extends DataClass
implements Insertable<UserMetadataEntityData> {
final String userId;
final int key;
final Uint8List value;
final i2.Uint8List value;
const UserMetadataEntityData({
required this.userId,
required this.key,
@@ -2032,7 +2035,7 @@ class UserMetadataEntityData extends DataClass
final map = <String, Expression>{};
map['user_id'] = Variable<String>(userId);
map['key'] = Variable<int>(key);
map['value'] = Variable<Uint8List>(value);
map['value'] = Variable<i2.Uint8List>(value);
return map;
}
@@ -2044,7 +2047,7 @@ class UserMetadataEntityData extends DataClass
return UserMetadataEntityData(
userId: serializer.fromJson<String>(json['userId']),
key: serializer.fromJson<int>(json['key']),
value: serializer.fromJson<Uint8List>(json['value']),
value: serializer.fromJson<i2.Uint8List>(json['value']),
);
}
@override
@@ -2053,14 +2056,14 @@ class UserMetadataEntityData extends DataClass
return <String, dynamic>{
'userId': serializer.toJson<String>(userId),
'key': serializer.toJson<int>(key),
'value': serializer.toJson<Uint8List>(value),
'value': serializer.toJson<i2.Uint8List>(value),
};
}
UserMetadataEntityData copyWith({
String? userId,
int? key,
Uint8List? value,
i2.Uint8List? value,
}) => UserMetadataEntityData(
userId: userId ?? this.userId,
key: key ?? this.key,
@@ -2099,7 +2102,7 @@ class UserMetadataEntityCompanion
extends UpdateCompanion<UserMetadataEntityData> {
final Value<String> userId;
final Value<int> key;
final Value<Uint8List> value;
final Value<i2.Uint8List> value;
const UserMetadataEntityCompanion({
this.userId = const Value.absent(),
this.key = const Value.absent(),
@@ -2108,14 +2111,14 @@ class UserMetadataEntityCompanion
UserMetadataEntityCompanion.insert({
required String userId,
required int key,
required Uint8List value,
required i2.Uint8List value,
}) : userId = Value(userId),
key = Value(key),
value = Value(value);
static Insertable<UserMetadataEntityData> custom({
Expression<String>? userId,
Expression<int>? key,
Expression<Uint8List>? value,
Expression<i2.Uint8List>? value,
}) {
return RawValuesInsertable({
if (userId != null) 'user_id': userId,
@@ -2127,7 +2130,7 @@ class UserMetadataEntityCompanion
UserMetadataEntityCompanion copyWith({
Value<String>? userId,
Value<int>? key,
Value<Uint8List>? value,
Value<i2.Uint8List>? value,
}) {
return UserMetadataEntityCompanion(
userId: userId ?? this.userId,
@@ -2146,7 +2149,7 @@ class UserMetadataEntityCompanion
map['key'] = Variable<int>(key.value);
}
if (value.present) {
map['value'] = Variable<Uint8List>(value.value);
map['value'] = Variable<i2.Uint8List>(value.value);
}
return map;
}

View File

@@ -1,6 +1,8 @@
// dart format width=80
// GENERATED CODE, DO NOT EDIT BY HAND.
// ignore_for_file: type=lint
import 'dart:typed_data' as i2;
// GENERATED BY drift_dev, DO NOT MODIFY.
// ignore_for_file: type=lint,unused_import
//
import 'package:drift/drift.dart';
class UserEntity extends Table with TableInfo<UserEntity, UserEntityData> {
@@ -2492,13 +2494,14 @@ class UserMetadataEntity extends Table
type: DriftSqlType.int,
requiredDuringInsert: true,
);
late final GeneratedColumn<Uint8List> value = GeneratedColumn<Uint8List>(
'value',
aliasedName,
false,
type: DriftSqlType.blob,
requiredDuringInsert: true,
);
late final GeneratedColumn<i2.Uint8List> value =
GeneratedColumn<i2.Uint8List>(
'value',
aliasedName,
false,
type: DriftSqlType.blob,
requiredDuringInsert: true,
);
@override
List<GeneratedColumn> get $columns => [userId, key, value];
@override
@@ -2542,7 +2545,7 @@ class UserMetadataEntityData extends DataClass
implements Insertable<UserMetadataEntityData> {
final String userId;
final int key;
final Uint8List value;
final i2.Uint8List value;
const UserMetadataEntityData({
required this.userId,
required this.key,
@@ -2553,7 +2556,7 @@ class UserMetadataEntityData extends DataClass
final map = <String, Expression>{};
map['user_id'] = Variable<String>(userId);
map['key'] = Variable<int>(key);
map['value'] = Variable<Uint8List>(value);
map['value'] = Variable<i2.Uint8List>(value);
return map;
}
@@ -2565,7 +2568,7 @@ class UserMetadataEntityData extends DataClass
return UserMetadataEntityData(
userId: serializer.fromJson<String>(json['userId']),
key: serializer.fromJson<int>(json['key']),
value: serializer.fromJson<Uint8List>(json['value']),
value: serializer.fromJson<i2.Uint8List>(json['value']),
);
}
@override
@@ -2574,14 +2577,14 @@ class UserMetadataEntityData extends DataClass
return <String, dynamic>{
'userId': serializer.toJson<String>(userId),
'key': serializer.toJson<int>(key),
'value': serializer.toJson<Uint8List>(value),
'value': serializer.toJson<i2.Uint8List>(value),
};
}
UserMetadataEntityData copyWith({
String? userId,
int? key,
Uint8List? value,
i2.Uint8List? value,
}) => UserMetadataEntityData(
userId: userId ?? this.userId,
key: key ?? this.key,
@@ -2620,7 +2623,7 @@ class UserMetadataEntityCompanion
extends UpdateCompanion<UserMetadataEntityData> {
final Value<String> userId;
final Value<int> key;
final Value<Uint8List> value;
final Value<i2.Uint8List> value;
const UserMetadataEntityCompanion({
this.userId = const Value.absent(),
this.key = const Value.absent(),
@@ -2629,14 +2632,14 @@ class UserMetadataEntityCompanion
UserMetadataEntityCompanion.insert({
required String userId,
required int key,
required Uint8List value,
required i2.Uint8List value,
}) : userId = Value(userId),
key = Value(key),
value = Value(value);
static Insertable<UserMetadataEntityData> custom({
Expression<String>? userId,
Expression<int>? key,
Expression<Uint8List>? value,
Expression<i2.Uint8List>? value,
}) {
return RawValuesInsertable({
if (userId != null) 'user_id': userId,
@@ -2648,7 +2651,7 @@ class UserMetadataEntityCompanion
UserMetadataEntityCompanion copyWith({
Value<String>? userId,
Value<int>? key,
Value<Uint8List>? value,
Value<i2.Uint8List>? value,
}) {
return UserMetadataEntityCompanion(
userId: userId ?? this.userId,
@@ -2667,7 +2670,7 @@ class UserMetadataEntityCompanion
map['key'] = Variable<int>(key.value);
}
if (value.present) {
map['value'] = Variable<Uint8List>(value.value);
map['value'] = Variable<i2.Uint8List>(value.value);
}
return map;
}

View File

@@ -1,6 +1,8 @@
// dart format width=80
// GENERATED CODE, DO NOT EDIT BY HAND.
// ignore_for_file: type=lint
import 'dart:typed_data' as i2;
// GENERATED BY drift_dev, DO NOT MODIFY.
// ignore_for_file: type=lint,unused_import
//
import 'package:drift/drift.dart';
class UserEntity extends Table with TableInfo<UserEntity, UserEntityData> {
@@ -2453,13 +2455,14 @@ class UserMetadataEntity extends Table
type: DriftSqlType.int,
requiredDuringInsert: true,
);
late final GeneratedColumn<Uint8List> value = GeneratedColumn<Uint8List>(
'value',
aliasedName,
false,
type: DriftSqlType.blob,
requiredDuringInsert: true,
);
late final GeneratedColumn<i2.Uint8List> value =
GeneratedColumn<i2.Uint8List>(
'value',
aliasedName,
false,
type: DriftSqlType.blob,
requiredDuringInsert: true,
);
@override
List<GeneratedColumn> get $columns => [userId, key, value];
@override
@@ -2503,7 +2506,7 @@ class UserMetadataEntityData extends DataClass
implements Insertable<UserMetadataEntityData> {
final String userId;
final int key;
final Uint8List value;
final i2.Uint8List value;
const UserMetadataEntityData({
required this.userId,
required this.key,
@@ -2514,7 +2517,7 @@ class UserMetadataEntityData extends DataClass
final map = <String, Expression>{};
map['user_id'] = Variable<String>(userId);
map['key'] = Variable<int>(key);
map['value'] = Variable<Uint8List>(value);
map['value'] = Variable<i2.Uint8List>(value);
return map;
}
@@ -2526,7 +2529,7 @@ class UserMetadataEntityData extends DataClass
return UserMetadataEntityData(
userId: serializer.fromJson<String>(json['userId']),
key: serializer.fromJson<int>(json['key']),
value: serializer.fromJson<Uint8List>(json['value']),
value: serializer.fromJson<i2.Uint8List>(json['value']),
);
}
@override
@@ -2535,14 +2538,14 @@ class UserMetadataEntityData extends DataClass
return <String, dynamic>{
'userId': serializer.toJson<String>(userId),
'key': serializer.toJson<int>(key),
'value': serializer.toJson<Uint8List>(value),
'value': serializer.toJson<i2.Uint8List>(value),
};
}
UserMetadataEntityData copyWith({
String? userId,
int? key,
Uint8List? value,
i2.Uint8List? value,
}) => UserMetadataEntityData(
userId: userId ?? this.userId,
key: key ?? this.key,
@@ -2581,7 +2584,7 @@ class UserMetadataEntityCompanion
extends UpdateCompanion<UserMetadataEntityData> {
final Value<String> userId;
final Value<int> key;
final Value<Uint8List> value;
final Value<i2.Uint8List> value;
const UserMetadataEntityCompanion({
this.userId = const Value.absent(),
this.key = const Value.absent(),
@@ -2590,14 +2593,14 @@ class UserMetadataEntityCompanion
UserMetadataEntityCompanion.insert({
required String userId,
required int key,
required Uint8List value,
required i2.Uint8List value,
}) : userId = Value(userId),
key = Value(key),
value = Value(value);
static Insertable<UserMetadataEntityData> custom({
Expression<String>? userId,
Expression<int>? key,
Expression<Uint8List>? value,
Expression<i2.Uint8List>? value,
}) {
return RawValuesInsertable({
if (userId != null) 'user_id': userId,
@@ -2609,7 +2612,7 @@ class UserMetadataEntityCompanion
UserMetadataEntityCompanion copyWith({
Value<String>? userId,
Value<int>? key,
Value<Uint8List>? value,
Value<i2.Uint8List>? value,
}) {
return UserMetadataEntityCompanion(
userId: userId ?? this.userId,
@@ -2628,7 +2631,7 @@ class UserMetadataEntityCompanion
map['key'] = Variable<int>(key.value);
}
if (value.present) {
map['value'] = Variable<Uint8List>(value.value);
map['value'] = Variable<i2.Uint8List>(value.value);
}
return map;
}

View File

@@ -1,6 +1,8 @@
// dart format width=80
// GENERATED CODE, DO NOT EDIT BY HAND.
// ignore_for_file: type=lint
import 'dart:typed_data' as i2;
// GENERATED BY drift_dev, DO NOT MODIFY.
// ignore_for_file: type=lint,unused_import
//
import 'package:drift/drift.dart';
class UserEntity extends Table with TableInfo<UserEntity, UserEntityData> {
@@ -2489,13 +2491,14 @@ class UserMetadataEntity extends Table
type: DriftSqlType.int,
requiredDuringInsert: true,
);
late final GeneratedColumn<Uint8List> value = GeneratedColumn<Uint8List>(
'value',
aliasedName,
false,
type: DriftSqlType.blob,
requiredDuringInsert: true,
);
late final GeneratedColumn<i2.Uint8List> value =
GeneratedColumn<i2.Uint8List>(
'value',
aliasedName,
false,
type: DriftSqlType.blob,
requiredDuringInsert: true,
);
@override
List<GeneratedColumn> get $columns => [userId, key, value];
@override
@@ -2539,7 +2542,7 @@ class UserMetadataEntityData extends DataClass
implements Insertable<UserMetadataEntityData> {
final String userId;
final int key;
final Uint8List value;
final i2.Uint8List value;
const UserMetadataEntityData({
required this.userId,
required this.key,
@@ -2550,7 +2553,7 @@ class UserMetadataEntityData extends DataClass
final map = <String, Expression>{};
map['user_id'] = Variable<String>(userId);
map['key'] = Variable<int>(key);
map['value'] = Variable<Uint8List>(value);
map['value'] = Variable<i2.Uint8List>(value);
return map;
}
@@ -2562,7 +2565,7 @@ class UserMetadataEntityData extends DataClass
return UserMetadataEntityData(
userId: serializer.fromJson<String>(json['userId']),
key: serializer.fromJson<int>(json['key']),
value: serializer.fromJson<Uint8List>(json['value']),
value: serializer.fromJson<i2.Uint8List>(json['value']),
);
}
@override
@@ -2571,14 +2574,14 @@ class UserMetadataEntityData extends DataClass
return <String, dynamic>{
'userId': serializer.toJson<String>(userId),
'key': serializer.toJson<int>(key),
'value': serializer.toJson<Uint8List>(value),
'value': serializer.toJson<i2.Uint8List>(value),
};
}
UserMetadataEntityData copyWith({
String? userId,
int? key,
Uint8List? value,
i2.Uint8List? value,
}) => UserMetadataEntityData(
userId: userId ?? this.userId,
key: key ?? this.key,
@@ -2617,7 +2620,7 @@ class UserMetadataEntityCompanion
extends UpdateCompanion<UserMetadataEntityData> {
final Value<String> userId;
final Value<int> key;
final Value<Uint8List> value;
final Value<i2.Uint8List> value;
const UserMetadataEntityCompanion({
this.userId = const Value.absent(),
this.key = const Value.absent(),
@@ -2626,14 +2629,14 @@ class UserMetadataEntityCompanion
UserMetadataEntityCompanion.insert({
required String userId,
required int key,
required Uint8List value,
required i2.Uint8List value,
}) : userId = Value(userId),
key = Value(key),
value = Value(value);
static Insertable<UserMetadataEntityData> custom({
Expression<String>? userId,
Expression<int>? key,
Expression<Uint8List>? value,
Expression<i2.Uint8List>? value,
}) {
return RawValuesInsertable({
if (userId != null) 'user_id': userId,
@@ -2645,7 +2648,7 @@ class UserMetadataEntityCompanion
UserMetadataEntityCompanion copyWith({
Value<String>? userId,
Value<int>? key,
Value<Uint8List>? value,
Value<i2.Uint8List>? value,
}) {
return UserMetadataEntityCompanion(
userId: userId ?? this.userId,
@@ -2664,7 +2667,7 @@ class UserMetadataEntityCompanion
map['key'] = Variable<int>(key.value);
}
if (value.present) {
map['value'] = Variable<Uint8List>(value.value);
map['value'] = Variable<i2.Uint8List>(value.value);
}
return map;
}

View File

@@ -1,6 +1,8 @@
// dart format width=80
// GENERATED CODE, DO NOT EDIT BY HAND.
// ignore_for_file: type=lint
import 'dart:typed_data' as i2;
// GENERATED BY drift_dev, DO NOT MODIFY.
// ignore_for_file: type=lint,unused_import
//
import 'package:drift/drift.dart';
class UserEntity extends Table with TableInfo<UserEntity, UserEntityData> {
@@ -2489,13 +2491,14 @@ class UserMetadataEntity extends Table
type: DriftSqlType.int,
requiredDuringInsert: true,
);
late final GeneratedColumn<Uint8List> value = GeneratedColumn<Uint8List>(
'value',
aliasedName,
false,
type: DriftSqlType.blob,
requiredDuringInsert: true,
);
late final GeneratedColumn<i2.Uint8List> value =
GeneratedColumn<i2.Uint8List>(
'value',
aliasedName,
false,
type: DriftSqlType.blob,
requiredDuringInsert: true,
);
@override
List<GeneratedColumn> get $columns => [userId, key, value];
@override
@@ -2539,7 +2542,7 @@ class UserMetadataEntityData extends DataClass
implements Insertable<UserMetadataEntityData> {
final String userId;
final int key;
final Uint8List value;
final i2.Uint8List value;
const UserMetadataEntityData({
required this.userId,
required this.key,
@@ -2550,7 +2553,7 @@ class UserMetadataEntityData extends DataClass
final map = <String, Expression>{};
map['user_id'] = Variable<String>(userId);
map['key'] = Variable<int>(key);
map['value'] = Variable<Uint8List>(value);
map['value'] = Variable<i2.Uint8List>(value);
return map;
}
@@ -2562,7 +2565,7 @@ class UserMetadataEntityData extends DataClass
return UserMetadataEntityData(
userId: serializer.fromJson<String>(json['userId']),
key: serializer.fromJson<int>(json['key']),
value: serializer.fromJson<Uint8List>(json['value']),
value: serializer.fromJson<i2.Uint8List>(json['value']),
);
}
@override
@@ -2571,14 +2574,14 @@ class UserMetadataEntityData extends DataClass
return <String, dynamic>{
'userId': serializer.toJson<String>(userId),
'key': serializer.toJson<int>(key),
'value': serializer.toJson<Uint8List>(value),
'value': serializer.toJson<i2.Uint8List>(value),
};
}
UserMetadataEntityData copyWith({
String? userId,
int? key,
Uint8List? value,
i2.Uint8List? value,
}) => UserMetadataEntityData(
userId: userId ?? this.userId,
key: key ?? this.key,
@@ -2617,7 +2620,7 @@ class UserMetadataEntityCompanion
extends UpdateCompanion<UserMetadataEntityData> {
final Value<String> userId;
final Value<int> key;
final Value<Uint8List> value;
final Value<i2.Uint8List> value;
const UserMetadataEntityCompanion({
this.userId = const Value.absent(),
this.key = const Value.absent(),
@@ -2626,14 +2629,14 @@ class UserMetadataEntityCompanion
UserMetadataEntityCompanion.insert({
required String userId,
required int key,
required Uint8List value,
required i2.Uint8List value,
}) : userId = Value(userId),
key = Value(key),
value = Value(value);
static Insertable<UserMetadataEntityData> custom({
Expression<String>? userId,
Expression<int>? key,
Expression<Uint8List>? value,
Expression<i2.Uint8List>? value,
}) {
return RawValuesInsertable({
if (userId != null) 'user_id': userId,
@@ -2645,7 +2648,7 @@ class UserMetadataEntityCompanion
UserMetadataEntityCompanion copyWith({
Value<String>? userId,
Value<int>? key,
Value<Uint8List>? value,
Value<i2.Uint8List>? value,
}) {
return UserMetadataEntityCompanion(
userId: userId ?? this.userId,
@@ -2664,7 +2667,7 @@ class UserMetadataEntityCompanion
map['key'] = Variable<int>(key.value);
}
if (value.present) {
map['value'] = Variable<Uint8List>(value.value);
map['value'] = Variable<i2.Uint8List>(value.value);
}
return map;
}

View File

@@ -1,6 +1,8 @@
// dart format width=80
// GENERATED CODE, DO NOT EDIT BY HAND.
// ignore_for_file: type=lint
import 'dart:typed_data' as i2;
// GENERATED BY drift_dev, DO NOT MODIFY.
// ignore_for_file: type=lint,unused_import
//
import 'package:drift/drift.dart';
class UserEntity extends Table with TableInfo<UserEntity, UserEntityData> {
@@ -2489,13 +2491,14 @@ class UserMetadataEntity extends Table
type: DriftSqlType.int,
requiredDuringInsert: true,
);
late final GeneratedColumn<Uint8List> value = GeneratedColumn<Uint8List>(
'value',
aliasedName,
false,
type: DriftSqlType.blob,
requiredDuringInsert: true,
);
late final GeneratedColumn<i2.Uint8List> value =
GeneratedColumn<i2.Uint8List>(
'value',
aliasedName,
false,
type: DriftSqlType.blob,
requiredDuringInsert: true,
);
@override
List<GeneratedColumn> get $columns => [userId, key, value];
@override
@@ -2539,7 +2542,7 @@ class UserMetadataEntityData extends DataClass
implements Insertable<UserMetadataEntityData> {
final String userId;
final int key;
final Uint8List value;
final i2.Uint8List value;
const UserMetadataEntityData({
required this.userId,
required this.key,
@@ -2550,7 +2553,7 @@ class UserMetadataEntityData extends DataClass
final map = <String, Expression>{};
map['user_id'] = Variable<String>(userId);
map['key'] = Variable<int>(key);
map['value'] = Variable<Uint8List>(value);
map['value'] = Variable<i2.Uint8List>(value);
return map;
}
@@ -2562,7 +2565,7 @@ class UserMetadataEntityData extends DataClass
return UserMetadataEntityData(
userId: serializer.fromJson<String>(json['userId']),
key: serializer.fromJson<int>(json['key']),
value: serializer.fromJson<Uint8List>(json['value']),
value: serializer.fromJson<i2.Uint8List>(json['value']),
);
}
@override
@@ -2571,14 +2574,14 @@ class UserMetadataEntityData extends DataClass
return <String, dynamic>{
'userId': serializer.toJson<String>(userId),
'key': serializer.toJson<int>(key),
'value': serializer.toJson<Uint8List>(value),
'value': serializer.toJson<i2.Uint8List>(value),
};
}
UserMetadataEntityData copyWith({
String? userId,
int? key,
Uint8List? value,
i2.Uint8List? value,
}) => UserMetadataEntityData(
userId: userId ?? this.userId,
key: key ?? this.key,
@@ -2617,7 +2620,7 @@ class UserMetadataEntityCompanion
extends UpdateCompanion<UserMetadataEntityData> {
final Value<String> userId;
final Value<int> key;
final Value<Uint8List> value;
final Value<i2.Uint8List> value;
const UserMetadataEntityCompanion({
this.userId = const Value.absent(),
this.key = const Value.absent(),
@@ -2626,14 +2629,14 @@ class UserMetadataEntityCompanion
UserMetadataEntityCompanion.insert({
required String userId,
required int key,
required Uint8List value,
required i2.Uint8List value,
}) : userId = Value(userId),
key = Value(key),
value = Value(value);
static Insertable<UserMetadataEntityData> custom({
Expression<String>? userId,
Expression<int>? key,
Expression<Uint8List>? value,
Expression<i2.Uint8List>? value,
}) {
return RawValuesInsertable({
if (userId != null) 'user_id': userId,
@@ -2645,7 +2648,7 @@ class UserMetadataEntityCompanion
UserMetadataEntityCompanion copyWith({
Value<String>? userId,
Value<int>? key,
Value<Uint8List>? value,
Value<i2.Uint8List>? value,
}) {
return UserMetadataEntityCompanion(
userId: userId ?? this.userId,
@@ -2664,7 +2667,7 @@ class UserMetadataEntityCompanion
map['key'] = Variable<int>(key.value);
}
if (value.present) {
map['value'] = Variable<Uint8List>(value.value);
map['value'] = Variable<i2.Uint8List>(value.value);
}
return map;
}

Some files were not shown because too many files have changed in this diff Show More