diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 18c8c8147..ee6841a1b 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -26,7 +26,7 @@ jobs:
- uses: subosito/flutter-action@v1
with:
channel: 'stable'
- flutter-version: '2.8.1'
+ flutter-version: '3.0.0'
# Fetch sub modules
- run: git submodule update --init --recursive
diff --git a/README.md b/README.md
index 17f2bd4cb..98717f783 100644
--- a/README.md
+++ b/README.md
@@ -26,12 +26,15 @@ This repository contains the code for our mobile apps, built with a lot of ❤
### Android
-This repository's GitHub releases contains APKs, built straight from source. The latest build is available @ [ente.io/apk](https://ente.io/apk). These builds keep themselves updated, without relying on third party stores.
+This [repository's GitHub releases](https://github.com/ente-io/frame/releases) contains APKs, built straight from source. The latest build is available @ [ente.io/apk](https://ente.io/apk). These builds keep themselves updated, without relying on third party stores.
-You can alternatively install the build from PlayStore.
+You can alternatively install the build from PlayStore or F-Droid.
-
+
+
+
+
diff --git a/android/app/build.gradle b/android/app/build.gradle
index a6962bdca..9a9942287 100644
--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -32,7 +32,7 @@ if (keystorePropertiesFile.exists()) {
}
android {
- compileSdkVersion 31
+ compileSdkVersion 32
sourceSets {
main.java.srcDirs += 'src/main/kotlin'
diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index 6688d9564..71c9521bd 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -1,10 +1,5 @@
-
-
+
diff --git a/ios/Podfile b/ios/Podfile
index d117dfed3..856a1111a 100644
--- a/ios/Podfile
+++ b/ios/Podfile
@@ -1,5 +1,5 @@
# Uncomment this line to define a global platform for your project
-# platform :ios, '9.0'
+platform :ios, '12.0'
# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
ENV['COCOAPODS_DISABLE_STATS'] = 'true'
diff --git a/ios/Podfile.lock b/ios/Podfile.lock
index d54be2c27..bc0c5d624 100644
--- a/ios/Podfile.lock
+++ b/ios/Podfile.lock
@@ -1,49 +1,52 @@
PODS:
- - background_fetch (1.0.1):
+ - background_fetch (1.1.0):
- Flutter
- better_player (0.0.1):
+ - Cache (~> 6.0.0)
- Flutter
- - KTVHTTPCache (~> 2.0.0)
- - CocoaAsyncSocket (7.6.5)
+ - GCDWebServer
+ - HLSCachingReverseProxyServer
+ - PINCache
+ - Cache (6.0.0)
- connectivity (0.0.1):
- Flutter
- Reachability
- device_info (0.0.1):
- Flutter
- - Firebase/CoreOnly (8.9.0):
- - FirebaseCore (= 8.9.0)
- - Firebase/Messaging (8.9.0):
+ - Firebase/CoreOnly (8.15.0):
+ - FirebaseCore (= 8.15.0)
+ - Firebase/Messaging (8.15.0):
- Firebase/CoreOnly
- - FirebaseMessaging (~> 8.9.0)
- - firebase_core (1.10.0):
- - Firebase/CoreOnly (= 8.9.0)
+ - FirebaseMessaging (~> 8.15.0)
+ - firebase_core (1.17.1):
+ - Firebase/CoreOnly (= 8.15.0)
- Flutter
- - firebase_messaging (11.1.0):
- - Firebase/Messaging (= 8.9.0)
+ - firebase_messaging (11.4.1):
+ - Firebase/Messaging (= 8.15.0)
- firebase_core
- Flutter
- - FirebaseCore (8.9.0):
+ - FirebaseCore (8.15.0):
- FirebaseCoreDiagnostics (~> 8.0)
- - GoogleUtilities/Environment (~> 7.6)
- - GoogleUtilities/Logger (~> 7.6)
- - FirebaseCoreDiagnostics (8.12.0):
+ - GoogleUtilities/Environment (~> 7.7)
+ - GoogleUtilities/Logger (~> 7.7)
+ - FirebaseCoreDiagnostics (8.15.0):
- GoogleDataTransport (~> 9.1)
- GoogleUtilities/Environment (~> 7.7)
- GoogleUtilities/Logger (~> 7.7)
- nanopb (~> 2.30908.0)
- - FirebaseInstallations (8.12.0):
+ - FirebaseInstallations (8.15.0):
- FirebaseCore (~> 8.0)
- GoogleUtilities/Environment (~> 7.7)
- GoogleUtilities/UserDefaults (~> 7.7)
- PromisesObjC (< 3.0, >= 1.2)
- - FirebaseMessaging (8.9.0):
+ - FirebaseMessaging (8.15.0):
- FirebaseCore (~> 8.0)
- FirebaseInstallations (~> 8.0)
- GoogleDataTransport (~> 9.1)
- - GoogleUtilities/AppDelegateSwizzler (~> 7.6)
- - GoogleUtilities/Environment (~> 7.6)
- - GoogleUtilities/Reachability (~> 7.6)
- - GoogleUtilities/UserDefaults (~> 7.6)
+ - GoogleUtilities/AppDelegateSwizzler (~> 7.7)
+ - GoogleUtilities/Environment (~> 7.7)
+ - GoogleUtilities/Reachability (~> 7.7)
+ - GoogleUtilities/UserDefaults (~> 7.7)
- nanopb (~> 2.30908.0)
- fk_user_agent (2.0.0):
- Flutter
@@ -70,7 +73,7 @@ PODS:
- Flutter
- flutter_sodium (0.0.1):
- Flutter
- - fluttercontactpicker (4.4.0):
+ - fluttercontactpicker (4.6.0):
- Flutter
- fluttertoast (0.0.2):
- Flutter
@@ -78,9 +81,12 @@ PODS:
- FMDB (2.7.5):
- FMDB/standard (= 2.7.5)
- FMDB/standard (2.7.5)
- - GoogleDataTransport (9.1.2):
- - GoogleUtilities/Environment (~> 7.2)
- - nanopb (~> 2.30908.0)
+ - GCDWebServer (3.5.4):
+ - GCDWebServer/Core (= 3.5.4)
+ - GCDWebServer/Core (3.5.4)
+ - GoogleDataTransport (9.1.4):
+ - GoogleUtilities/Environment (~> 7.7)
+ - nanopb (< 2.30910.0, >= 2.30908.0)
- PromisesObjC (< 3.0, >= 1.2)
- GoogleUtilities/AppDelegateSwizzler (7.7.0):
- GoogleUtilities/Environment
@@ -99,14 +105,13 @@ PODS:
- GoogleUtilities/Logger
- GoogleUtilities/UserDefaults (7.7.0):
- GoogleUtilities/Logger
+ - HLSCachingReverseProxyServer (0.1.0):
+ - GCDWebServer (~> 3.5)
+ - PINCache (>= 3.0.1-beta.3)
- image_editor (0.0.1):
- Flutter
- in_app_purchase (0.0.1):
- Flutter
- - KTVCocoaHTTPServer (1.0.0):
- - CocoaAsyncSocket
- - KTVHTTPCache (2.0.1):
- - KTVCocoaHTTPServer
- libwebp (1.2.1):
- libwebp/demux (= 1.2.1)
- libwebp/mux (= 1.2.1)
@@ -118,9 +123,9 @@ PODS:
- libwebp/webp (1.2.1)
- local_auth (0.0.1):
- Flutter
- - Mantle (2.1.6):
- - Mantle/extobjc (= 2.1.6)
- - Mantle/extobjc (2.1.6)
+ - Mantle (2.2.0):
+ - Mantle/extobjc (= 2.2.0)
+ - Mantle/extobjc (2.2.0)
- motionphoto (0.0.1):
- Flutter
- move_to_background (0.0.1):
@@ -135,37 +140,45 @@ PODS:
- OrderedSet (5.0.0)
- package_info_plus (0.4.5):
- Flutter
- - path_provider (0.0.1):
+ - path_provider_ios (0.0.1):
- Flutter
- "permission_handler (5.1.0+2)":
- Flutter
- - photo_manager (1.0.0):
+ - photo_manager (2.0.0):
- Flutter
- FlutterMacOS
- - PromisesObjC (2.0.0)
+ - PINCache (3.0.3):
+ - PINCache/Arc-exception-safe (= 3.0.3)
+ - PINCache/Core (= 3.0.3)
+ - PINCache/Arc-exception-safe (3.0.3):
+ - PINCache/Core
+ - PINCache/Core (3.0.3):
+ - PINOperation (~> 1.2.1)
+ - PINOperation (1.2.1)
+ - PromisesObjC (2.1.0)
- Reachability (3.2)
- receive_sharing_intent (0.0.1):
- Flutter
- - SDWebImage (5.12.1):
- - SDWebImage/Core (= 5.12.1)
- - SDWebImage/Core (5.12.1)
+ - SDWebImage (5.12.5):
+ - SDWebImage/Core (= 5.12.5)
+ - SDWebImage/Core (5.12.5)
- SDWebImageWebPCoder (0.8.4):
- libwebp (~> 1.0)
- SDWebImage/Core (~> 5.10)
- sensors (0.0.1):
- Flutter
- - Sentry (7.1.4):
- - Sentry/Core (= 7.1.4)
- - Sentry/Core (7.1.4)
+ - Sentry (7.11.0):
+ - Sentry/Core (= 7.11.0)
+ - Sentry/Core (7.11.0)
- sentry_flutter (0.0.1):
- Flutter
- FlutterMacOS
- - Sentry (~> 7.1.3)
+ - Sentry (~> 7.11.0)
- share (0.0.1):
- Flutter
- share_plus (0.0.1):
- Flutter
- - shared_preferences (0.0.1):
+ - shared_preferences_ios (0.0.1):
- Flutter
- sqflite (0.0.2):
- Flutter
@@ -173,7 +186,7 @@ PODS:
- Toast (4.0.0)
- uni_links (0.0.1):
- Flutter
- - url_launcher (0.0.1):
+ - url_launcher_ios (0.0.1):
- Flutter
- video_player (0.0.1):
- Flutter
@@ -208,7 +221,7 @@ DEPENDENCIES:
- move_to_background (from `.symlinks/plugins/move_to_background/ios`)
- open_file (from `.symlinks/plugins/open_file/ios`)
- package_info_plus (from `.symlinks/plugins/package_info_plus/ios`)
- - path_provider (from `.symlinks/plugins/path_provider/ios`)
+ - path_provider_ios (from `.symlinks/plugins/path_provider_ios/ios`)
- permission_handler (from `.symlinks/plugins/permission_handler/ios`)
- photo_manager (from `.symlinks/plugins/photo_manager/ios`)
- receive_sharing_intent (from `.symlinks/plugins/receive_sharing_intent/ios`)
@@ -216,31 +229,33 @@ DEPENDENCIES:
- sentry_flutter (from `.symlinks/plugins/sentry_flutter/ios`)
- share (from `.symlinks/plugins/share/ios`)
- share_plus (from `.symlinks/plugins/share_plus/ios`)
- - shared_preferences (from `.symlinks/plugins/shared_preferences/ios`)
+ - shared_preferences_ios (from `.symlinks/plugins/shared_preferences_ios/ios`)
- sqflite (from `.symlinks/plugins/sqflite/ios`)
- uni_links (from `.symlinks/plugins/uni_links/ios`)
- - url_launcher (from `.symlinks/plugins/url_launcher/ios`)
+ - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`)
- video_player (from `.symlinks/plugins/video_player/ios`)
- video_thumbnail (from `.symlinks/plugins/video_thumbnail/ios`)
- wakelock (from `.symlinks/plugins/wakelock/ios`)
SPEC REPOS:
trunk:
- - CocoaAsyncSocket
+ - Cache
- Firebase
- FirebaseCore
- FirebaseCoreDiagnostics
- FirebaseInstallations
- FirebaseMessaging
- FMDB
+ - GCDWebServer
- GoogleDataTransport
- GoogleUtilities
- - KTVCocoaHTTPServer
- - KTVHTTPCache
+ - HLSCachingReverseProxyServer
- libwebp
- Mantle
- nanopb
- OrderedSet
+ - PINCache
+ - PINOperation
- PromisesObjC
- Reachability
- SDWebImage
@@ -297,8 +312,8 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/open_file/ios"
package_info_plus:
:path: ".symlinks/plugins/package_info_plus/ios"
- path_provider:
- :path: ".symlinks/plugins/path_provider/ios"
+ path_provider_ios:
+ :path: ".symlinks/plugins/path_provider_ios/ios"
permission_handler:
:path: ".symlinks/plugins/permission_handler/ios"
photo_manager:
@@ -313,14 +328,14 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/share/ios"
share_plus:
:path: ".symlinks/plugins/share_plus/ios"
- shared_preferences:
- :path: ".symlinks/plugins/shared_preferences/ios"
+ shared_preferences_ios:
+ :path: ".symlinks/plugins/shared_preferences_ios/ios"
sqflite:
:path: ".symlinks/plugins/sqflite/ios"
uni_links:
:path: ".symlinks/plugins/uni_links/ios"
- url_launcher:
- :path: ".symlinks/plugins/url_launcher/ios"
+ url_launcher_ios:
+ :path: ".symlinks/plugins/url_launcher_ios/ios"
video_player:
:path: ".symlinks/plugins/video_player/ios"
video_thumbnail:
@@ -329,18 +344,18 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/wakelock/ios"
SPEC CHECKSUMS:
- background_fetch: 2edffc19a5a465c47f073efa35db57f7910738fa
- better_player: a4383402f457e53720525888c0fc5d337ef6ba11
- CocoaAsyncSocket: 065fd1e645c7abab64f7a6a2007a48038fdc6a99
+ background_fetch: 3795af8a49054dc526477cc2f60d2ed41de60587
+ better_player: 2406bfe8175203c7a46fa15f9d778d73b12e1646
+ Cache: 4ca7e00363fca5455f26534e5607634c820ffc2d
connectivity: c4130b2985d4ef6fd26f9702e886bd5260681467
device_info: d7d233b645a32c40dfdc212de5cf646ca482f175
- Firebase: 13d8d96499e2635428d5bf0ec675df21f95d9a95
- firebase_core: f770e033e790657b3505f04be4cb24c482912f11
- firebase_messaging: 0c8d1a1732487db7f332fb65232053e93201e2fb
- FirebaseCore: 599ee609343eaf4941bd188f85e3aa077ffe325b
- FirebaseCoreDiagnostics: 3b40dfadef5b90433a60ae01f01e90fe87aa76aa
- FirebaseInstallations: 25764cf322e77f99449395870a65b2bef88e1545
- FirebaseMessaging: 82c4a48638f53f7b184f3cc9f6cd2cbe533ab316
+ Firebase: 5f8193dff4b5b7c5d5ef72ae54bb76c08e2b841d
+ firebase_core: 318de541b0e61d3f24262982a3f0b54afe72439b
+ firebase_messaging: 943cfe65e0b3f457240489ce67655e40da1d270c
+ FirebaseCore: 5743c5785c074a794d35f2fff7ecc254a91e08b1
+ FirebaseCoreDiagnostics: 92e07a649aeb66352b319d43bdd2ee3942af84cb
+ FirebaseInstallations: 40bd9054049b2eae9a2c38ef1c3dd213df3605cd
+ FirebaseMessaging: 5e5118a2383b3531e730d974680954c679ca0a13
fk_user_agent: 1f47ec39291e8372b1d692b50084b0d54103c545
Flutter: 50d75fe2f02b26cc09d224853bb45737f8b3214a
flutter_email_sender: 02d7443217d8c41483223627972bfdc09f74276b
@@ -350,46 +365,48 @@ SPEC CHECKSUMS:
flutter_local_notifications: 0c0b1ae97e741e1521e4c1629a459d04b9aec743
flutter_secure_storage: 7953c38a04c3fdbb00571bcd87d8e3b5ceb9daec
flutter_sodium: c84426b4de738514b5b66cfdeb8a06634e72fe0b
- fluttercontactpicker: 36cf7811f583f3c5aec3c53efcbf366b9cdfdf51
- fluttertoast: 6122fa75143e992b1d3470f61000f591a798cc58
+ fluttercontactpicker: d582836dea6b5d489f3d259f35d7817ae82ee5e6
+ fluttertoast: 16fbe6039d06a763f3533670197d01fc73459037
FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a
- GoogleDataTransport: 629c20a4d363167143f30ea78320d5a7eb8bd940
+ GCDWebServer: 2c156a56c8226e2d5c0c3f208a3621ccffbe3ce4
+ GoogleDataTransport: 5fffe35792f8b96ec8d6775f5eccd83c998d5a3b
GoogleUtilities: e0913149f6b0625b553d70dae12b49fc62914fd1
+ HLSCachingReverseProxyServer: 59935e1e0244ad7f3375d75b5ef46e8eb26ab181
image_editor: c1d038630eedea60d2dee9c14f36aa66c7f9cfab
in_app_purchase: 3e2155afa9d03d4fa32d9e62d567885080ce97d6
- KTVCocoaHTTPServer: df8d7b861e603ff8037e9b2138aca2563a6b768d
- KTVHTTPCache: 588c3eb16f6bd1e6fde1e230dabfb7bd4e490a4d
libwebp: 98a37e597e40bfdb4c911fc98f2c53d0b12d05fc
- local_auth: 25938960984c3a7f6e3253e3f8d962fdd16852bd
- Mantle: 4c0ed6ce47c96eccc4dc3bb071deb3def0e2c3be
+ local_auth: 1740f55d7af0a2e2a8684ce225fe79d8931e808c
+ Mantle: c5aa8794a29a022dfbbfc9799af95f477a69b62d
motionphoto: d4a432b8c8f22fb3ad966258597c0103c9c5ff16
move_to_background: 39a5b79b26d577b0372cbe8a8c55e7aa9fcd3a2d
nanopb: a0ba3315591a9ae0a16a309ee504766e90db0c96
open_file: 02eb5cb6b21264bd3a696876f5afbfb7ca4f4b7d
OrderedSet: aaeb196f7fef5a9edf55d89760da9176ad40b93c
package_info_plus: 6c92f08e1f853dc01228d6f553146438dafcd14e
- path_provider: abfe2b5c733d04e238b0d8691db0cfd63a27a93c
+ path_provider_ios: 14f3d2fd28c4fdb42f44e0f751d12861c43cee02
permission_handler: ccb20a9fad0ee9b1314a52b70b76b473c5f8dab0
- photo_manager: 84fa94fbeb82e607333ea9a13c43b58e0903a463
- PromisesObjC: 68159ce6952d93e17b2dfe273b8c40907db5ba58
+ photo_manager: 4f6810b7dfc4feb03b461ac1a70dacf91fba7604
+ PINCache: 7a8fc1a691173d21dbddbf86cd515de6efa55086
+ PINOperation: 00c935935f1e8cf0d1e2d6b542e75b88fc3e5e20
+ PromisesObjC: 99b6f43f9e1044bd87a95a60beff28c2c44ddb72
Reachability: 33e18b67625424e47b6cde6d202dce689ad7af96
receive_sharing_intent: c0d87310754e74c0f9542947e7cbdf3a0335a3b1
- SDWebImage: 4dc3e42d9ec0c1028b960a33ac6b637bb432207b
+ SDWebImage: 0905f1b7760fc8ac4198cae0036600d67478751e
SDWebImageWebPCoder: f93010f3f6c031e2f8fb3081ca4ee6966c539815
sensors: 84eb7a30e47a649e4172b71d6e81be614c280336
- Sentry: 1d3eb1a25f8c5333c88dd5603904a6d461cd9fcf
- sentry_flutter: f20d4f199442900fbdab2b8496f1d2091d8b94d9
+ Sentry: 0c5cd63d714187b4a39c331c1f0eb04ba7868341
+ sentry_flutter: efb3df2c203cd03aad255892a8d628a458656d14
share: 0b2c3e82132f5888bccca3351c504d0003b3b410
share_plus: 056a1e8ac890df3e33cb503afffaf1e9b4fbae68
- shared_preferences: af6bfa751691cdc24be3045c43ec037377ada40d
+ shared_preferences_ios: 548a61f8053b9b8a49ac19c1ffbc8b92c50d68ad
sqflite: 6d358c025f5b867b29ed92fc697fd34924e11904
Toast: 91b396c56ee72a5790816f40d3a94dd357abc196
uni_links: d97da20c7701486ba192624d99bffaaffcfc298a
- url_launcher: 6fef411d543ceb26efce54b05a0a40bfd74cbbef
+ url_launcher_ios: 839c58cdb4279282219f5e248c3321761ff3c4de
video_player: ecd305f42e9044793efd34846e1ce64c31ea6fcb
video_thumbnail: c4e2a3c539e247d4de13cd545344fd2d26ffafd1
wakelock: d0fc7c864128eac40eba1617cb5264d9c940b46f
-PODFILE CHECKSUM: 58fb802948678e2071d210cfc8aab09d85c8341b
+PODFILE CHECKSUM: 44d44a69efc5f474c5f17ed621cb4a9375ab0d86
COCOAPODS: 1.11.3
diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj
index 948aa0b72..bf25e4a41 100644
--- a/ios/Runner.xcodeproj/project.pbxproj
+++ b/ios/Runner.xcodeproj/project.pbxproj
@@ -256,18 +256,20 @@
);
inputPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh",
- "${BUILT_PRODUCTS_DIR}/CocoaAsyncSocket/CocoaAsyncSocket.framework",
+ "${BUILT_PRODUCTS_DIR}/Cache/Cache.framework",
"${BUILT_PRODUCTS_DIR}/FMDB/FMDB.framework",
"${BUILT_PRODUCTS_DIR}/FirebaseCore/FirebaseCore.framework",
"${BUILT_PRODUCTS_DIR}/FirebaseCoreDiagnostics/FirebaseCoreDiagnostics.framework",
"${BUILT_PRODUCTS_DIR}/FirebaseInstallations/FirebaseInstallations.framework",
"${BUILT_PRODUCTS_DIR}/FirebaseMessaging/FirebaseMessaging.framework",
+ "${BUILT_PRODUCTS_DIR}/GCDWebServer/GCDWebServer.framework",
"${BUILT_PRODUCTS_DIR}/GoogleDataTransport/GoogleDataTransport.framework",
"${BUILT_PRODUCTS_DIR}/GoogleUtilities/GoogleUtilities.framework",
- "${BUILT_PRODUCTS_DIR}/KTVCocoaHTTPServer/KTVCocoaHTTPServer.framework",
- "${BUILT_PRODUCTS_DIR}/KTVHTTPCache/KTVHTTPCache.framework",
+ "${BUILT_PRODUCTS_DIR}/HLSCachingReverseProxyServer/HLSCachingReverseProxyServer.framework",
"${BUILT_PRODUCTS_DIR}/Mantle/Mantle.framework",
"${BUILT_PRODUCTS_DIR}/OrderedSet/OrderedSet.framework",
+ "${BUILT_PRODUCTS_DIR}/PINCache/PINCache.framework",
+ "${BUILT_PRODUCTS_DIR}/PINOperation/PINOperation.framework",
"${BUILT_PRODUCTS_DIR}/PromisesObjC/FBLPromises.framework",
"${BUILT_PRODUCTS_DIR}/Reachability/Reachability.framework",
"${BUILT_PRODUCTS_DIR}/SDWebImage/SDWebImage.framework",
@@ -297,35 +299,37 @@
"${BUILT_PRODUCTS_DIR}/nanopb/nanopb.framework",
"${BUILT_PRODUCTS_DIR}/open_file/open_file.framework",
"${BUILT_PRODUCTS_DIR}/package_info_plus/package_info_plus.framework",
- "${BUILT_PRODUCTS_DIR}/path_provider/path_provider.framework",
+ "${BUILT_PRODUCTS_DIR}/path_provider_ios/path_provider_ios.framework",
"${BUILT_PRODUCTS_DIR}/photo_manager/photo_manager.framework",
"${BUILT_PRODUCTS_DIR}/receive_sharing_intent/receive_sharing_intent.framework",
"${BUILT_PRODUCTS_DIR}/sensors/sensors.framework",
"${BUILT_PRODUCTS_DIR}/sentry_flutter/sentry_flutter.framework",
"${BUILT_PRODUCTS_DIR}/share/share.framework",
"${BUILT_PRODUCTS_DIR}/share_plus/share_plus.framework",
- "${BUILT_PRODUCTS_DIR}/shared_preferences/shared_preferences.framework",
+ "${BUILT_PRODUCTS_DIR}/shared_preferences_ios/shared_preferences_ios.framework",
"${BUILT_PRODUCTS_DIR}/sqflite/sqflite.framework",
"${BUILT_PRODUCTS_DIR}/uni_links/uni_links.framework",
- "${BUILT_PRODUCTS_DIR}/url_launcher/url_launcher.framework",
+ "${BUILT_PRODUCTS_DIR}/url_launcher_ios/url_launcher_ios.framework",
"${BUILT_PRODUCTS_DIR}/video_player/video_player.framework",
"${BUILT_PRODUCTS_DIR}/video_thumbnail/video_thumbnail.framework",
"${BUILT_PRODUCTS_DIR}/wakelock/wakelock.framework",
);
name = "[CP] Embed Pods Frameworks";
outputPaths = (
- "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/CocoaAsyncSocket.framework",
+ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Cache.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FMDB.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseCore.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseCoreDiagnostics.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseInstallations.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseMessaging.framework",
+ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GCDWebServer.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GoogleDataTransport.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GoogleUtilities.framework",
- "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/KTVCocoaHTTPServer.framework",
- "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/KTVHTTPCache.framework",
+ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/HLSCachingReverseProxyServer.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Mantle.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/OrderedSet.framework",
+ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/PINCache.framework",
+ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/PINOperation.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FBLPromises.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Reachability.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SDWebImage.framework",
@@ -355,17 +359,17 @@
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/nanopb.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/open_file.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/package_info_plus.framework",
- "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/path_provider.framework",
+ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/path_provider_ios.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/photo_manager.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/receive_sharing_intent.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/sensors.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/sentry_flutter.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/share.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/share_plus.framework",
- "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/shared_preferences.framework",
+ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/shared_preferences_ios.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/sqflite.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/uni_links.framework",
- "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/url_launcher.framework",
+ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/url_launcher_ios.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/video_player.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/video_thumbnail.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/wakelock.framework",
diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist
index a9ef730e3..c03e479b7 100644
--- a/ios/Runner/Info.plist
+++ b/ios/Runner/Info.plist
@@ -77,5 +77,7 @@
UIViewControllerBasedStatusBarAppearance
+ CADisableMinimumFrameDurationOnPhone
+
diff --git a/lib/app.dart b/lib/app.dart
index 5e6f79234..c0c222dbe 100644
--- a/lib/app.dart
+++ b/lib/app.dart
@@ -96,7 +96,7 @@ final darkThemeData = ThemeData(
hintColor: Colors.grey,
bottomAppBarColor: Color.fromRGBO(196, 196, 196, 0.5),
- colorScheme: ColorScheme.dark(secondary: Color.fromARGB(255, 92, 92, 92)),
+ colorScheme: ColorScheme.dark(primary: Colors.white, secondary: Color.fromARGB(255, 92, 92, 92)),
accentColor: Color.fromRGBO(255, 255, 255, 0.6),
buttonColor: Color.fromRGBO(45, 194, 98, 1.0),
buttonTheme: ButtonThemeData().copyWith(
diff --git a/lib/core/cache/thumbnail_cache.dart b/lib/core/cache/thumbnail_cache.dart
index d658d37f5..59fbf64ca 100644
--- a/lib/core/cache/thumbnail_cache.dart
+++ b/lib/core/cache/thumbnail_cache.dart
@@ -24,4 +24,11 @@ class ThumbnailLruCache {
(size != null ? size.toString() : kThumbnailLargeSize.toString()),
imageData);
}
+
+ static void clearCache(File file) {
+ _map.remove(
+ file.generatedID.toString() + "_" + kThumbnailLargeSize.toString());
+ _map.remove(
+ file.generatedID.toString() + "_" + kThumbnailSmallSize.toString());
+ }
}
diff --git a/lib/db/files_db.dart b/lib/db/files_db.dart
index 9d3182f6f..2df2c7b90 100644
--- a/lib/db/files_db.dart
+++ b/lib/db/files_db.dart
@@ -863,10 +863,10 @@ class FilesDB {
return count;
}
- Future fileCountWithVisibility(int visibility) async {
+ Future fileCountWithVisibility(int visibility, int ownerID) async {
final db = await instance.database;
var count = Sqflite.firstIntValue(await db.rawQuery(
- 'SELECT COUNT(*) FROM $table where $columnMMdVisibility = $visibility'));
+ 'SELECT COUNT(*) FROM $table where $columnMMdVisibility = $visibility AND $columnOwnerID = $ownerID'));
return count;
}
diff --git a/lib/models/file.dart b/lib/models/file.dart
index 56d4d5a6f..fa634a922 100644
--- a/lib/models/file.dart
+++ b/lib/models/file.dart
@@ -82,7 +82,7 @@ class File {
}
}
file.modificationTime = asset.modifiedDateTime.microsecondsSinceEpoch;
- file.fileSubType = asset.subTypes;
+ file.fileSubType = asset.subtype;
file.metadataVersion = kCurrentMetadataVersion;
return file;
}
@@ -94,9 +94,9 @@ class File {
type = FileType.image;
// PHAssetMediaSubtype.photoLive.rawValue is 8
// This hack should go away once photos_manager support livePhotos
- if (asset.subTypes != null &&
- asset.subTypes > -1 &&
- (asset.subTypes & 8) != 0) {
+ if (asset.subtype != null &&
+ asset.subtype > -1 &&
+ (asset.subtype & 8) != 0) {
type = FileType.livePhoto;
}
break;
@@ -142,7 +142,7 @@ class File {
final asset = await getAsset();
// asset can be null for files shared to app
if (asset != null) {
- fileSubType = asset.subTypes;
+ fileSubType = asset.subtype;
if (fileType == FileType.video) {
duration = asset.duration;
}
diff --git a/lib/services/collections_service.dart b/lib/services/collections_service.dart
index 0e5cabda4..709d3c69c 100644
--- a/lib/services/collections_service.dart
+++ b/lib/services/collections_service.dart
@@ -776,10 +776,7 @@ class CollectionsService {
name = utf8.decode(result);
} catch (e, s) {
_logger.severe(
- "Error while decrypting collection name: " +
- collection.id.toString(),
- e,
- s);
+ "failed to decrypt collection name: ${collection.id}", e, s);
name = "Unknown Album";
}
return collection.copyWith(name: name);
diff --git a/lib/services/local_sync_service.dart b/lib/services/local_sync_service.dart
index 29b4f0ba6..53ea703ec 100644
--- a/lib/services/local_sync_service.dart
+++ b/lib/services/local_sync_service.dart
@@ -232,7 +232,8 @@ class LocalSyncService {
updatedFiles
.removeWhere((file) => downloadedFileIDs.contains(file.localID));
if (updatedFiles.isNotEmpty) {
- _logger.info(updatedFiles.length.toString() + " local files were updated.");
+ _logger.info(
+ updatedFiles.length.toString() + " local files were updated.");
}
for (final file in updatedFiles) {
await _db.updateUploadedFile(
diff --git a/lib/services/notification_service.dart b/lib/services/notification_service.dart
index 5d9e48027..7d8ea2d35 100644
--- a/lib/services/notification_service.dart
+++ b/lib/services/notification_service.dart
@@ -34,7 +34,7 @@ class NotificationService {
AndroidNotificationDetails(
'io.ente.photos',
'ente',
- 'ente alerts',
+ channelDescription: 'ente alerts',
importance: Importance.max,
priority: Priority.high,
showWhen: false,
diff --git a/lib/services/remote_sync_service.dart b/lib/services/remote_sync_service.dart
index 00d93f1ad..e6006723f 100644
--- a/lib/services/remote_sync_service.dart
+++ b/lib/services/remote_sync_service.dart
@@ -465,5 +465,16 @@ class RemoteSyncService {
return -1;
}
});
+ // move updated files towards the end
+ file.sort((first, second) {
+ if (first.updationTime == second.updationTime) {
+ return 0;
+ }
+ if (first.updationTime == -1) {
+ return 1;
+ } else {
+ return -1;
+ }
+ });
}
}
diff --git a/lib/ui/app_update_dialog.dart b/lib/ui/app_update_dialog.dart
index c019ca325..e67d31ac6 100644
--- a/lib/ui/app_update_dialog.dart
+++ b/lib/ui/app_update_dialog.dart
@@ -1,5 +1,4 @@
import 'package:flutter/material.dart';
-import 'package:flutter/widgets.dart';
import 'package:logging/logging.dart';
import 'package:open_file/open_file.dart';
import 'package:photos/core/configuration.dart';
@@ -38,7 +37,7 @@ class _AppUpdateDialogState extends State {
),
),
Padding(padding: EdgeInsets.all(8)),
- Text("changelog",
+ Text("Changelog",
style: TextStyle(
fontSize: 18,
)),
@@ -53,7 +52,7 @@ class _AppUpdateDialogState extends State {
height: 64,
padding: const EdgeInsets.fromLTRB(50, 0, 50, 0),
child: button(
- "update",
+ "Update",
fontSize: 16,
onPressed: () async {
Navigator.pop(context);
@@ -75,8 +74,8 @@ class _AppUpdateDialogState extends State {
onWillPop: () async => !shouldForceUpdate,
child: AlertDialog(
title: Text(shouldForceUpdate
- ? "critical update available"
- : "update available"),
+ ? "Critical update available"
+ : "Update available"),
content: content,
),
);
diff --git a/lib/ui/billing_questions_widget.dart b/lib/ui/billing_questions_widget.dart
index 1229338c5..5f00eade9 100644
--- a/lib/ui/billing_questions_widget.dart
+++ b/lib/ui/billing_questions_widget.dart
@@ -29,7 +29,7 @@ class BillingQuestionsWidget extends StatelessWidget {
faqs.add(Padding(
padding: const EdgeInsets.all(24),
child: Text(
- "faqs",
+ "FAQs",
style: TextStyle(
fontSize: 18,
fontWeight: FontWeight.bold,
diff --git a/lib/ui/change_email_dialog.dart b/lib/ui/change_email_dialog.dart
index 0f0599b34..093ffa12e 100644
--- a/lib/ui/change_email_dialog.dart
+++ b/lib/ui/change_email_dialog.dart
@@ -16,7 +16,7 @@ class _ChangeEmailDialogState extends State {
@override
Widget build(BuildContext context) {
return AlertDialog(
- title: Text("enter your email address"),
+ title: Text("Enter your email address"),
content: SingleChildScrollView(
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
@@ -46,7 +46,7 @@ class _ChangeEmailDialogState extends State {
actions: [
TextButton(
child: Text(
- "cancel",
+ "Cancel",
style: TextStyle(
color: Colors.redAccent,
),
@@ -57,15 +57,15 @@ class _ChangeEmailDialogState extends State {
),
TextButton(
child: Text(
- "verify",
+ "Verify",
style: TextStyle(
color: Colors.green,
),
),
onPressed: () {
if (!isValidEmail(_email)) {
- showErrorDialog(context, "invalid email address",
- "please enter a valid email address.");
+ showErrorDialog(context, "Invalid email address",
+ "Please enter a valid email address.");
return;
}
UserService.instance.getOtt(context, _email, isChangeEmail: true);
diff --git a/lib/ui/collections_gallery_widget.dart b/lib/ui/collections_gallery_widget.dart
index 59350abb7..b357c3f85 100644
--- a/lib/ui/collections_gallery_widget.dart
+++ b/lib/ui/collections_gallery_widget.dart
@@ -335,7 +335,8 @@ class _CollectionsGalleryWidgetState extends State
FutureBuilder(
future: FilesDB.instance
.fileCountWithVisibility(
- kVisibilityArchive),
+ kVisibilityArchive,
+ Configuration.instance.getUserID()),
builder: (context, snapshot) {
if (snapshot.hasData && snapshot.data > 0) {
return RichText(
diff --git a/lib/ui/common/report_bug_popup.dart b/lib/ui/common/report_bug_popup.dart
index 84236a2af..cf8c3199a 100644
--- a/lib/ui/common/report_bug_popup.dart
+++ b/lib/ui/common/report_bug_popup.dart
@@ -10,7 +10,7 @@ PopupMenuButton reportBugPopupMenu(BuildContext context) {
value: 1,
child: Row(
children: const [
- Text("contact support"),
+ Text("Contact support"),
],
),
),
@@ -19,7 +19,7 @@ PopupMenuButton reportBugPopupMenu(BuildContext context) {
},
onSelected: (value) async {
if (value == 1) {
- await sendLogs(context, "contact support", "support@ente.io",
+ await sendLogs(context, "Contact support", "support@ente.io",
postShare: () {});
}
},
diff --git a/lib/ui/common_elements.dart b/lib/ui/common_elements.dart
index 1b2e849d5..e9c019d89 100644
--- a/lib/ui/common_elements.dart
+++ b/lib/ui/common_elements.dart
@@ -6,7 +6,7 @@ Widget nothingToSeeHere({Color textColor}) {
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Text(
- "nothing to see here! 👀",
+ "Nothing to see here! 👀",
style: TextStyle(
fontFamily: "Inter",
color: textColor.withOpacity(0.35),
diff --git a/lib/ui/create_collection_page.dart b/lib/ui/create_collection_page.dart
index 4d7c00b30..535a84ab2 100644
--- a/lib/ui/create_collection_page.dart
+++ b/lib/ui/create_collection_page.dart
@@ -24,13 +24,13 @@ String _actionName(CollectionActionType type, bool plural) {
String text = "";
switch (type) {
case CollectionActionType.addFiles:
- text = "add file";
+ text = "Add file";
break;
case CollectionActionType.moveFiles:
- text = "move file";
+ text = "Move file";
break;
case CollectionActionType.restoreFiles:
- text = "restore file";
+ text = "Restore file";
break;
}
return text + titleSuffix;
@@ -77,9 +77,16 @@ class _CreateCollectionPageState extends State {
child: Padding(
padding: const EdgeInsets.only(
top: 30, bottom: 12, left: 40, right: 40),
- child: OutlineButton.icon(
- padding: EdgeInsets.all(20),
- icon: Icon(Icons.create_new_folder_outlined),
+ child: OutlinedButton.icon(
+ style: ButtonStyle(
+ padding: MaterialStateProperty.all(
+ EdgeInsets.all(20),
+ ),
+ ),
+ icon: Icon(
+ Icons.create_new_folder_outlined,
+ color: Theme.of(context).buttonColor,
+ ),
label: Text(
"to a new album",
style: Theme.of(context).textTheme.bodyText1,
@@ -280,7 +287,7 @@ class _CreateCollectionPageState extends State {
return true;
} on AssertionError catch (e, s) {
await dialog.hide();
- showErrorDialog(context, "oops", e.message);
+ showErrorDialog(context, "Oops", e.message);
return false;
} catch (e, s) {
_logger.severe("Could not move to album", e, s);
@@ -291,7 +298,7 @@ class _CreateCollectionPageState extends State {
}
Future _restoreFilesToCollection(int toCollectionID) async {
- final dialog = createProgressDialog(context, "restoring files...");
+ final dialog = createProgressDialog(context, "Restoring files...");
await dialog.show();
try {
await CollectionsService.instance
@@ -302,7 +309,7 @@ class _CreateCollectionPageState extends State {
return true;
} on AssertionError catch (e, s) {
await dialog.hide();
- showErrorDialog(context, "oops", e.message);
+ showErrorDialog(context, "Oops", e.message);
return false;
} catch (e, s) {
_logger.severe("Could not move to album", e, s);
diff --git a/lib/ui/detail_page.dart b/lib/ui/detail_page.dart
index aaa4956e6..ac82f60dd 100644
--- a/lib/ui/detail_page.dart
+++ b/lib/ui/detail_page.dart
@@ -270,10 +270,10 @@ class _DetailPageState extends State {
_logger.severe("Attempt to edit unowned file", UnauthorizedEditError(),
StackTrace.current);
showErrorDialog(context, "Sorry",
- "we don't support editing photos and albums that you don't own yet");
+ "We don't support editing photos and albums that you don't own yet");
return;
}
- final dialog = createProgressDialog(context, "please wait...");
+ final dialog = createProgressDialog(context, "Please wait...");
await dialog.show();
final imageProvider =
ExtendedFileImageProvider(await getFile(file), cacheRawData: true);
diff --git a/lib/ui/email_entry_page.dart b/lib/ui/email_entry_page.dart
index 64eff34ee..014413bd9 100644
--- a/lib/ui/email_entry_page.dart
+++ b/lib/ui/email_entry_page.dart
@@ -557,7 +557,7 @@ class _EmailEntryPageState extends State {
Navigator.of(context).push(
MaterialPageRoute(
builder: (BuildContext context) {
- return WebPage("terms", "https://ente.io/terms");
+ return WebPage("Terms", "https://ente.io/terms");
},
),
);
@@ -575,7 +575,7 @@ class _EmailEntryPageState extends State {
MaterialPageRoute(
builder: (BuildContext context) {
return WebPage(
- "privacy", "https://ente.io/privacy");
+ "Privacy", "https://ente.io/privacy");
},
),
);
@@ -709,7 +709,7 @@ class PricingWidget extends StatelessWidget {
if (snapshot.hasData) {
return _buildPlans(context, snapshot.data);
} else if (snapshot.hasError) {
- return Text("Oops, something went wrong.");
+ return Text("Oops, Something went wrong.");
}
return loadWidget;
},
diff --git a/lib/ui/fading_bottom_bar.dart b/lib/ui/fading_bottom_bar.dart
index 4b15cb467..414414a5e 100644
--- a/lib/ui/fading_bottom_bar.dart
+++ b/lib/ui/fading_bottom_bar.dart
@@ -62,7 +62,7 @@ class FadingBottomBarState extends State {
List children = [];
children.add(
Tooltip(
- message: "info",
+ message: "Info",
child: Padding(
padding: const EdgeInsets.only(top: 12, bottom: 12),
child: IconButton(
@@ -85,7 +85,7 @@ class FadingBottomBarState extends State {
widget.file.fileType == FileType.livePhoto) {
children.add(
Tooltip(
- message: "edit",
+ message: "Edit",
child: Padding(
padding: const EdgeInsets.only(top: 12, bottom: 12),
child: IconButton(
@@ -107,7 +107,7 @@ class FadingBottomBarState extends State {
widget.file.magicMetadata.visibility == kVisibilityArchive;
children.add(
Tooltip(
- message: isArchived ? "unarchive" : "archive",
+ message: isArchived ? "Unhide" : "Hide",
child: Padding(
padding: const EdgeInsets.only(top: 12, bottom: 12),
child: IconButton(
@@ -132,7 +132,7 @@ class FadingBottomBarState extends State {
}
children.add(
Tooltip(
- message: "share",
+ message: "Share",
child: Padding(
padding: const EdgeInsets.only(top: 12, bottom: 12),
child: IconButton(
@@ -181,7 +181,7 @@ class FadingBottomBarState extends State {
void _addTrashOptions(List children) {
children.add(
Tooltip(
- message: "restore",
+ message: "Restore",
child: Padding(
padding: const EdgeInsets.only(top: 12, bottom: 12),
child: IconButton(
@@ -206,7 +206,7 @@ class FadingBottomBarState extends State {
children.add(
Tooltip(
- message: "delete",
+ message: "Delete",
child: Padding(
padding: const EdgeInsets.only(top: 12, bottom: 12),
child: IconButton(
diff --git a/lib/ui/gallery_app_bar_widget.dart b/lib/ui/gallery_app_bar_widget.dart
index 039ef5135..4e06310ff 100644
--- a/lib/ui/gallery_app_bar_widget.dart
+++ b/lib/ui/gallery_app_bar_widget.dart
@@ -189,7 +189,7 @@ class _GalleryAppBarWidgetState extends State {
Future _showShareCollectionDialog() async {
var collection = widget.collection;
- final dialog = createProgressDialog(context, "please wait...");
+ final dialog = createProgressDialog(context, "Please wait...");
await dialog.show();
try {
if (collection == null) {
diff --git a/lib/ui/gallery_overlay_widget.dart b/lib/ui/gallery_overlay_widget.dart
index b99f45879..12384b57d 100644
--- a/lib/ui/gallery_overlay_widget.dart
+++ b/lib/ui/gallery_overlay_widget.dart
@@ -351,7 +351,7 @@ class _OverlayWidgetState extends State {
widget.type == GalleryType.archive) {
bool showArchive = widget.type == GalleryType.homepage;
actions.add(Tooltip(
- message: showArchive ? "archive" : "unarchive",
+ message: showArchive ? "Hide" : "Unhide",
child: IconButton(
color: Colors.black, //same for both themes
icon: Icon(
@@ -369,7 +369,7 @@ class _OverlayWidgetState extends State {
void _addTrashAction(List actions) {
actions.add(Tooltip(
- message: "restore",
+ message: "Restore",
child: IconButton(
color: Colors.black, //same for both themes
icon: Icon(
diff --git a/lib/ui/home_widget.dart b/lib/ui/home_widget.dart
index dcea7dfd8..05fd5441b 100644
--- a/lib/ui/home_widget.dart
+++ b/lib/ui/home_widget.dart
@@ -124,19 +124,19 @@ class _HomeWidgetState extends State {
_triggerLogoutEvent =
Bus.instance.on().listen((event) async {
AlertDialog alert = AlertDialog(
- title: Text("session expired"),
- content: Text("please login again"),
+ title: Text("Session expired"),
+ content: Text("Please login again"),
actions: [
TextButton(
child: Text(
- "ok",
+ "Ok",
style: TextStyle(
color: Theme.of(context).buttonColor,
),
),
onPressed: () async {
Navigator.of(context, rootNavigator: true).pop('dialog');
- final dialog = createProgressDialog(context, "logging out...");
+ final dialog = createProgressDialog(context, "Logging out...");
await dialog.show();
await Configuration.instance.logout();
await dialog.hide();
diff --git a/lib/ui/image_editor_page.dart b/lib/ui/image_editor_page.dart
index 0f1280938..f92ab5971 100644
--- a/lib/ui/image_editor_page.dart
+++ b/lib/ui/image_editor_page.dart
@@ -377,7 +377,7 @@ class _ImageEditorPageState extends State {
),
);
} catch (e, s) {
- showToast("oops, could not save edits");
+ showToast("Oops, could not save edits");
_logger.severe(e, s);
}
await dialog.hide();
diff --git a/lib/ui/manage_links_widget.dart b/lib/ui/manage_links_widget.dart
index 519e79558..298a3851e 100644
--- a/lib/ui/manage_links_widget.dart
+++ b/lib/ui/manage_links_widget.dart
@@ -413,12 +413,12 @@ class _ManageSharedLinkWidgetState extends State {
Future _updateUrlSettings(
BuildContext context, Map prop) async {
- final dialog = createProgressDialog(context, "please wait...");
+ final dialog = createProgressDialog(context, "Please wait...");
await dialog.show();
try {
await CollectionsService.instance.updateShareUrl(widget.collection, prop);
await dialog.hide();
- showToast("album updated");
+ showToast("Album updated");
} catch (e) {
await dialog.hide();
await showGenericErrorDialog(context);
diff --git a/lib/ui/ott_verification_page.dart b/lib/ui/ott_verification_page.dart
index 10c4be82e..edc548766 100644
--- a/lib/ui/ott_verification_page.dart
+++ b/lib/ui/ott_verification_page.dart
@@ -186,7 +186,7 @@ class _OTTVerificationPageState extends State {
UserService.instance.getOtt(context, widget.email,
isCreateAccountScreen: widget.isCreateAccountScreen);
},
- child: Text("resend email",
+ child: Text("Resend email",
style: Theme.of(context).textTheme.subtitle1.copyWith(
fontSize: 14,
decoration: TextDecoration
diff --git a/lib/ui/password_entry_page.dart b/lib/ui/password_entry_page.dart
index 3d8283ac8..d7a3cc002 100644
--- a/lib/ui/password_entry_page.dart
+++ b/lib/ui/password_entry_page.dart
@@ -661,7 +661,7 @@ class _PasswordEntryPageState extends State {
Configuration.instance.setVolatilePassword(null);
await dialog.hide();
onDone() async {
- final dialog = createProgressDialog(context, "please wait...");
+ final dialog = createProgressDialog(context, "Please wait...");
await dialog.show();
try {
await UserService.instance.setAttributes(result);
diff --git a/lib/ui/password_reentry_page.dart b/lib/ui/password_reentry_page.dart
index 7ea2e39b1..a7774ec1c 100644
--- a/lib/ui/password_reentry_page.dart
+++ b/lib/ui/password_reentry_page.dart
@@ -60,7 +60,7 @@ class _PasswordReentryPageState extends State {
isFormValid: _passwordController.text.isNotEmpty,
buttonText: 'Log in',
onPressedFunction: () async {
- final dialog = createProgressDialog(context, "please wait...");
+ final dialog = createProgressDialog(context, "Please wait...");
await dialog.show();
try {
await Configuration.instance.decryptAndSaveSecrets(
@@ -173,7 +173,7 @@ class _PasswordReentryPageState extends State {
behavior: HitTestBehavior.opaque,
onTap: () async {
final dialog =
- createProgressDialog(context, "please wait...");
+ createProgressDialog(context, "Please wait...");
await dialog.show();
await Configuration.instance.logout();
await dialog.hide();
@@ -182,7 +182,7 @@ class _PasswordReentryPageState extends State {
},
child: Container(
child: Center(
- child: Text("change email",
+ child: Text("Change email",
style: Theme.of(context)
.textTheme
.subtitle1
@@ -208,7 +208,7 @@ class _PasswordReentryPageState extends State {
// onPressed: _passwordController.text.isNotEmpty
// ? () async {
// final dialog =
- // createProgressDialog(context, "please wait...");
+ // createProgressDialog(context, "Please wait...");
// await dialog.show();
// try {
// await Configuration.instance.decryptAndSaveSecrets(
diff --git a/lib/ui/payment/child_subscription_widget.dart b/lib/ui/payment/child_subscription_widget.dart
index 11cc6131f..f6bd839df 100644
--- a/lib/ui/payment/child_subscription_widget.dart
+++ b/lib/ui/payment/child_subscription_widget.dart
@@ -125,17 +125,17 @@ class ChildSubscriptionWidget extends StatelessWidget {
Future _leaveFamilyPlan(BuildContext context) async {
final choice = await showChoiceDialog(
context,
- 'leave family',
- 'are you sure that you want to leave the family plan?',
- firstAction: 'no',
- secondAction: 'yes',
+ 'Leave family',
+ 'Are you sure that you want to leave the family plan?',
+ firstAction: 'No',
+ secondAction: 'Yes',
firstActionColor: Theme.of(context).buttonColor,
secondActionColor: Colors.white,
);
if (choice != DialogUserChoice.secondChoice) {
return;
}
- final dialog = createProgressDialog(context, "please wait...");
+ final dialog = createProgressDialog(context, "Please wait...");
await dialog.show();
try {
await UserService.instance.leaveFamilyPlan();
diff --git a/lib/ui/payment/payment_web_page.dart b/lib/ui/payment/payment_web_page.dart
index f0bf80804..3f54fdba9 100644
--- a/lib/ui/payment/payment_web_page.dart
+++ b/lib/ui/payment/payment_web_page.dart
@@ -47,7 +47,7 @@ class _PaymentWebPageState extends State {
@override
Widget build(BuildContext context) {
- _dialog = createProgressDialog(context, "please wait...");
+ _dialog = createProgressDialog(context, "Please wait...");
if (initPaymentUrl == null) {
return loadWidget;
}
@@ -55,7 +55,7 @@ class _PaymentWebPageState extends State {
onWillPop: () async => _buildPageExitWidget(context),
child: Scaffold(
appBar: AppBar(
- title: const Text('subscription'),
+ title: const Text('Subscription'),
),
body: Column(
children: [
diff --git a/lib/ui/payment/stripe_subscription_page.dart b/lib/ui/payment/stripe_subscription_page.dart
index e5c0a7c5d..f9f79a653 100644
--- a/lib/ui/payment/stripe_subscription_page.dart
+++ b/lib/ui/payment/stripe_subscription_page.dart
@@ -121,7 +121,7 @@ class _StripeSubscriptionPageState extends State {
Widget _getBody() {
if (!_isLoading) {
_isLoading = true;
- _dialog = createProgressDialog(context, "please wait...");
+ _dialog = createProgressDialog(context, "Please wait...");
_fetchSub();
}
if (_hasLoadedData) {
diff --git a/lib/ui/payment/subscription_page.dart b/lib/ui/payment/subscription_page.dart
index 8e05877d9..46496fb3c 100644
--- a/lib/ui/payment/subscription_page.dart
+++ b/lib/ui/payment/subscription_page.dart
@@ -129,7 +129,7 @@ class _SubscriptionPageState extends State {
_isLoading = true;
_fetchSubData();
}
- _dialog = createProgressDialog(context, "please wait...");
+ _dialog = createProgressDialog(context, "Please wait...");
final appBar = AppBar(
title: Text("Subscription"),
);
diff --git a/lib/ui/sessions_page.dart b/lib/ui/sessions_page.dart
index 2a0b25001..01361ce62 100644
--- a/lib/ui/sessions_page.dart
+++ b/lib/ui/sessions_page.dart
@@ -108,7 +108,7 @@ class _SessionsPageState extends State {
}
Future _terminateSession(Session session) async {
- final dialog = createProgressDialog(context, "please wait...");
+ final dialog = createProgressDialog(context, "Please wait...");
await dialog.show();
try {
await UserService.instance.terminateSession(session.token);
@@ -118,7 +118,7 @@ class _SessionsPageState extends State {
await dialog.hide();
_logger.severe('failed to terminate', e, s);
showErrorDialog(
- context, 'oops', "something went wrong, please try again");
+ context, 'Oops', "Something went wrong, please try again");
}
}
diff --git a/lib/ui/set_wallpaper_dialog.dart b/lib/ui/set_wallpaper_dialog.dart
index 5217dab78..1aaad7ccf 100644
--- a/lib/ui/set_wallpaper_dialog.dart
+++ b/lib/ui/set_wallpaper_dialog.dart
@@ -79,7 +79,7 @@ class _SetWallpaperDialogState extends State {
} catch (e, s) {
await dialog.hide();
Logger("SetWallpaperDialog").severe(e, s);
- showToast("something went wrong");
+ showToast("Something went wrong");
return;
}
},
diff --git a/lib/ui/settings/app_version_widget.dart b/lib/ui/settings/app_version_widget.dart
index b218904ce..1381e2d3b 100644
--- a/lib/ui/settings/app_version_widget.dart
+++ b/lib/ui/settings/app_version_widget.dart
@@ -50,7 +50,7 @@ class _AppVersionWidgetState extends State {
return Padding(
padding: const EdgeInsets.all(20),
child: Text(
- "app version: " + snapshot.data,
+ "Version: " + snapshot.data,
style: Theme.of(context).textTheme.caption,
),
);
diff --git a/lib/ui/settings/details_section_widget.dart b/lib/ui/settings/details_section_widget.dart
index 5683c263d..32b3b2028 100644
--- a/lib/ui/settings/details_section_widget.dart
+++ b/lib/ui/settings/details_section_widget.dart
@@ -61,6 +61,7 @@ class _DetailsSectionWidgetState extends State {
color: Colors.transparent,
borderRadius: BorderRadius.circular(8.0),
image: DecorationImage(
+ fit: BoxFit.fill,
image: AssetImage("assets/card_background.png"),
),
),
@@ -168,11 +169,10 @@ class _DetailsSectionWidgetState extends State {
)
: Text(
"${convertBytesToReadableFormat(_userDetails.getFamilyOrPersonalUsage())} used",
- style: Theme.of(context)
- .textTheme
- .headline5
- .copyWith(color: Colors.white.withOpacity(0.7), fontSize: 14),
- ),
+ style: Theme.of(context).textTheme.headline5.copyWith(
+ color: Colors.white.withOpacity(0.7),
+ fontSize: 14),
+ ),
Text(
"${_userDetails.fileCount.toString()} Memories",
style: Theme.of(context)
diff --git a/lib/ui/settings/security_section_widget.dart b/lib/ui/settings/security_section_widget.dart
index 7795499ee..2ec548a10 100644
--- a/lib/ui/settings/security_section_widget.dart
+++ b/lib/ui/settings/security_section_widget.dart
@@ -26,7 +26,7 @@ class SecuritySectionWidget extends StatefulWidget {
class _SecuritySectionWidgetState extends State {
static const kAuthToViewSessions =
- "please authenticate to view your active sessions";
+ "Please authenticate to view your active sessions";
final _config = Configuration.instance;
@@ -70,7 +70,10 @@ class _SecuritySectionWidgetState extends State {
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
- Text("Two-factor", style: Theme.of(context).textTheme.subtitle1,),
+ Text(
+ "Two-factor",
+ style: Theme.of(context).textTheme.subtitle1,
+ ),
FutureBuilder(
future: UserService.instance.fetchTwoFactorStatus(),
builder: (_, snapshot) {
@@ -117,7 +120,10 @@ class _SecuritySectionWidgetState extends State {
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
- Text("Lockscreen", style: Theme.of(context).textTheme.subtitle1,),
+ Text(
+ "Lockscreen",
+ style: Theme.of(context).textTheme.subtitle1,
+ ),
Switch.adaptive(
value: _config.shouldShowLockScreen(),
onChanged: (value) async {
@@ -147,7 +153,8 @@ class _SecuritySectionWidgetState extends State {
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
- Text("Hide from recents", style: Theme.of(context).textTheme.subtitle1),
+ Text("Hide from recents",
+ style: Theme.of(context).textTheme.subtitle1),
Switch.adaptive(
value: _config.shouldHideFromRecents(),
onChanged: (value) async {
diff --git a/lib/ui/settings_page.dart b/lib/ui/settings_page.dart
index 58a3b75e2..8924acb70 100644
--- a/lib/ui/settings_page.dart
+++ b/lib/ui/settings_page.dart
@@ -71,10 +71,15 @@ class SettingsPage extends StatelessWidget {
DangerSectionWidget(),
]);
}
- contents.add(AppVersionWidget());
+
if (kDebugMode && hasLoggedIn) {
- contents.add(DebugSectionWidget());
+ contents.addAll([sectionDivider, DebugSectionWidget()]);
}
+ contents.add(AppVersionWidget());
+ contents.add(Padding(
+ padding: EdgeInsets.only(bottom: 60),
+ ));
+
return SingleChildScrollView(
child: Padding(
padding: const EdgeInsets.symmetric(vertical: 12.0, horizontal: 20),
diff --git a/lib/ui/share_collection_widget.dart b/lib/ui/share_collection_widget.dart
index e81a5d431..a3c96395a 100644
--- a/lib/ui/share_collection_widget.dart
+++ b/lib/ui/share_collection_widget.dart
@@ -58,9 +58,10 @@ class _SharingDialogState extends State {
if (!_showEntryField) {
children.add(SizedBox(
width: 220,
- child: OutlineButton(
+ child: OutlinedButton(
child: Icon(
Icons.add,
+ color: Theme.of(context).buttonColor,
),
onPressed: () {
setState(() {
@@ -314,19 +315,19 @@ class _SharingDialogState extends State {
String publicKey,
}) async {
if (!isValidEmail(email)) {
- showErrorDialog(context, "invalid email address",
- "please enter a valid email address.");
+ showErrorDialog(context, "Invalid email address",
+ "Please enter a valid email address.");
return;
} else if (email == Configuration.instance.getEmail()) {
- showErrorDialog(context, "oops", "you cannot share with yourself");
+ showErrorDialog(context, "Oops", "You cannot share with yourself");
return;
} else if (widget.collection.sharees.any((user) => user.email == email)) {
showErrorDialog(
- context, "oops", "you're already sharing this with " + email);
+ context, "Oops", "You're already sharing this with " + email);
return;
}
if (publicKey == null) {
- final dialog = createProgressDialog(context, "searching for user...");
+ final dialog = createProgressDialog(context, "Searching for user...");
await dialog.show();
publicKey = await UserService.instance.getPublicKey(email);
@@ -335,9 +336,9 @@ class _SharingDialogState extends State {
if (publicKey == null) {
Navigator.of(context, rootNavigator: true).pop('dialog');
final dialog = AlertDialog(
- title: Text("invite to ente?"),
+ title: Text("Invite to ente?"),
content: Text(
- "looks like " +
+ "Looks like " +
email +
" hasn't signed up for ente yet. would you like to invite them?",
style: TextStyle(
@@ -347,7 +348,7 @@ class _SharingDialogState extends State {
actions: [
TextButton(
child: Text(
- "invite",
+ "Invite",
style: TextStyle(
color: Theme.of(context).buttonColor,
),
@@ -366,7 +367,7 @@ class _SharingDialogState extends State {
},
);
} else {
- final dialog = createProgressDialog(context, "sharing...");
+ final dialog = createProgressDialog(context, "Sharing...");
await dialog.show();
final collection = widget.collection;
try {
@@ -380,7 +381,7 @@ class _SharingDialogState extends State {
await CollectionsService.instance
.share(widget.collection.id, email, publicKey);
await dialog.hide();
- showToast("shared successfully!");
+ showShortToast("Shared successfully!");
setState(() {
_sharees.add(User(email: email));
_showEntryField = false;
diff --git a/lib/utils/dialog_util.dart b/lib/utils/dialog_util.dart
index 54c524ae3..0376043eb 100644
--- a/lib/utils/dialog_util.dart
+++ b/lib/utils/dialog_util.dart
@@ -3,7 +3,6 @@ import 'dart:ui';
import 'package:confetti/confetti.dart';
import 'package:flutter/material.dart';
-import 'package:flutter/widgets.dart';
import 'package:photos/ui/loading_widget.dart';
import 'package:photos/ui/progress_dialog.dart';
@@ -36,7 +35,7 @@ Future showErrorDialog(
actions: [
TextButton(
child: Text(
- "OK",
+ "Ok",
style: TextStyle(
color: Theme.of(context).colorScheme.onSurface,
),
@@ -61,7 +60,7 @@ Future showErrorDialog(
}
Future showGenericErrorDialog(BuildContext context) {
- return showErrorDialog(context, "something went wrong", "please try again.");
+ return showErrorDialog(context, "Something went wrong", "Please try again.");
}
Future showConfettiDialog({
@@ -92,7 +91,8 @@ Future showConfettiDialog({
confettiController: _confettiController,
blastDirection: pi / 2,
emissionFrequency: 0,
- numberOfParticles: 100, // a lot of particles at once
+ numberOfParticles: 100,
+ // a lot of particles at once
gravity: 1,
blastDirectionality: BlastDirectionality.explosive,
),
@@ -107,128 +107,3 @@ Future showConfettiDialog({
routeSettings: routeSettings,
);
}
-
-Widget test() {
- return Container(
- width: 355,
- height: 236,
- child: Row(
- mainAxisSize: MainAxisSize.min,
- mainAxisAlignment: MainAxisAlignment.center,
- crossAxisAlignment: CrossAxisAlignment.center,
- children: [
- Container(
- width: 355,
- height: 236,
- decoration: BoxDecoration(
- borderRadius: BorderRadius.circular(8),
- color: Color(0x4c000000),
- ),
- padding: const EdgeInsets.only(
- top: 20,
- bottom: 16,
- ),
- child: Column(
- mainAxisSize: MainAxisSize.min,
- mainAxisAlignment: MainAxisAlignment.end,
- crossAxisAlignment: CrossAxisAlignment.center,
- children: [
- SizedBox(
- width: 234,
- child: Text(
- "Are you sure you want to logout?",
- style: TextStyle(
- color: Colors.white,
- fontSize: 24,
- fontFamily: "SF Pro Display",
- fontWeight: FontWeight.w600,
- ),
- ),
- ),
- SizedBox(height: 16),
- Container(
- width: 323,
- height: 48,
- child: Row(
- mainAxisSize: MainAxisSize.min,
- mainAxisAlignment: MainAxisAlignment.center,
- crossAxisAlignment: CrossAxisAlignment.center,
- children: [
- Container(
- width: 323,
- height: 48,
- decoration: BoxDecoration(
- borderRadius: BorderRadius.circular(8),
- color: Color(0x4c000000),
- ),
- padding: const EdgeInsets.only(
- left: 135,
- right: 136,
- ),
- child: Row(
- mainAxisSize: MainAxisSize.min,
- mainAxisAlignment: MainAxisAlignment.center,
- crossAxisAlignment: CrossAxisAlignment.center,
- children: [
- Text(
- "Cancel",
- style: TextStyle(
- color: Colors.white,
- fontSize: 16,
- fontFamily: "SF Pro Text",
- fontWeight: FontWeight.w500,
- ),
- ),
- ],
- ),
- ),
- ],
- ),
- ),
- SizedBox(height: 16),
- Container(
- width: 323,
- height: 48,
- child: Row(
- mainAxisSize: MainAxisSize.min,
- mainAxisAlignment: MainAxisAlignment.center,
- crossAxisAlignment: CrossAxisAlignment.center,
- children: [
- Container(
- width: 323,
- height: 48,
- decoration: BoxDecoration(
- borderRadius: BorderRadius.circular(8),
- color: Colors.white,
- ),
- padding: const EdgeInsets.symmetric(
- horizontal: 120,
- vertical: 12,
- ),
- child: Row(
- mainAxisSize: MainAxisSize.min,
- mainAxisAlignment: MainAxisAlignment.center,
- crossAxisAlignment: CrossAxisAlignment.center,
- children: [
- Text(
- "Yes Logout",
- style: TextStyle(
- color: Colors.black,
- fontSize: 16,
- fontFamily: "SF Pro Text",
- fontWeight: FontWeight.w500,
- ),
- ),
- ],
- ),
- ),
- ],
- ),
- ),
- ],
- ),
- ),
- ],
- ),
- );
-}
diff --git a/lib/utils/file_sync_util.dart b/lib/utils/file_sync_util.dart
index cde76d5b0..b720d5ea5 100644
--- a/lib/utils/file_sync_util.dart
+++ b/lib/utils/file_sync_util.dart
@@ -7,6 +7,7 @@ import 'package:photos/models/file.dart';
final _logger = Logger("FileSyncUtil");
final ignoreSizeConstraint = SizeConstraint(ignoreSize: true);
+final assetFetchPageSize = 2000;
Future> getDeviceFiles(
int fromTime, int toTime, Computer computer) async {
final pathEntities = await _getGalleryList(fromTime, toTime);
@@ -28,10 +29,12 @@ Future> getDeviceFiles(
}
Future> getAllLocalAssets() async {
- final filterOptionGroup = FilterOptionGroup(
- imageOption: FilterOption(sizeConstraint: ignoreSizeConstraint),
- videoOption: FilterOption(sizeConstraint: ignoreSizeConstraint),
- createTimeCond: DateTimeCond.def().copyWith(ignore: true));
+ final filterOptionGroup = FilterOptionGroup();
+ filterOptionGroup.setOption(
+ AssetType.image, FilterOption(sizeConstraint: ignoreSizeConstraint));
+ filterOptionGroup.setOption(
+ AssetType.video, FilterOption(sizeConstraint: ignoreSizeConstraint));
+ filterOptionGroup.createTimeCond = DateTimeCond.def().copyWith(ignore: true);
final assetPaths = await PhotoManager.getAssetPathList(
hasAll: true,
type: RequestType.common,
@@ -39,7 +42,7 @@ Future> getAllLocalAssets() async {
);
final List assets = [];
for (final assetPath in assetPaths) {
- for (final asset in await assetPath.assetList) {
+ for (final asset in await _getAllAssetLists(assetPath)) {
assets.add(LocalAsset(asset.id, assetPath.name));
}
}
@@ -131,12 +134,25 @@ Future> _computeFiles(AssetPathEntity pathEntity, int fromTime,
List files, Computer computer) async {
final args = Map();
args["pathEntity"] = pathEntity;
- args["assetList"] = await pathEntity.assetList;
+ args["assetList"] = await _getAllAssetLists(pathEntity);
args["fromTime"] = fromTime;
args["files"] = files;
return await computer.compute(_getFiles, param: args);
}
+Future> _getAllAssetLists(AssetPathEntity pathEntity) async {
+ List result = [];
+ int currentPage = 0;
+ List currentPageResult = [];
+ do {
+ currentPageResult = await pathEntity.getAssetListPaged(
+ page: currentPage, size: assetFetchPageSize);
+ result.addAll(currentPageResult);
+ currentPage = currentPage + 1;
+ } while (currentPageResult.length >= assetFetchPageSize);
+ return result;
+}
+
Future> _getFiles(Map args) async {
final pathEntity = args["pathEntity"];
final assetList = args["assetList"];
diff --git a/lib/utils/file_uploader_util.dart b/lib/utils/file_uploader_util.dart
index c573de311..143dd2c3b 100644
--- a/lib/utils/file_uploader_util.dart
+++ b/lib/utils/file_uploader_util.dart
@@ -95,9 +95,8 @@ Future _getMediaUploadDataFromAssetFile(ente.File file) async {
sourceFile = io.File(livePhotoPath);
}
- thumbnailData = await asset.thumbDataWithSize(
- kThumbnailLargeSize,
- kThumbnailLargeSize,
+ thumbnailData = await asset.thumbnailDataWithSize(
+ ThumbnailSize(kThumbnailLargeSize, kThumbnailLargeSize),
quality: kThumbnailQuality,
);
if (thumbnailData == null) {
diff --git a/lib/utils/file_util.dart b/lib/utils/file_util.dart
index ee5987f8d..88ff662a7 100644
--- a/lib/utils/file_util.dart
+++ b/lib/utils/file_util.dart
@@ -11,6 +11,7 @@ import 'package:logging/logging.dart';
import 'package:motionphoto/motionphoto.dart';
import 'package:path/path.dart';
import 'package:photos/core/cache/image_cache.dart';
+import 'package:photos/core/cache/thumbnail_cache.dart';
import 'package:photos/core/cache/video_cache_manager.dart';
import 'package:photos/core/configuration.dart';
import 'package:photos/core/constants.dart';
@@ -134,8 +135,7 @@ Future getFileFromServer(
return fileDownloadsInProgress[downloadID];
}
-Future isFileCached(ente.File file,
- {bool liveVideo = false}) async {
+Future isFileCached(ente.File file, {bool liveVideo = false}) async {
final cacheManager = (file.fileType == FileType.video || liveVideo)
? VideoCacheManager.instance
: DefaultCacheManager();
@@ -160,7 +160,7 @@ Future _getLivePhotoFromServer(ente.File file,
return null;
}
return needLiveVideo ? livePhoto.video : livePhoto.image;
- } catch (e,s) {
+ } catch (e, s) {
_logger.warning("live photo get failed", e, s);
livePhotoDownloadsTracker.remove(downloadID);
return null;
@@ -226,8 +226,7 @@ Future<_LivePhoto> _downloadLivePhoto(ente.File file,
}
return _LivePhoto(imageFileCache, videoFileCache);
}).catchError((e) {
- _logger.warning(
- "failed to download live photos : ${file.tag()}", e);
+ _logger.warning("failed to download live photos : ${file.tag()}", e);
throw e;
});
}
@@ -298,6 +297,7 @@ Future clearCache(ente.File file) async {
if (cachedThumbnail.existsSync()) {
await cachedThumbnail.delete();
}
+ ThumbnailLruCache.clearCache(file);
}
class _LivePhoto {
diff --git a/lib/utils/magic_util.dart b/lib/utils/magic_util.dart
index b481bf0bc..b348e5ac6 100644
--- a/lib/utils/magic_util.dart
+++ b/lib/utils/magic_util.dart
@@ -18,13 +18,13 @@ final _logger = Logger('MagicUtil');
Future changeVisibility(
BuildContext context, List files, int newVisibility) async {
final dialog = createProgressDialog(context,
- newVisibility == kVisibilityArchive ? "archiving..." : "unarchiving...");
+ newVisibility == kVisibilityArchive ? "Hiding..." : "Unhiding...");
await dialog.show();
try {
await FileMagicService.instance.changeVisibility(files, newVisibility);
showShortToast(newVisibility == kVisibilityArchive
- ? "successfully archived"
- : "successfully unarchived");
+ ? "Successfully hidden"
+ : "Successfully unhidden");
await dialog.hide();
} catch (e, s) {
@@ -37,7 +37,7 @@ Future changeVisibility(
Future changeCollectionVisibility(
BuildContext context, Collection collection, int newVisibility) async {
final dialog = createProgressDialog(context,
- newVisibility == kVisibilityArchive ? "archiving..." : "unarchiving...");
+ newVisibility == kVisibilityArchive ? "Hiding..." : "Unhiding...");
await dialog.show();
try {
Map update = {kMagicKeyVisibility: newVisibility};
@@ -45,8 +45,8 @@ Future changeCollectionVisibility(
// Force reload home gallery to pull in the now unarchived files
Bus.instance.fire(ForceReloadHomeGalleryEvent());
showShortToast(newVisibility == kVisibilityArchive
- ? "successfully archived"
- : "successfully unarchived");
+ ? "Successfully hidden"
+ : "Successfully unhidden");
await dialog.hide();
} catch (e, s) {
diff --git a/lib/utils/thumbnail_util.dart b/lib/utils/thumbnail_util.dart
index a82ac3247..fe7a86d36 100644
--- a/lib/utils/thumbnail_util.dart
+++ b/lib/utils/thumbnail_util.dart
@@ -6,6 +6,7 @@ import 'dart:typed_data';
import 'package:dio/dio.dart';
import 'package:flutter_sodium/flutter_sodium.dart';
import 'package:logging/logging.dart';
+import 'package:photo_manager/photo_manager.dart';
import 'package:photos/core/cache/thumbnail_cache.dart';
import 'package:photos/core/configuration.dart';
import 'package:photos/core/constants.dart';
@@ -82,7 +83,9 @@ Future getThumbnailFromLocal(File file,
if (asset == null || !(await asset.exists)) {
return null;
}
- return asset.thumbDataWithSize(size, size, quality: quality).then((data) {
+ return asset
+ .thumbnailDataWithSize(ThumbnailSize(size, size), quality: quality)
+ .then((data) {
ThumbnailLruCache.put(file, data, size);
return data;
});
diff --git a/pubspec.lock b/pubspec.lock
index 5e6529ff9..0c12b8b15 100644
--- a/pubspec.lock
+++ b/pubspec.lock
@@ -7,28 +7,30 @@ packages:
name: adaptive_theme
url: "https://pub.dartlang.org"
source: hosted
- version: "2.3.0"
+ version: "2.3.1"
alice:
dependency: "direct main"
description:
- name: alice
- url: "https://pub.dartlang.org"
- source: hosted
- version: "0.2.4"
+ path: "."
+ ref: HEAD
+ resolved-ref: "42c97aebbea93d1944a199b453b41bbed1f3013a"
+ url: "https://github.com/jhomlala/alice.git"
+ source: git
+ version: "0.2.5"
animate_do:
dependency: "direct main"
description:
name: animate_do
url: "https://pub.dartlang.org"
source: hosted
- version: "2.0.0"
+ version: "2.1.0"
archive:
dependency: "direct main"
description:
name: archive
url: "https://pub.dartlang.org"
source: hosted
- version: "3.1.2"
+ version: "3.3.0"
args:
dependency: transitive
description:
@@ -49,14 +51,14 @@ packages:
name: background_fetch
url: "https://pub.dartlang.org"
source: hosted
- version: "1.0.1"
+ version: "1.1.0"
better_player:
dependency: transitive
description:
name: better_player
url: "https://pub.dartlang.org"
source: hosted
- version: "0.0.73"
+ version: "0.0.81"
bip39:
dependency: "direct main"
description:
@@ -77,7 +79,21 @@ packages:
name: cached_network_image
url: "https://pub.dartlang.org"
source: hosted
- version: "3.0.0"
+ version: "3.2.1"
+ cached_network_image_platform_interface:
+ dependency: transitive
+ description:
+ name: cached_network_image_platform_interface
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "1.0.0"
+ cached_network_image_web:
+ dependency: transitive
+ description:
+ name: cached_network_image_web
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "1.0.1"
characters:
dependency: transitive
description:
@@ -105,7 +121,7 @@ packages:
name: chopper
url: "https://pub.dartlang.org"
source: hosted
- version: "4.0.1"
+ version: "4.0.5"
clock:
dependency: transitive
description:
@@ -119,7 +135,7 @@ packages:
name: collection
url: "https://pub.dartlang.org"
source: hosted
- version: "1.15.0"
+ version: "1.16.0"
computer:
dependency: "direct main"
description:
@@ -147,14 +163,14 @@ packages:
name: connectivity_for_web
url: "https://pub.dartlang.org"
source: hosted
- version: "0.4.0"
+ version: "0.4.0+1"
connectivity_macos:
dependency: transitive
description:
name: connectivity_macos
url: "https://pub.dartlang.org"
source: hosted
- version: "0.2.0"
+ version: "0.2.1+2"
connectivity_platform_interface:
dependency: transitive
description:
@@ -168,14 +184,14 @@ packages:
name: contact_picker_platform_interface
url: "https://pub.dartlang.org"
source: hosted
- version: "4.4.0"
+ version: "4.7.0"
contact_picker_web:
dependency: transitive
description:
name: contact_picker_web
url: "https://pub.dartlang.org"
source: hosted
- version: "4.4.0"
+ version: "4.7.0"
convert:
dependency: transitive
description:
@@ -189,28 +205,35 @@ packages:
name: crypto
url: "https://pub.dartlang.org"
source: hosted
- version: "3.0.1"
+ version: "3.0.2"
csslib:
dependency: transitive
description:
name: csslib
url: "https://pub.dartlang.org"
source: hosted
- version: "0.17.1"
+ version: "0.17.2"
cupertino_icons:
dependency: "direct main"
description:
name: cupertino_icons
url: "https://pub.dartlang.org"
source: hosted
- version: "1.0.3"
+ version: "1.0.4"
+ dbus:
+ dependency: transitive
+ description:
+ name: dbus
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "0.7.3"
device_info:
dependency: "direct main"
description:
name: device_info
url: "https://pub.dartlang.org"
source: hosted
- version: "2.0.2"
+ version: "2.0.3"
device_info_platform_interface:
dependency: transitive
description:
@@ -224,14 +247,14 @@ packages:
name: dio
url: "https://pub.dartlang.org"
source: hosted
- version: "4.0.0"
+ version: "4.0.6"
dots_indicator:
dependency: "direct main"
description:
name: dots_indicator
url: "https://pub.dartlang.org"
source: hosted
- version: "2.0.0"
+ version: "2.1.0"
dotted_border:
dependency: "direct main"
description:
@@ -259,7 +282,7 @@ packages:
name: exif
url: "https://pub.dartlang.org"
source: hosted
- version: "3.0.0"
+ version: "3.1.1"
expandable:
dependency: "direct main"
description:
@@ -280,21 +303,21 @@ packages:
name: extended_image
url: "https://pub.dartlang.org"
source: hosted
- version: "6.0.1"
+ version: "6.2.1"
extended_image_library:
dependency: transitive
description:
name: extended_image_library
url: "https://pub.dartlang.org"
source: hosted
- version: "3.1.0"
+ version: "3.3.0"
fake_async:
dependency: transitive
description:
name: fake_async
url: "https://pub.dartlang.org"
source: hosted
- version: "1.2.0"
+ version: "1.3.0"
fast_base58:
dependency: "direct main"
description:
@@ -308,63 +331,63 @@ packages:
name: ffi
url: "https://pub.dartlang.org"
source: hosted
- version: "1.1.1"
+ version: "1.2.1"
file:
dependency: transitive
description:
name: file
url: "https://pub.dartlang.org"
source: hosted
- version: "6.1.1"
+ version: "6.1.2"
firebase_core:
dependency: "direct main"
description:
name: firebase_core
url: "https://pub.dartlang.org"
source: hosted
- version: "1.10.0"
+ version: "1.17.1"
firebase_core_platform_interface:
dependency: transitive
description:
name: firebase_core_platform_interface
url: "https://pub.dartlang.org"
source: hosted
- version: "4.1.0"
+ version: "4.4.0"
firebase_core_web:
dependency: transitive
description:
name: firebase_core_web
url: "https://pub.dartlang.org"
source: hosted
- version: "1.2.0"
+ version: "1.6.4"
firebase_messaging:
dependency: "direct main"
description:
name: firebase_messaging
url: "https://pub.dartlang.org"
source: hosted
- version: "11.1.0"
+ version: "11.4.1"
firebase_messaging_platform_interface:
dependency: transitive
description:
name: firebase_messaging_platform_interface
url: "https://pub.dartlang.org"
source: hosted
- version: "3.0.9"
+ version: "3.5.1"
firebase_messaging_web:
dependency: transitive
description:
name: firebase_messaging_web
url: "https://pub.dartlang.org"
source: hosted
- version: "2.1.0"
+ version: "2.4.1"
fk_user_agent:
dependency: "direct main"
description:
name: fk_user_agent
url: "https://pub.dartlang.org"
source: hosted
- version: "2.0.1"
+ version: "2.1.0"
flutter:
dependency: "direct main"
description: flutter
@@ -376,7 +399,7 @@ packages:
name: flutter_blurhash
url: "https://pub.dartlang.org"
source: hosted
- version: "0.6.0"
+ version: "0.7.0"
flutter_cache_manager:
dependency: "direct main"
description:
@@ -397,7 +420,7 @@ packages:
name: flutter_easyloading
url: "https://pub.dartlang.org"
source: hosted
- version: "3.0.0"
+ version: "3.0.5"
flutter_email_sender:
dependency: "direct main"
description:
@@ -418,14 +441,14 @@ packages:
name: flutter_inappwebview
url: "https://pub.dartlang.org"
source: hosted
- version: "5.3.2"
+ version: "5.4.3+7"
flutter_keyboard_visibility:
dependency: transitive
description:
name: flutter_keyboard_visibility
url: "https://pub.dartlang.org"
source: hosted
- version: "5.0.3"
+ version: "5.2.0"
flutter_keyboard_visibility_platform_interface:
dependency: transitive
description:
@@ -453,14 +476,21 @@ packages:
name: flutter_local_notifications
url: "https://pub.dartlang.org"
source: hosted
- version: "8.2.0"
+ version: "9.5.3+1"
+ flutter_local_notifications_linux:
+ dependency: transitive
+ description:
+ name: flutter_local_notifications_linux
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "0.4.2"
flutter_local_notifications_platform_interface:
dependency: transitive
description:
name: flutter_local_notifications_platform_interface
url: "https://pub.dartlang.org"
source: hosted
- version: "4.0.1"
+ version: "5.0.0"
flutter_localizations:
dependency: "direct main"
description: flutter
@@ -486,14 +516,14 @@ packages:
name: flutter_plugin_android_lifecycle
url: "https://pub.dartlang.org"
source: hosted
- version: "2.0.2"
+ version: "2.0.6"
flutter_secure_storage:
dependency: "direct main"
description:
name: flutter_secure_storage
url: "https://pub.dartlang.org"
source: hosted
- version: "4.2.0"
+ version: "4.2.1"
flutter_sodium:
dependency: "direct main"
description:
@@ -507,7 +537,7 @@ packages:
name: flutter_spinkit
url: "https://pub.dartlang.org"
source: hosted
- version: "5.0.0"
+ version: "5.1.0"
flutter_test:
dependency: "direct dev"
description: flutter
@@ -519,7 +549,7 @@ packages:
name: flutter_typeahead
url: "https://pub.dartlang.org"
source: hosted
- version: "3.2.1"
+ version: "4.0.0"
flutter_web_plugins:
dependency: transitive
description: flutter
@@ -531,7 +561,7 @@ packages:
name: flutter_widget_from_html_core
url: "https://pub.dartlang.org"
source: hosted
- version: "0.6.2"
+ version: "0.8.5+3"
flutter_windowmanager:
dependency: "direct main"
description:
@@ -545,21 +575,28 @@ packages:
name: fluttercontactpicker
url: "https://pub.dartlang.org"
source: hosted
- version: "4.4.0"
+ version: "4.7.0"
fluttertoast:
dependency: "direct main"
description:
name: fluttertoast
url: "https://pub.dartlang.org"
source: hosted
- version: "8.0.7"
+ version: "8.0.9"
+ fwfh_text_style:
+ dependency: transitive
+ description:
+ name: fwfh_text_style
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "2.7.3+2"
google_nav_bar:
dependency: "direct main"
description:
name: google_nav_bar
url: "https://pub.dartlang.org"
source: hosted
- version: "5.0.5"
+ version: "5.0.6"
hex:
dependency: transitive
description:
@@ -580,7 +617,7 @@ packages:
name: http
url: "https://pub.dartlang.org"
source: hosted
- version: "0.13.3"
+ version: "0.13.4"
http_client_helper:
dependency: transitive
description:
@@ -594,28 +631,28 @@ packages:
name: http_parser
url: "https://pub.dartlang.org"
source: hosted
- version: "4.0.0"
+ version: "4.0.1"
image:
dependency: "direct main"
description:
name: image
url: "https://pub.dartlang.org"
source: hosted
- version: "3.0.2"
+ version: "3.1.3"
image_editor:
dependency: "direct main"
description:
name: image_editor
url: "https://pub.dartlang.org"
source: hosted
- version: "1.0.1"
+ version: "1.0.2"
implicitly_animated_reorderable_list:
dependency: "direct main"
description:
name: implicitly_animated_reorderable_list
url: "https://pub.dartlang.org"
source: hosted
- version: "0.4.0"
+ version: "0.4.2"
in_app_purchase:
dependency: "direct main"
description:
@@ -636,21 +673,21 @@ packages:
name: js
url: "https://pub.dartlang.org"
source: hosted
- version: "0.6.3"
+ version: "0.6.4"
json_annotation:
dependency: transitive
description:
name: json_annotation
url: "https://pub.dartlang.org"
source: hosted
- version: "4.1.0"
+ version: "4.5.0"
like_button:
dependency: "direct main"
description:
name: like_button
url: "https://pub.dartlang.org"
source: hosted
- version: "2.0.2"
+ version: "2.0.4"
lints:
dependency: "direct dev"
description:
@@ -671,21 +708,21 @@ packages:
name: local_auth
url: "https://pub.dartlang.org"
source: hosted
- version: "1.1.6"
+ version: "1.1.11"
logging:
dependency: "direct main"
description:
name: logging
url: "https://pub.dartlang.org"
source: hosted
- version: "1.0.1"
+ version: "1.0.2"
lottie:
dependency: "direct main"
description:
name: lottie
url: "https://pub.dartlang.org"
source: hosted
- version: "1.2.2"
+ version: "1.3.0"
matcher:
dependency: transitive
description:
@@ -693,6 +730,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "0.12.11"
+ material_color_utilities:
+ dependency: transitive
+ description:
+ name: material_color_utilities
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "0.1.4"
meta:
dependency: transitive
description:
@@ -706,7 +750,7 @@ packages:
name: mime
url: "https://pub.dartlang.org"
source: hosted
- version: "1.0.0"
+ version: "1.0.2"
motionphoto:
dependency: "direct main"
description:
@@ -736,7 +780,7 @@ packages:
name: octo_image
url: "https://pub.dartlang.org"
source: hosted
- version: "1.0.0+1"
+ version: "1.0.2"
open_file:
dependency: "direct main"
description:
@@ -750,21 +794,21 @@ packages:
name: package_info_plus
url: "https://pub.dartlang.org"
source: hosted
- version: "1.3.0"
+ version: "1.4.2"
package_info_plus_linux:
dependency: transitive
description:
name: package_info_plus_linux
url: "https://pub.dartlang.org"
source: hosted
- version: "1.0.3"
+ version: "1.0.5"
package_info_plus_macos:
dependency: transitive
description:
name: package_info_plus_macos
url: "https://pub.dartlang.org"
source: hosted
- version: "1.2.0"
+ version: "1.3.0"
package_info_plus_platform_interface:
dependency: transitive
description:
@@ -778,28 +822,28 @@ packages:
name: package_info_plus_web
url: "https://pub.dartlang.org"
source: hosted
- version: "1.0.4"
+ version: "1.0.5"
package_info_plus_windows:
dependency: transitive
description:
name: package_info_plus_windows
url: "https://pub.dartlang.org"
source: hosted
- version: "1.0.4"
+ version: "1.0.5"
page_transition:
dependency: "direct main"
description:
name: page_transition
url: "https://pub.dartlang.org"
source: hosted
- version: "2.0.2"
+ version: "2.0.5"
path:
dependency: transitive
description:
name: path
url: "https://pub.dartlang.org"
source: hosted
- version: "1.8.0"
+ version: "1.8.1"
path_drawing:
dependency: transitive
description:
@@ -820,35 +864,49 @@ packages:
name: path_provider
url: "https://pub.dartlang.org"
source: hosted
- version: "2.0.2"
+ version: "2.0.10"
+ path_provider_android:
+ dependency: transitive
+ description:
+ name: path_provider_android
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "2.0.14"
+ path_provider_ios:
+ dependency: transitive
+ description:
+ name: path_provider_ios
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "2.0.9"
path_provider_linux:
dependency: transitive
description:
name: path_provider_linux
url: "https://pub.dartlang.org"
source: hosted
- version: "2.0.0"
+ version: "2.1.6"
path_provider_macos:
dependency: transitive
description:
name: path_provider_macos
url: "https://pub.dartlang.org"
source: hosted
- version: "2.0.0"
+ version: "2.0.6"
path_provider_platform_interface:
dependency: transitive
description:
name: path_provider_platform_interface
url: "https://pub.dartlang.org"
source: hosted
- version: "2.0.1"
+ version: "2.0.4"
path_provider_windows:
dependency: transitive
description:
name: path_provider_windows
url: "https://pub.dartlang.org"
source: hosted
- version: "2.0.1"
+ version: "2.0.6"
pedantic:
dependency: "direct main"
description:
@@ -862,7 +920,7 @@ packages:
name: permission_handler
url: "https://pub.dartlang.org"
source: hosted
- version: "8.2.2"
+ version: "8.3.0"
permission_handler_platform_interface:
dependency: transitive
description:
@@ -876,16 +934,14 @@ packages:
name: petitparser
url: "https://pub.dartlang.org"
source: hosted
- version: "4.3.0"
+ version: "5.0.0"
photo_manager:
dependency: "direct main"
description:
- path: "."
- ref: HEAD
- resolved-ref: "474fe1df8504307f98a8390032693203f2f47997"
- url: "https://github.com/ente-io/flutter_photo_manager.git"
- source: git
- version: "1.3.6"
+ name: photo_manager
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "2.1.1"
photo_view:
dependency: "direct main"
description:
@@ -906,42 +962,42 @@ packages:
name: platform
url: "https://pub.dartlang.org"
source: hosted
- version: "3.0.0"
+ version: "3.1.0"
plugin_platform_interface:
dependency: transitive
description:
name: plugin_platform_interface
url: "https://pub.dartlang.org"
source: hosted
- version: "2.0.0"
+ version: "2.1.2"
pointycastle:
dependency: transitive
description:
name: pointycastle
url: "https://pub.dartlang.org"
source: hosted
- version: "3.4.0"
+ version: "3.6.0"
process:
dependency: transitive
description:
name: process
url: "https://pub.dartlang.org"
source: hosted
- version: "4.2.1"
+ version: "4.2.4"
provider:
dependency: "direct main"
description:
name: provider
url: "https://pub.dartlang.org"
source: hosted
- version: "6.0.1"
+ version: "6.0.3"
quiver:
dependency: "direct main"
description:
name: quiver
url: "https://pub.dartlang.org"
source: hosted
- version: "3.0.1"
+ version: "3.1.0"
receive_sharing_intent:
dependency: "direct main"
description:
@@ -955,14 +1011,14 @@ packages:
name: rxdart
url: "https://pub.dartlang.org"
source: hosted
- version: "0.27.2"
+ version: "0.27.3"
scrollable_positioned_list:
dependency: "direct main"
description:
name: scrollable_positioned_list
url: "https://pub.dartlang.org"
source: hosted
- version: "0.2.2"
+ version: "0.2.3"
sensors:
dependency: transitive
description:
@@ -976,14 +1032,14 @@ packages:
name: sentry
url: "https://pub.dartlang.org"
source: hosted
- version: "5.1.0"
+ version: "6.5.1"
sentry_flutter:
dependency: transitive
description:
name: sentry_flutter
url: "https://pub.dartlang.org"
source: hosted
- version: "5.1.0"
+ version: "6.5.1"
share:
dependency: transitive
description:
@@ -1039,21 +1095,35 @@ packages:
name: shared_preferences
url: "https://pub.dartlang.org"
source: hosted
- version: "2.0.6"
+ version: "2.0.15"
+ shared_preferences_android:
+ dependency: transitive
+ description:
+ name: shared_preferences_android
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "2.0.12"
+ shared_preferences_ios:
+ dependency: transitive
+ description:
+ name: shared_preferences_ios
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "2.1.1"
shared_preferences_linux:
dependency: transitive
description:
name: shared_preferences_linux
url: "https://pub.dartlang.org"
source: hosted
- version: "2.0.0"
+ version: "2.1.1"
shared_preferences_macos:
dependency: transitive
description:
name: shared_preferences_macos
url: "https://pub.dartlang.org"
source: hosted
- version: "2.0.0"
+ version: "2.0.4"
shared_preferences_platform_interface:
dependency: transitive
description:
@@ -1067,14 +1137,14 @@ packages:
name: shared_preferences_web
url: "https://pub.dartlang.org"
source: hosted
- version: "2.0.0"
+ version: "2.0.4"
shared_preferences_windows:
dependency: transitive
description:
name: shared_preferences_windows
url: "https://pub.dartlang.org"
source: hosted
- version: "2.0.0"
+ version: "2.1.1"
sky_engine:
dependency: transitive
description: flutter
@@ -1086,7 +1156,7 @@ packages:
name: source_span
url: "https://pub.dartlang.org"
source: hosted
- version: "1.8.1"
+ version: "1.8.2"
sprintf:
dependency: transitive
description:
@@ -1100,14 +1170,14 @@ packages:
name: sqflite
url: "https://pub.dartlang.org"
source: hosted
- version: "2.0.0+3"
+ version: "2.0.2+1"
sqflite_common:
dependency: transitive
description:
name: sqflite_common
url: "https://pub.dartlang.org"
source: hosted
- version: "2.0.0+2"
+ version: "2.2.1+1"
sqflite_migration:
dependency: "direct main"
description:
@@ -1156,21 +1226,21 @@ packages:
name: syncfusion_flutter_core
url: "https://pub.dartlang.org"
source: hosted
- version: "19.2.49"
+ version: "19.4.56"
syncfusion_flutter_sliders:
dependency: "direct main"
description:
name: syncfusion_flutter_sliders
url: "https://pub.dartlang.org"
source: hosted
- version: "19.2.49"
+ version: "19.4.56"
synchronized:
dependency: transitive
description:
name: synchronized
url: "https://pub.dartlang.org"
source: hosted
- version: "3.0.0"
+ version: "3.0.0+2"
term_glyph:
dependency: transitive
description:
@@ -1184,7 +1254,7 @@ packages:
name: test_api
url: "https://pub.dartlang.org"
source: hosted
- version: "0.4.3"
+ version: "0.4.9"
timezone:
dependency: transitive
description:
@@ -1205,7 +1275,7 @@ packages:
name: typed_data
url: "https://pub.dartlang.org"
source: hosted
- version: "1.3.0"
+ version: "1.3.1"
uni_links:
dependency: "direct main"
description:
@@ -1240,56 +1310,70 @@ packages:
name: url_launcher
url: "https://pub.dartlang.org"
source: hosted
- version: "6.0.4"
+ version: "6.1.2"
+ url_launcher_android:
+ dependency: transitive
+ description:
+ name: url_launcher_android
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "6.0.17"
+ url_launcher_ios:
+ dependency: transitive
+ description:
+ name: url_launcher_ios
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "6.0.17"
url_launcher_linux:
dependency: transitive
description:
name: url_launcher_linux
url: "https://pub.dartlang.org"
source: hosted
- version: "2.0.0"
+ version: "3.0.1"
url_launcher_macos:
dependency: transitive
description:
name: url_launcher_macos
url: "https://pub.dartlang.org"
source: hosted
- version: "2.0.0"
+ version: "3.0.1"
url_launcher_platform_interface:
dependency: transitive
description:
name: url_launcher_platform_interface
url: "https://pub.dartlang.org"
source: hosted
- version: "2.0.3"
+ version: "2.0.5"
url_launcher_web:
dependency: transitive
description:
name: url_launcher_web
url: "https://pub.dartlang.org"
source: hosted
- version: "2.0.0"
+ version: "2.0.11"
url_launcher_windows:
dependency: transitive
description:
name: url_launcher_windows
url: "https://pub.dartlang.org"
source: hosted
- version: "2.0.0"
+ version: "3.0.1"
uuid:
dependency: "direct main"
description:
name: uuid
url: "https://pub.dartlang.org"
source: hosted
- version: "3.0.4"
+ version: "3.0.6"
vector_math:
dependency: transitive
description:
name: vector_math
url: "https://pub.dartlang.org"
source: hosted
- version: "2.1.1"
+ version: "2.1.2"
video_player:
dependency: "direct main"
description:
@@ -1317,7 +1401,7 @@ packages:
name: video_thumbnail
url: "https://pub.dartlang.org"
source: hosted
- version: "0.4.3"
+ version: "0.4.6"
visibility_detector:
dependency: "direct main"
description:
@@ -1373,28 +1457,28 @@ packages:
name: win32
url: "https://pub.dartlang.org"
source: hosted
- version: "2.0.5"
+ version: "2.6.1"
xdg_directories:
dependency: transitive
description:
name: xdg_directories
url: "https://pub.dartlang.org"
source: hosted
- version: "0.2.0"
+ version: "0.2.0+1"
xml:
dependency: transitive
description:
name: xml
url: "https://pub.dartlang.org"
source: hosted
- version: "5.3.0"
+ version: "5.4.1"
yaml:
dependency: transitive
description:
name: yaml
url: "https://pub.dartlang.org"
source: hosted
- version: "3.1.0"
+ version: "3.1.1"
sdks:
- dart: ">=2.14.0 <3.0.0"
- flutter: ">=2.8.0"
+ dart: ">=2.17.0 <3.0.0"
+ flutter: ">=3.0.0"
diff --git a/pubspec.yaml b/pubspec.yaml
index cbb64221a..32a3cde0c 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -11,14 +11,15 @@ description: ente photos application
# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.
# Read more about iOS versioning at
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
-version: 0.5.21+301
+version: 0.5.25+305
environment:
sdk: ">=2.10.0 <3.0.0"
dependencies:
- alice: ^0.2.4
adaptive_theme: ^2.3.0
+ alice:
+ git: "https://github.com/jhomlala/alice.git"
animate_do: ^2.0.0
archive: ^3.1.2
background_fetch: ^1.0.1
@@ -39,7 +40,7 @@ dependencies:
exif: ^3.0.0
expandable: ^5.0.1
expansion_tile_card: ^2.0.0
- extended_image: ^6.0.1
+ extended_image: ^6.2.1
fast_base58: ^0.2.1
firebase_core: ^1.10.0
firebase_messaging: ^11.1.0
@@ -53,14 +54,14 @@ dependencies:
flutter_email_sender: 5.0.2
flutter_image_compress: ^1.1.0
flutter_inappwebview: ^5.3.2
- flutter_local_notifications: ^5.0.0+4
+ flutter_local_notifications: ^9.5.3+1
flutter_password_strength: ^0.1.6
flutter_secure_storage: ^4.2.0
flutter_sodium: ^0.2.0
- flutter_typeahead: ^3.2.0
+ flutter_typeahead: ^4.0.0
fk_user_agent: ^2.0.1
flutter_windowmanager: ^0.2.0
- fluttercontactpicker: ^4.4.0
+ fluttercontactpicker: ^4.7.0
fluttertoast: ^8.0.6
google_nav_bar: ^5.0.5
image: ^3.0.2
@@ -81,15 +82,14 @@ dependencies:
page_transition: ^2.0.2
path_provider: ^2.0.1
pedantic: ^1.9.2
- photo_manager:
- git: "https://github.com/ente-io/flutter_photo_manager.git"
+ photo_manager: ^2.0.8
photo_view: ^0.13.0
pinput: ^1.2.2
provider: ^6.0.0
quiver: ^3.0.1
receive_sharing_intent: ^1.4.5
scrollable_positioned_list: ^0.2.2
- sentry: ^5.0.0
+ sentry: ^6.5.1
share_plus: ^4.0.4
shared_preferences: ^2.0.5
sqflite: ^2.0.0+3
@@ -111,7 +111,6 @@ dependencies:
dependency_overrides:
provider: ^6.0.1 # for chewie 1.2.2 https://github.com/brianegan/chewie/issues/530
- flutter_local_notifications: ^8.1.1
dev_dependencies:
flutter_launcher_icons: "0.9.0"
diff --git a/thirdparty/super_logging/pubspec.yaml b/thirdparty/super_logging/pubspec.yaml
index 459ca1d49..2bc89cc16 100644
--- a/thirdparty/super_logging/pubspec.yaml
+++ b/thirdparty/super_logging/pubspec.yaml
@@ -17,7 +17,7 @@ dependencies:
intl: ^0.17.0
path: ^1.6.4
path_provider: ^2.0.1
- sentry_flutter: ^5.1.0
+ sentry_flutter: ^6.5.1
dev_dependencies:
flutter_test: