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. - Download on Google Play + Get it on Google Play + + + Get it on 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: