From b9619499f5b73d89164dc357603e19a4f2759e1f Mon Sep 17 00:00:00 2001 From: Manav Date: Mon, 2 Jan 2023 21:34:10 +0530 Subject: [PATCH 01/49] Migrate from connectivity to connectivity_plus Both are official Flutter plugins. connectivity has been deprecated, and connectivity_plus is the replacement: https://pub.dev/packages/connectivity_plus Tested on: iOS simulator, by turning WiFi on/off on the laptop --- ios/Podfile.lock | 18 ++++++------- ios/Runner.xcodeproj/project.pbxproj | 6 ++--- lib/services/sync_service.dart | 2 +- lib/utils/file_uploader.dart | 2 +- pubspec.lock | 40 +++++++++++----------------- pubspec.yaml | 2 +- 6 files changed, 31 insertions(+), 39 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index ff25f6528..13a4c91ed 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -3,9 +3,9 @@ PODS: - Flutter - camera_avfoundation (0.0.1): - Flutter - - connectivity (0.0.1): + - connectivity_plus (0.0.1): - Flutter - - Reachability + - ReachabilitySwift - device_info (0.0.1): - Flutter - Firebase/CoreOnly (10.3.0): @@ -136,7 +136,7 @@ PODS: - Flutter - FlutterMacOS - PromisesObjC (2.1.1) - - Reachability (3.2) + - ReachabilitySwift (5.0.0) - receive_sharing_intent (0.0.1): - Flutter - SDWebImage (5.15.2): @@ -178,7 +178,7 @@ PODS: DEPENDENCIES: - background_fetch (from `.symlinks/plugins/background_fetch/ios`) - camera_avfoundation (from `.symlinks/plugins/camera_avfoundation/ios`) - - connectivity (from `.symlinks/plugins/connectivity/ios`) + - connectivity_plus (from `.symlinks/plugins/connectivity_plus/ios`) - device_info (from `.symlinks/plugins/device_info/ios`) - firebase_core (from `.symlinks/plugins/firebase_core/ios`) - firebase_messaging (from `.symlinks/plugins/firebase_messaging/ios`) @@ -231,7 +231,7 @@ SPEC REPOS: - nanopb - OrderedSet - PromisesObjC - - Reachability + - ReachabilitySwift - SDWebImage - SDWebImageWebPCoder - Sentry @@ -242,8 +242,8 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/background_fetch/ios" camera_avfoundation: :path: ".symlinks/plugins/camera_avfoundation/ios" - connectivity: - :path: ".symlinks/plugins/connectivity/ios" + connectivity_plus: + :path: ".symlinks/plugins/connectivity_plus/ios" device_info: :path: ".symlinks/plugins/device_info/ios" firebase_core: @@ -320,7 +320,7 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: background_fetch: bd64e544b303ee4cd4cf2fe8cb2187b72aecf9ca camera_avfoundation: 07c77549ea54ad95d8581be86617c094a46280d9 - connectivity: c4130b2985d4ef6fd26f9702e886bd5260681467 + connectivity_plus: 413a8857dd5d9f1c399a39130850d02fe0feaf7e device_info: d7d233b645a32c40dfdc212de5cf646ca482f175 Firebase: f92fc551ead69c94168d36c2b26188263860acd9 firebase_core: f95c8bbe65213d406d592573ad42a12d64849cb8 @@ -358,7 +358,7 @@ SPEC CHECKSUMS: path_provider_foundation: 37748e03f12783f9de2cb2c4eadfaa25fe6d4852 photo_manager: 4f6810b7dfc4feb03b461ac1a70dacf91fba7604 PromisesObjC: ab77feca74fa2823e7af4249b8326368e61014cb - Reachability: 33e18b67625424e47b6cde6d202dce689ad7af96 + ReachabilitySwift: 985039c6f7b23a1da463388634119492ff86c825 receive_sharing_intent: c0d87310754e74c0f9542947e7cbdf3a0335a3b1 SDWebImage: 8ab87d4b3e5cc4927bd47f78db6ceb0b94442577 SDWebImageWebPCoder: 4851414d9f8894e328e8b97c93ea4f4f4e4418ae diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 9f41a9a3a..529def5d4 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -268,14 +268,14 @@ "${BUILT_PRODUCTS_DIR}/Mantle/Mantle.framework", "${BUILT_PRODUCTS_DIR}/OrderedSet/OrderedSet.framework", "${BUILT_PRODUCTS_DIR}/PromisesObjC/FBLPromises.framework", - "${BUILT_PRODUCTS_DIR}/Reachability/Reachability.framework", + "${BUILT_PRODUCTS_DIR}/ReachabilitySwift/Reachability.framework", "${BUILT_PRODUCTS_DIR}/SDWebImage/SDWebImage.framework", "${BUILT_PRODUCTS_DIR}/SDWebImageWebPCoder/SDWebImageWebPCoder.framework", "${BUILT_PRODUCTS_DIR}/Sentry/Sentry.framework", "${BUILT_PRODUCTS_DIR}/Toast/Toast.framework", "${BUILT_PRODUCTS_DIR}/background_fetch/background_fetch.framework", "${BUILT_PRODUCTS_DIR}/camera_avfoundation/camera_avfoundation.framework", - "${BUILT_PRODUCTS_DIR}/connectivity/connectivity.framework", + "${BUILT_PRODUCTS_DIR}/connectivity_plus/connectivity_plus.framework", "${BUILT_PRODUCTS_DIR}/device_info/device_info.framework", "${BUILT_PRODUCTS_DIR}/fk_user_agent/fk_user_agent.framework", "${BUILT_PRODUCTS_DIR}/flutter_email_sender/flutter_email_sender.framework", @@ -331,7 +331,7 @@ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Toast.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/background_fetch.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/camera_avfoundation.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/connectivity.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/connectivity_plus.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/device_info.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/fk_user_agent.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_email_sender.framework", diff --git a/lib/services/sync_service.dart b/lib/services/sync_service.dart index cdd5e7643..867e36e9f 100644 --- a/lib/services/sync_service.dart +++ b/lib/services/sync_service.dart @@ -1,7 +1,7 @@ import 'dart:async'; import 'dart:io'; -import 'package:connectivity/connectivity.dart'; +import 'package:connectivity_plus/connectivity_plus.dart'; import 'package:dio/dio.dart'; import 'package:logging/logging.dart'; import 'package:photo_manager/photo_manager.dart'; diff --git a/lib/utils/file_uploader.dart b/lib/utils/file_uploader.dart index ec1f6ece3..403fa7668 100644 --- a/lib/utils/file_uploader.dart +++ b/lib/utils/file_uploader.dart @@ -6,7 +6,7 @@ import 'dart:math'; import 'dart:typed_data'; import 'package:collection/collection.dart'; -import 'package:connectivity/connectivity.dart'; +import 'package:connectivity_plus/connectivity_plus.dart'; import 'package:dio/dio.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter_sodium/flutter_sodium.dart'; diff --git a/pubspec.lock b/pubspec.lock index 79660f993..35d7ba3a7 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -208,38 +208,22 @@ packages: url: "https://pub.dev" source: hosted version: "0.6.0" - connectivity: + connectivity_plus: dependency: "direct main" description: - name: connectivity - sha256: a8e91263cf3e25fb5cc95e19dfde4999e32a648ac3b9e8a558a28165731678f8 + name: connectivity_plus + sha256: "8875e8ed511a49f030e313656154e4bbbcef18d68dfd32eb853fac10bce48e96" url: "https://pub.dev" source: hosted - version: "3.0.6" - connectivity_for_web: + version: "3.0.3" + connectivity_plus_platform_interface: dependency: transitive description: - name: connectivity_for_web - sha256: "01a390c1d5adc2ed1fa1f52d120c07fe9fd01166a93f965a832fd6cfc0ea6482" + name: connectivity_plus_platform_interface + sha256: cf1d1c28f4416f8c654d7dc3cd638ec586076255d407cef3ddbdaf178272a71a url: "https://pub.dev" source: hosted - version: "0.4.0+1" - connectivity_macos: - dependency: transitive - description: - name: connectivity_macos - sha256: "51ae08d5162eca9669b9d8951ed83ce19c5355a81149f94e4dee2740beb93628" - url: "https://pub.dev" - source: hosted - version: "0.2.1+2" - connectivity_platform_interface: - dependency: transitive - description: - name: connectivity_platform_interface - sha256: "2d82e942df9d49f29a24bb07fb5ce085d4a53e47818c62364d2b6deb9e0d7a8e" - url: "https://pub.dev" - source: hosted - version: "2.0.1" + version: "1.2.4" convert: dependency: transitive description: @@ -1005,6 +989,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.0" + nm: + dependency: transitive + description: + name: nm + sha256: "2c9aae4127bdc8993206464fcc063611e0e36e72018696cd9631023a31b24254" + url: "https://pub.dev" + source: hosted + version: "0.5.0" node_preamble: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index a94c086f3..9dffb4f0a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -30,7 +30,7 @@ dependencies: collection: # dart computer: ^2.0.0 confetti: ^0.6.0 - connectivity: ^3.0.3 + connectivity_plus: ^3.0.3 cupertino_icons: ^1.0.0 device_info: ^2.0.2 dio: ^4.0.6 From f96adbc19719d8dcff88de301b9a4b2fb133eb2a Mon Sep 17 00:00:00 2001 From: Manav Date: Tue, 3 Jan 2023 10:23:03 +0530 Subject: [PATCH 02/49] Handle the new enum states --- lib/utils/file_uploader.dart | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/utils/file_uploader.dart b/lib/utils/file_uploader.dart index 403fa7668..6162bd2b7 100644 --- a/lib/utils/file_uploader.dart +++ b/lib/utils/file_uploader.dart @@ -282,9 +282,11 @@ class FileUploader { return; } final connectivityResult = await (Connectivity().checkConnectivity()); - final canUploadUnderCurrentNetworkConditions = - (connectivityResult == ConnectivityResult.wifi || - Configuration.instance.shouldBackupOverMobileData()); + bool canUploadUnderCurrentNetworkConditions = true; + if (connectivityResult == ConnectivityResult.mobile) { + canUploadUnderCurrentNetworkConditions = + Configuration.instance.shouldBackupOverMobileData(); + } if (!canUploadUnderCurrentNetworkConditions) { throw WiFiUnavailableError(); } From d90c21929bb64f4c874ae4bd8a2c20f07131b329 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Tue, 21 Feb 2023 10:07:13 +0530 Subject: [PATCH 03/49] Added android themed icon support --- android/app/src/main/res/mipmap-anydpi-v26/launcher_icon.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/android/app/src/main/res/mipmap-anydpi-v26/launcher_icon.xml b/android/app/src/main/res/mipmap-anydpi-v26/launcher_icon.xml index 5f349f7f4..b26e945b8 100644 --- a/android/app/src/main/res/mipmap-anydpi-v26/launcher_icon.xml +++ b/android/app/src/main/res/mipmap-anydpi-v26/launcher_icon.xml @@ -2,4 +2,5 @@ + From a9bc3d3f050aa63dfd1a2a43dd5e04d32786857a Mon Sep 17 00:00:00 2001 From: ashilkn Date: Tue, 21 Feb 2023 21:06:36 +0530 Subject: [PATCH 04/49] New splash icon + Fixed Splash icon for Android version >= 12 --- .../res/drawable-hdpi/android12splash.png | Bin 0 -> 6490 bytes .../app/src/main/res/drawable-hdpi/splash.png | Bin 5633 -> 6490 bytes .../res/drawable-mdpi/android12splash.png | Bin 0 -> 2458 bytes .../app/src/main/res/drawable-mdpi/splash.png | Bin 2245 -> 2458 bytes .../drawable-night-hdpi/android12splash.png | Bin 0 -> 6509 bytes .../main/res/drawable-night-hdpi/splash.png | Bin 5640 -> 6509 bytes .../drawable-night-mdpi/android12splash.png | Bin 0 -> 2455 bytes .../main/res/drawable-night-mdpi/splash.png | Bin 2244 -> 2455 bytes .../drawable-night-v21/launch_background.xml | 2 +- .../drawable-night-xhdpi/android12splash.png | Bin 0 -> 6188 bytes .../main/res/drawable-night-xhdpi/splash.png | Bin 5536 -> 6188 bytes .../drawable-night-xxhdpi/android12splash.png | Bin 0 -> 16868 bytes .../main/res/drawable-night-xxhdpi/splash.png | Bin 14805 -> 16868 bytes .../android12splash.png | Bin 0 -> 16094 bytes .../res/drawable-night-xxxhdpi/splash.png | Bin 14140 -> 16094 bytes .../res/drawable-night/launch_background.xml | 2 +- .../res/drawable-v21/launch_background.xml | 2 +- .../res/drawable-xhdpi/android12splash.png | Bin 0 -> 6232 bytes .../src/main/res/drawable-xhdpi/splash.png | Bin 5512 -> 6232 bytes .../res/drawable-xxhdpi/android12splash.png | Bin 0 -> 16866 bytes .../src/main/res/drawable-xxhdpi/splash.png | Bin 14844 -> 16866 bytes .../res/drawable-xxxhdpi/android12splash.png | Bin 0 -> 16129 bytes .../src/main/res/drawable-xxxhdpi/splash.png | Bin 14075 -> 16129 bytes .../main/res/drawable/launch_background.xml | 2 +- .../src/main/res/values-night-v31/styles.xml | 4 ++- .../app/src/main/res/values-night/styles.xml | 3 +- .../app/src/main/res/values-v31/styles.xml | 4 ++- assets/splash-screen-dark.png | Bin 13662 -> 15622 bytes assets/splash-screen-light.png | Bin 13466 -> 15418 bytes .../LaunchBackground.imageset/Contents.json | 34 ++---------------- .../LaunchImage.imageset/LaunchImage.png | Bin 2245 -> 2458 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 5512 -> 6232 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 14844 -> 16866 bytes .../LaunchImage.imageset/LaunchImageDark.png | Bin 2244 -> 2455 bytes .../LaunchImageDark@2x.png | Bin 5536 -> 6188 bytes .../LaunchImageDark@3x.png | Bin 14805 -> 16868 bytes ios/Runner/Base.lproj/LaunchScreen.storyboard | 4 +-- ios/Runner/Info.plist | 29 ++++++++------- pubspec.yaml | 8 +++++ 39 files changed, 38 insertions(+), 56 deletions(-) create mode 100644 android/app/src/main/res/drawable-hdpi/android12splash.png create mode 100644 android/app/src/main/res/drawable-mdpi/android12splash.png create mode 100644 android/app/src/main/res/drawable-night-hdpi/android12splash.png create mode 100644 android/app/src/main/res/drawable-night-mdpi/android12splash.png create mode 100644 android/app/src/main/res/drawable-night-xhdpi/android12splash.png create mode 100644 android/app/src/main/res/drawable-night-xxhdpi/android12splash.png create mode 100644 android/app/src/main/res/drawable-night-xxxhdpi/android12splash.png create mode 100644 android/app/src/main/res/drawable-xhdpi/android12splash.png create mode 100644 android/app/src/main/res/drawable-xxhdpi/android12splash.png create mode 100644 android/app/src/main/res/drawable-xxxhdpi/android12splash.png diff --git a/android/app/src/main/res/drawable-hdpi/android12splash.png b/android/app/src/main/res/drawable-hdpi/android12splash.png new file mode 100644 index 0000000000000000000000000000000000000000..ca74360deec91370c88e6627a50df7e86740b571 GIT binary patch literal 6490 zcmeHM=|7Zh`yVCCO(A=-RQ9bVg{;}KR75e#K9a(aikZgRW-z21F?XV}n_&(E~y5NN-n zgRL6~#8fyr*%|}w2kL(^n&x*RgJ$qIl#WuwD$SH@@4--{{l7($c6VJ-=TVcid&?ot&q;0K= zRpQvA$Lq!3lmvTj&MoC{ZmMa_tBsKcTg*4N)_ga;LiMPN3GSe0pZ>t$AQ19M8_2;i zk?&b1Xs?PIpTJqCJ)()({Bj^I;S(UYgZ`jm)qf5C^}~NhJfuB4b9ed*>hK*0;;M|k zw`ZlE=EeViXnP*)HDB}QAvtte76IaW{}fKE<1u@uT z8D=$2oDKyXb%)1}BT3H;mRYP+aHZ9qUwY2hkH_~{UaiIc%3X6E5umQf(A z>o%GtkA~y?h?d``y0UQW_%%wuj8|CSZ!n5}{&>rk{Dkd|{!jlH;C8lVEa{^O>pxK} zkqiW#z54QQPlX}l-q(pv`C8uUD13Rx{LlMiRfpk@7OTVzcfYL(S&@}egUI+e9?Or= zx|Gj8g?xE`Y1-ZXaHK77 zn@spR17n%6U0AKWvJ{FDs^&v*XUkYd%Y+0Ti%fAtOX^vKC2TLfg6yt8y5J06W5E4L z-G-xA5;i{iT{{zh82(RCP6eBbyr1M4G10zQq|Cdyg7(`goX3Bg*t&MB8W;7nVgk0At5W7xjFj;7rWVWXT++H0HhUEGpZ>>6n!&#i2fP6yac%Q z0h2BuR4ow8@*2msE|(k!X2OTHtPJ#jk74_W#ayrHF=2`NAX>adwL0wDiygB@7CyW; zUK_iMLBjvZeB(?3+Nr9x@yA0EY$&0HjGQBOx@GUP zN0@Ve7s23x6;O;}d|8s@rmQsS?)0Zy6b17}CKks$inrYQDV8K9BERiYVLO6N)Yd9U zr+%3PK=f3i#Wg3N z$oiI#9|IF}7VNBOz45EHWQyx2CXV21zA=>rgC8^J^EjK`4V( z-taRiWE55pqv%x7@&`4aKoHD|GUiX3C2!VcV07*gi1qa+O8NVU>eo`bV0d;}C;B9i z6{hd(eUdls4Wstws-82k0BrLNh6MQrP@(w7Qtq@7bvWASkn~*~^yIYWMMSvQC!f@n z4FnAS{r*g0l%T!)C;7CcP$0Gqe=K zq2!>eHRZn*NAqyPi~>Ino7APAcdF*XRb4~HEY4)3-0oBjTYo+(gl?u8^pqbk`TZJC zjo_^e5+E9gElww{iadfv{(gf>UDYXAvdfFq!1!#566?RR{C2opmgie@bp@l12OCZt zkl$6_gdLyjW$Bjj^$sKEFGf@TjGU}OBt(YL5UAa<0Oh}4`8=dO2F~v(77aLU0@mTg zA+9)5p*3MIw_HimlT5YxgDEW;PzEgws;NEj5xvhZSG`@A+?njixR_eQP1xBSS7fWn z*mUHtZ?94P?!nreGbpNovce3x(bI2=8)8!Z=OEq)8huQ!e#|YyDZBZ1N>#8^1j>NP z@0t6;bDv59ineX1Mt}5E4$J(t_qrprh1T%#V@>K=QOPLNIeAd+D4g3)j7oU zac3Y|Rf-W53FVjhh_89yzu9LXEyJ}W4uG%wd{K&-b8XH9pF1bCDwZ7eOtRvAaZcb+GvD|n@<~-)q)sWb@k-A$pwJ>@n%>zu_gP@)_qF;(^e$g;_ zfcUmNu4sESP2M1tJZKA~=u1Df+*4@Rtb_2>$tNI|wYTDP-OQoLPDKR~LN1y#=p-#l zvmFaqZCz_2Gy&xpO_GHNh*_-rlYS;C$b{a#5Z2hfgQjd^hP<4@O3x&pxelI_wRx+S zB*~`kZ0|8YWXbO-3ms%+3Xo1liR#d;3negW-qFKBD_<<$sasS#B@JTAlTBBL0?}+E z!}o=Mi#omXd*p4Wp7bcNZ~EYk?iZ)CV}uSI;~RMMW$884Xv&Jah_du%AM~0yaEH4* zYXh;8U4p;ZYD?{RC_G!Zyr-QZbtkPU^EvA7Opo4xhejdtg#K$MU9GkGhy<_1D2K$T z^5u71076#WjLA}T#N!p0MK#TU(FfdU6ps*;Nf~*{b#bKM*d%|Yo`qIY~p?$6{yuFFMVsC;RCCL&>T)XO~n z6IJ(3*9NM{HZkh;R9?juHGcwd-PyYEh0fP&1KNr?+7cfZp*+1{Hc z)cN2w#jaU70EQNxzd+Jj&@|Aw4}ay}B|;mrYo1@y(T1KUsJBn-n(H>*gci7YCB5N~ zMJYzht%Czc(*qj!D()lV{k4dx^zzE<5}R*^QEU=mjc_I+s2kl8SUvJk;e5ELw{Evu z+lN{B+aIo{BfgvQk)`%j?j`o~5o9D?Is+4{8YWU<@PJ}tstjSdc*9k-&1A7RVY_x- zU$g`x$0$YQ3?>ET`jDSbKE(zX+%E;j)s9)7*Jv{l??oa=>d|HM=R|+~J$|>>d@x!z z$!%0NSzhSGmsHs0M9%rdDF5saJ?FI>uc}W%ylmdS!_WUUE(-X0;!)F-g?|yW{jo3% z{y^f#BP7QVpd4h%iDlp|)crR~IlckdyrPDjS|zdLkX^l-ytKY}u5)6PN&!iz8Y1bR z{p0HN1brLYY{)n8z*A)zLgl)TGUQB%Uk#Q+Yr72<)&&Ui&6A4kn-mcn7hosMZxwX% z=VaK|zk^q!&ix;B2*5B#XlrwPrxihAApUe|=$SB7_y(RB^qSRj=YlQ0DqG~v znN2;j!G3kIZ1K!v82^Xpe2+u|XN)Kj%a*3to=7v$)pFzWT{^aDG@6I?&hb#tBnhNAQ2$9D(cl57u!Y9WXdVmt7piu zE?ee!DTo)0^kDVDA19Z12CSZe1ris3Gw*y2z?(b>F$@+nm{#H)NtdpAJhVC*;RjJb zXb%z z)WUf>YEcFC5B1M;!WE4I1hmia7!CS3K%Av#0np%nAn!J?UEd;u_I}gT?E_eHB@)su^X~wpOJ|4QxDu`K_ zU5}ZtzWLnUqXOUj=L7P4piz&-=3EGsx5^^tDW*J2fmAH%(0trAW+2|G9c)L zsfS~lCH>9UnGouTXJY!9ABlUJ5N{G)`u0{!R=+6}ql({i9H^K~!1e4|r)WT9RiLcj zYb~5`KJ#n0hy$!`CEw=Lpb0=GbJut1F~^fYGu?Uh<;PuBzoo~mG3w(7#-@~F17{$* z-&*=Ty!tyw0XWWWG8&e2F>~cjX;@a+2kh3tf*ykLjXIkhfLK5sR6A+|e||2d8|p{e z9U@rWU+%NVXbU*L84E4BdN{~>s6202$ids*;Y5hF@)I=_IE668*XujWI z9*xeh`hD*fX%~%@YFGoe%JMzp0G7w*Zk|m3k%k>FD?noB@x|(GT=AuLXlS-qL<i(}Q)4 z=XLy^ufm%-9Zj@`E)Lg_2Ow`Hn+APwM{46gTK~u{$ZwrbTqB!wl~>?Xg~xr0kITHF}0(ewDvggUPmTXDF=iW zrnLwRVGv~5rTTLv)xX~gD(kjRZX%Ah9a{YQYP-(Y?A}a1Je;Cqj_x;Ips-uX6e~V( zZirk#Uk4{fZyM29eltx=7tArn4V_jYBO@b+lmQv$$!BU|49!U(pWMWhBin^F>KOa~ z+EqTxUZ57_Je|4KXC>*sp8}kdsf`tV$4^WupvT%@ zzOa&OcB3zYaTnkQxPsY*WfBKJhd>%S+ebOl|tIS zeSgu2@ok7`BEeGZXdic)$~)F}O&s^p{uVM>@C)%^beGS~Ty=HTwVFDyqGQ@O0_z`& zkLJ@95tm!HejSI@2KR)gpfCly}WgqG5DM2G+q; zUn~cta1iWjKt7r=_;FA%E#J3DT-CW%Qy_&f8FJE)j{c11> zqR+iJY<(zu2#ke@tb+7TY&?~H$Yx&QXG|0i1aTxHd2w2;|>Jv+cZ6Of~wvn}4*|Ka}u DeA$+( literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable-hdpi/splash.png b/android/app/src/main/res/drawable-hdpi/splash.png index c3032bc27cff11a7e91ba6d97ee616f802c0b09b..ca74360deec91370c88e6627a50df7e86740b571 100644 GIT binary patch literal 6490 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 DeA$+( literal 5633 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 EFJ?gzhX4Qo literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable-mdpi/splash.png b/android/app/src/main/res/drawable-mdpi/splash.png index b5edeaeb9cfac8e6833a63fab7a6ddd358f9e361..4a9e3856ede46d1782ee10a960304b5400549ab7 100644 GIT binary patch literal 2458 zcmeHJYcLy#7EVGu>V|atxLW#HcbU1AQnE{QMO(H~N?IvtRJ4uOn^DQ4g!HAg^}6k@ zDkafblGLk8ni7)BSn0MR9tp(_T91f?G}4e4uKwEDo!OcD>;Bp~bAEht&dmAdn{(zn z`KaKNkZpUn0RR99GQjUF002DrIn7J}0Km>$jbs48{1Vdd7&-&EBrZ%6VyyE9kBx(< zMs&as5DoZ4K;dLds?qn{fbUL}2KDZrXp-n`|A`Gdb>!i!PC3O~7c^}q0zex`F7RTf zvDv-t2M>NnCR+nRm;VC)FAXlcHC|{N(kJAs>tJ2pms~)`J!VkoKYV=)06@3jgVwpF z30B3);{B1j%#f<1V;$MrYkBD&l>!PPWqFFr)oN9eJCw9_otiI|O6M0vb?%&&8D_20 zy;Nix`&vE`-h`_p5#qn>B+5q0Qe-TfZ;}%^xto)+1efxC*^>UsmXGo}+}b!ZfxEdm zObe-)V5O{GKipu0H+1A~=AkG%ngG!c1kfjJ1gfhfBCq@ZIGkD zINGsa5?0RvotU+`AE&#h3b*JR`(*k;;#e;y0=>7nK(nsVWmuVJeCtnqhY|kS$uXNnC|ny zVgVEJEnBD{IBzdcGYEHwk?P;4vwr~ay)yc_%f$x}R}uHTB?5MynLRIL>4B*6d|kQa zfUu%ZPajPoL7BGI=xjLg^>hh7IdC+QTneQGL!S1O4m`mYpx{20a0h~Fp8soqs{_o2 zTGK-dRnVB=PaW_D@tZi^XB>l#utl6UiH*BO8~za1{SrPi(k+NF^wHV?``{Vz5ZsPs zmum|Q12!O?w22RAb9fzfnF}6;Z+ivRcTE-(64E)l_~2MNulT^Go44AI=-L)x0m+Y~ zJboR@ptR&nCN)KIeb|1}C?2P7EPW(X^5P@GvHxxXg+UAJYhVB%V%?the+x$;nfxBC z`~~>un?nD%H<2ZgT-m47(&8(I)>fwxG&#@nla*IAl;62qrgtBa2;BbF49-^$Ke!6= zm@USroO)fOp(KMQHEnHKd&h0@p!J$2HP2hCZ*hb z0E!P@UUcEU3y)kss=i8yU%J36D@uBAeN7(ICu7F1y%G?!cpC4G3Xw^yysk+0Vc4zd zIRgFGz3I`#`UXj`lZvK`xAQ&Gs7WRP_c=X3;FBG@frAlEo;QUZE-Z`K0mODQmWI+V zk+v9pFkP|bF@}1}a$NJ^%Of#GC=1?=a_uLjP&2^a^`J4H-CFm6IjkqJSc9e~Qfdo2Z+K ziQ^m79j4Tsx1u6%d-{`$-rI$4pxHB|!|_#%*!p%qnwkwGY)LoZttlksirZUo5bAh6 z>;5;L%~eOvPT|eBcD%~vc7ip6Z@d77-RpfvLmt9!fO`Pt`Nq zPV!CYhf<;Wg1OrNY+Fo|U&)`L)o6aKHA0tq+{1ob;`x%ny6JdaKM5PsJPuO<9o2X1 zW)9;KLCI0DIwq5}#yH(JJ(`T6+-dV+_1B8dGjIQJ<-RHPts@A%IGsZ3>-;()wE_0X zK8Zw7^%PK28ytKqm#yGx-)GKM%nJhd8eNvCYZPwOYMfR`S<(hMM?{k0V&7-t7aZ2* zR{?J;-XM3axE=SHpQ70yU{YeA(R@RS@(F7kKXh7n3{Y>gF6&@NLZ>U&t^9=O- zzV*jDPc6SYT0OIRA@^Ptz+&~QcWV4w(V>og|r{;#nYT`7nv?}?A=MKQUv!) zrExlELkKv|+^G=%YD`{=t5Y$1mRe EFJ?gzhX4Qo literal 2245 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 literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable-night-hdpi/splash.png b/android/app/src/main/res/drawable-night-hdpi/splash.png index 8b5e53c797203b348145718e950732bc7137a2a5..e012004d9c0da07bec72865638a51625e41d1b78 100644 GIT binary patch literal 6509 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 literal 5640 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 S(0;gpb7x>aji>+e{XYOduLX1f literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable-night-mdpi/splash.png b/android/app/src/main/res/drawable-night-mdpi/splash.png index 56b6ee835212a7cc3eb4a41228434c7026168c85..b8bad35bc56256d54c4896efb51979f8602c7045 100644 GIT binary patch literal 2455 zcmeHJYgE!{8vjFiNh7T`Cr#6=bad9t5=+ZVX_H+9Obx}%^%e?V@}QVH2#u5FWaMt? zSHTSIxbok&o9=@BF< zaC*ic!c`Dp`kDMHs1dS_EE9+eUA;pIKdA*hworu#65Dyk>3>|=uFla?SDDmj)(7&?R2BWknA8{{CN z;)`OnXG60h=<0$~J=QWDnI)0xnI0lh@#~A*cEX8QZ=*?N?wReG>*~+ZO=($K>tZT2 zsv}iA5#4m6;K!FSM=4Q3KfkU#dmpc@#X@f8ZSt0JHK}gEg-ls8ufJ9i!<<9IN(>Op zQS7%)A~7HApPVUu_e;D`6bzkSs&J}CDVL+L{D`1l1^R~oaUcAbZtEVMk}V@+*x7+V z((?XJ5)3Ntyr_Y(ca$IOhYvL`M;Z1^`)!VW^$e#ZB+YcRC}A@PiL(wqU%O^u9yGWN zp~h243uQ+vD>+1QcI~`=^*bITOc%N*L$MMjCk$3k0?d6L6f>XPqLII$@(^wwlqp;J z{J>9>msZB>kwi6HH5tzN&Q-;N69U>+LqwGN=RC&o`=*{aDyrpi4cIy5 z)6tZhjHW#w-FISJ>P_+uE`3$)dhFDpFJbhg^F;eOdbMAR_FC^-&-eMK9?MY;tK48} zPj7CXgKr+S(0M0qAF-DKOS3$3N84-mOPxF3U*#8zc_l6dBe{aipiVt^iWYJo^0DI!$yD(tm^4l8SOOUt zLt5}z;RLWVyO8_zYBs~sBw=37;1uhR;$1+ zluO>EMKH17O?c$9uU9tM!8{+GmZXVsWQ5_Dn_8|h_V`CcNj%obc%wZ>%6pzg8`6!1 zFRA&74jj@O>L?deV;)nq+YT!wC^l`lKv zZ6!{DVcwV7?3j*g;6Pj9T6cChgysqkY-_n}d4OLxWxkr}k7NG4ppOWv;Hd;=ZbO@6 z7cJB^oSsBMNRuwYPn_^>D5;K~H->G9P>*qWx2_w`(Tjk4{@JzdqW-JB>BmW-Ptuh; za`s;It?$7xulLPX#owKyGk|-Y&(hKYD|P*;q0v{?O6d+;D;Qf{A0fz}Ei7fOQGM`k zg=+Cc))NJOas!*LcHTuh5*?ZqZULF}w7!%bM>#?1(j)yp?3lWP!B8vf019Dyj)Vmu36>nTWIc+1{|$1K}P!N);1&?k6)~F zF*2{{c{_uqTb_6jJf~z71Y<>ewTsr;cj|x#vIJ)`h87N(^}{bn?fmp=8{&*vPxdEc zaNO_hPxsG4-zbZaGLZe+?fS|P?`=|8`7kCSVVaPLJEUZpPM{+ixqcouS|calZCh;3 z1qxPTC*EM&O!%k^A-vxzPrwJ2MHAP+V@vBaoKaP=G=4s#%ynE?kLOHmr$K`;>ffl` zvDP7-S{|gTc-LC@t`}!eW%jl~FX{TD4~f)7^;qt$fR)2Zgg#ts8)$iqQ?3aRiK|)+ z-Z-7Tu>5DfTN8S?|L+YE!cmmTkB59HGMP*unPxj`irp~IA_pXhuiyNgX2mK{*w#*cYpXJ^KXXvzX`HH>^^5!7pPob S(0;gpb7x>aji>+e{XYOduLX1f literal 2244 zcmeH}>sQhV8pnSik$KB<*YbwxPVUSarH(|pYFai8GiiJx2V$Z&wSI_rzzUO)KJ?A;! z=Wbl=c}F{UI{*M2QC~*K0|01Of&g3S?nut5zX|}h_fXMM3AaExrS+i$-uun$HwH)~ z^hzW&nr-V0@{NT212}L5ybEvH4m}3642?5QK8grej?s;M%`em~*K~uiRhEt75T#i~ z=9}7Ve9in#4?zA0!1)4jqzs4*0I`W+pdSL<*#|&e09(J`jQ=T;^QK?tMS7z_`;287 zDDfBfx;?i2uK|7wUi~mur_@dH_gkhVRi|l4@^sQNBP{=8)`o=naW!Sjw6$VyWtqbb zG_SQy-IVg#`Qk5xdTuYv%A~El>*btItfD{QFsiJsH$nlHWhdQ&L_A$s7M9aT2g;F| zUs#vbk}7K^KdsEkrj zg>+yeYFj&FJG@d){dIh%M)$F?)JI_-22p`8XQ6WyH4kV$+Mv{HR9Ix+Je5Hv$q?^Cs%Ax z)lw=TPukvV=;}DMs#kWS2`n zwf87KD2cS-EmgE4V2TJ-*tuP%Ki%KSGlkW!f2wH4<4iY$Lu7$g9|VlaLj?d3dR`f2>_4oW1rGZ)EoXa`23qGls5%&`Y3aJuzszeVS>59}`U}yz*LOWZm z*v^2u7uKhW!@eh}tMY;TUr2-0`+pX#q$`aVAI*j5b4#;52WuLDcCwiSf>Hj(+jNgb z2#NQ(1&Fj&@c;Uya{DOF&g*!Wv$bS&28}s*E-pMB@1`F2O^g$f z*?mm&Oo|dRGcPLc?xw92 zS+*;Wza{o`rK6NntYh;;AsHNZO~GGNMvTdRipMT@_dF^BkG$ZEgD$`66PHh90benW zD#Q~>+_v}V$GzG=0o1gqvTL)B8muKmo7pm_>f61xQ5Q;+LM>sGEOOsOC4$Owjv*DV z-J#Q5S4*si5_oiVH?X^bwTT;!Fl>$3z_exAD)cpkb4Gwbp5KLarM3Uk&E(HNKet&Bxctr5spCA^-wg$(XhMe5im-wF*f+-CTqP}Y^6tg7S zlK>UNZx#^f*z3BOCu`~br84Q+wp5wAFFGG9n?1wu7@bl)P(rJv|4gJ2@g~3fAN;Mv zyT8vK4BX_E@^T@0xb3eMpiil$1w_@%==#2DK~u+}fS%kYHYr^6RFOTx00!Lm_a8RB zYz_YUSYhk>cH#NF3ghF4ghb1acL9f3Lm0pE(8tdPdk=OFtG$`IADpGo>aFLC<#v&7 zo6v!28=}4aPQqd`^b)6AdTM+Wr5f5Z)0hHywk2j=A9Xf4imN;4;GY9p(mO%yiweiL z(!Cb89POoN`3H_7uJa3ZKTvusgJ?uDLDE9LOUI~Bexc|HMc~+35WF~lykauPG PI{{GVVxybS5byj4rY@=) diff --git a/android/app/src/main/res/drawable-night-v21/launch_background.xml b/android/app/src/main/res/drawable-night-v21/launch_background.xml index 3fe6b2e88..3cc4948a1 100644 --- a/android/app/src/main/res/drawable-night-v21/launch_background.xml +++ b/android/app/src/main/res/drawable-night-v21/launch_background.xml @@ -6,4 +6,4 @@ - \ No newline at end of file + diff --git a/android/app/src/main/res/drawable-night-xhdpi/android12splash.png b/android/app/src/main/res/drawable-night-xhdpi/android12splash.png new file mode 100644 index 0000000000000000000000000000000000000000..881c8f82b62f449b4d7d7932585b7ec2373799fa GIT binary patch literal 6188 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 literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable-night-xhdpi/splash.png b/android/app/src/main/res/drawable-night-xhdpi/splash.png index cc75df2bd07a6ab7e90fd55beeb44d3c9eecaf45..881c8f82b62f449b4d7d7932585b7ec2373799fa 100644 GIT binary patch literal 6188 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 literal 5536 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 WiJj@vGX{GFW^~=`T7|Cb!~X+oki5SD literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable-night-xxhdpi/splash.png b/android/app/src/main/res/drawable-night-xxhdpi/splash.png index 296d044780c87d7146ecd41b9292950baf406311..7c3fc097f9a7aec2f6180f7ff88478ebabab03a5 100644 GIT binary patch literal 16868 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 WiJj@vGX{GFW^~=`T7|Cb!~X+oki5SD literal 14805 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 diff --git a/android/app/src/main/res/drawable-night-xxxhdpi/android12splash.png b/android/app/src/main/res/drawable-night-xxxhdpi/android12splash.png new file mode 100644 index 0000000000000000000000000000000000000000..3d6ff702ac0db2a0d14d49eb30c29c673605798a GIT binary patch literal 16094 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 ZS?(pganrB^|AQR>j4zoRmg~F3{ukT4^SuB7 literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable-night-xxxhdpi/splash.png b/android/app/src/main/res/drawable-night-xxxhdpi/splash.png index fc4eddd1ece27aa9d05dc0888b23453dba95576b..3d6ff702ac0db2a0d14d49eb30c29c673605798a 100644 GIT binary patch literal 16094 zcmeHuc{tSX`|o?kV8$NGlD%x%mxwU75@Y+)VqeNu6j`&6y=19qY%%%>^+}AKWG`W8 z6xlUo8Nyg5%NWb=t>1O7bDi_Y`TLyf^oMy5^DOssKlk#wU-x)qX>P>I#Lol(0ITs8 zLn{D)p^tyy3;+Nmy;idW0G(oEL%pjHAS+WdK?2v_pLglE+iCR_Q#2G2h)II`7`X^Q zINEh#({S7woFL=^)DL{iE4JG*ru?}k;cWe@U*-Qg5~?v6*iQM&@BfyE5p>oxNJr-8 z=7&TCxCu~u=u74~e$(cPKp#JQ|33bz;I9?@b%ejM;BPoY|5d?X75oJRe*wW?K=2n3 zfVtrRI!9<2s`ez93n8PlcJSGK$it2FMrSC{rw_nDX)VqFe|rc_B9Ewq>Iw?dd9I!q zb&+;RJUZN2VZKmqp+lYPz!E67^bOBP;0)ropfWP0@Be3mndj;qBiC3kI>q8Zh)N($Nu$X%nBr4dRA(gSXj z3JOiwu4}G@mdnj5QNhmi_fP22OmUOYNji^fh7$v>KDhf!f=N82r1 zgx8V&zVr<#0DL!(WzK44ZaLePV7A)wL!otlbA_1tk5pVgw}D45hD2LyMdm3vR^O;_ z%Ks2S^(SX-=tP9>uFu>=R^JlIAS^v0xVLQTFvX)AQ^S`IXgkCt9aK{mdHh{;aDGL! ztTY`1gu_qblL14zbXa-rC+Ejg|12JBcdQj9s>+b78NaYI-5yue|BsN#_y&my?VlRG z@rlQCZT1_ZbQYhZ303=M#AQkWKMwf(B;4{&!g(T!aC&E0Nm>p1a?(Bs-d=}5yA)YX zr?g2DPcs#ykL8Qwrf3iyqIRZ2Jn1l{7T6Z&VT9syrKPRi zjajoHWK)c#rd&v8aDEm}4k|L5&8;o{ppJ9TK_Xw0?+VE~UXRb`7t75@mnH4-E5CI% zn-14I**%fS@NH8Y=E>e+eJnl&(H1c;lt){(!l=+CNdmE~-MZ%l>6|0CzLz{Mz`tOR zYdP4qcVz67$A0e{-kU7gU!~+g@R<3qD_KL8udHi&;HO6PcS8eab#iec)cb^MkdiTv-N<+4QgNH-9Y-g8x#!;)L+Fre61>kc_ib# zr)*Y`@DzdUHoBNRd=eH3PWNCDq5#e`hNgfCx%kUBI0TZXJ);}zBPspro>&4*kMH&9 zXQ<-F`P53`ymHjy86cLEAw8*xBwAo+{qI_J5x$z6sIE2L9J+BnYtf!bg&c9nqtO3rHhR|Y-~rAS?Y8y?Nv@j zHg2l-Mwy0wDQ19TK)+)y^>%R#6vWBUVR#gr7RU2!b+TFy_m;;B9AhuoFgg;JpOL1r z;am-!{-6cEthrc`r+uZ{=_DdLz8?QnKK5b=Is0W|LO}PYu+%o~XylHajSz%G_DRgG zB&G1su&}V}u(8u#7yb1eG|gC?Fp_c4BGjtyOXFnUM};ji#JY0=?H!{suPoj-RH-?g zs9{~2tacu$a<_cuColTM#hEJ+O=VX0TiBM3wab?pTOikk4?Q$N;2X zHi>U23PU*hx(n|&RqdbsR3YYd5Ro>b5Dpbj=~volo5|T9FRxS>C^AYnkD|_JH9E8T zqycb`XM7|U&C&Azzz{LRGI6}sBZ5^&-4pe`t6%9E7jVp%4>D+E(343~8aQdF$OYv* z?P?Uf=3WO@eym7F_Vf4eKyp?`EIh_V zgLA;s+6#Lr8?&DD7#=g-0Mqq5%Qx2=LABcLOo-RTu^@g`8>(Y3x$t9}15S!^2&4n> zG#3`K9M8--eG!{P*{^1$vG?d3v}f399MJar;2v$tc`v>Q|M&08ZjC0Gm2r0XJ$dXI z@J}Z2%>Lb}kQqO4AKmT!8HvmA%*ZSLs^=Bc1LY(3mP!L!S!~3^5B<2tlH@X6(jF#t zf(`?jH{_dPSAWXk#jV$-wW(3V%~Ec$+i8|M=pUrt=?d^yi3kwDt}v zrhjh}uRy?v^FC~g+RQm|=y$p)!$tF@s~xB-K*iZ~{%u8zrae1o@pL^`fV#;Sk54UU%{I|o zB7O)xb2T0TTDrb;l(J3In_{~5k^x2R{d2s2l>$!FAFWF~I9W=>f!IfGIq08B29?sP zeKLZ&IjLWwblZ}YuiQBDlagq6(S(X*U-3vfi4?G6C>-OuBBR=OW+xQF5h0bQLmGo6 zJ=@b1J+_jCC}~_6I9Asq0UT?x-9>q#E@x6zk(_rauRHd0W;X37e4z=Df;Eq@}wZ-a?qVyD{vGtS;+ z-uH>V%j4=N9_=nVjcao%i-!Dl=TNP6vO!lQnyUnU+w8;)*-=e)e91_J9thn&^e9Sg zSsXHu+x;Rzjl9%~sFPx!0P|hJNs$2LgTaGmKV_U}A1-hk*gqwXS#f6@VO;Npa-vtq zf4)Mc>`CTJ7NI=9j41!YDv9QNDSRi(gfyYM_8I+!^twL%r<$-?svAL1hdke)K1(Mws^1lbo4}9u zsg$wK3pS@A91hk(xSXKTWbTWIsNt%ab*Xr(!j=ac|3qO69nv*VT=4ZV%&pkp-(HW|Z;50h(@ogTxf>k=LQOcllJe%j#K zOZv)uinlaWoTSBuEq7mJ=}YA+A>zg-z6Y3<7wfu*H4by>&wb2^5PnH8OBIoF9`lJ@ z3F#!dv$H`s>?@1ihp7%o&@-Mh%B`5kyH}Jf?0vR+(4Yg#-MLujmGx6J!J?Dyyo&3s z+cw@ax$TYeg?IT*KN0$Qwjti=mht@J{^@WZagIAerVcmA(g9jro9aiu2QAXKiTI!= z2bb&wD9w2tRvia&fyjz?%hYqTI#0(7slKGEmm9zg;m~=CVbs z&2w+XV}O3hH_h5J_-LZ2O~?_jpI}@S3y`O~=;5h95$T@lC>U@$yiXOy9 zwygH_6&?-;Fp_O&CV6->_BioT-e4l{G`UGe>~^HIdQ*0=H^qsP(@*a`S3?TXVyhZB1DW!$sX+vLNso4YEiiMsF6E=Z`z?!yH#RxSx? zkURnA;i0le7Lxi=rRNjj_QO?FFNTwirEb_qUH!ufXMlgMS?l7w@iT-0UZ^{#DFC|x zN^Def3O=?Tx;#U85_z5TckK!yb2gV=cX{LY(x7b`Co=QCYUK9VxCuNkEKG9;h3=^h zK7vOdKHCx9S%OKjDnGqxEbm|juGMYu>V6!dR$fITvr_3Me#vFLaHJ?mhZ8zK|p9p}&l zEp*3kVOTTm#bG9;u9&!5RQGd^D>uaDtY|ebs6hcm4&Pj=_6wVstKMF$$s-TqQJI>W zk8Ee=rf(uls{~4C)^wOe?hfEHU0!MI^KD-A(EVET`J+2bSM|1lZt1N5Dy>Y=Wbo`L zT)`~1{S%nN9&uCd-aSahrlXeqFbD4re6eY;(}VJZ!x$G2ksQKRd-e8E?^e&Y^1Aso zL{UA*d*bE6v)S@q4KDz={MQ<3@3U~r{T0b-7v#}CWl~{w*yG8G~2iLIfZbQ z5~a(Ek`x)ow0i!OX}>6(MY3jlW{7&R$HTFo4~p<4scYO58C*;; z+6d6jp~tg)%e{C?md-vc;?V!xFvfk%-UDNw6+53J>Q}6%Q!3}b_WdA28)3FtyB%KZ z?&7BeI_30Zg_dlZxas9(O1~RNmV9BYuT!4B6QGJz8CaW(w4oLLJco$!f%WIQ4}4g7 zluj8!st@{Am>*PsFSl<<2BjFN*ECmey~%O=u(3H&zR+P1S{UjE{8ZU}8EELPvUona zL>}C(KX)717df&?ngCbsRaOME@D%_?QoS4HwMttpW?tM{9(mg$&#g=820qdbL#U?3 z%wDUdD~@wt@-GIo!Wt^iv;QVoADPaA84w)!4Z`|ofikLIy^Nr+CVPpJxq_Vx{eYHo zz%P{tm3@8c47zetTt3!=n+l~!vorZ~whXPqX=eE8nKclQ7K!g8yose5`pS;XOd{o- zEWhW64|Cq901wZ5zlr%)D;9yhOdbqH3Lo_C$W$+*WbgA2e?8~8kl1(%;Gr0n+3Y^)P1kp1LBjairQ@W*6l34 zOM}fk!(Lj#{Je9*mw$}BV5qwehPlT8{BWqs&_njx%`k6b_1T$gYLW{$?i?Ea;7)(u zWBoYHo}?*Suxp$+fEi>)skqn{H7^8>3z*~2x42=V9n;PEvYqkM7w|8l54J`cof(*GhNqd>^Z=No z5Q|Tz-Nme7LnHjwyU^=={14P{^cYgdMbLsz0F|uelurKev&Tt2JBw^trwhQ2mGp6i zXW}KGDKLdp&xpjML*dS2Oe2~fz}l6o+Sw-wNAdFkSj$rNlkY#*f)EbC6cin3dj@**M~R1RtMF*_d8;G92fROXZe5?GQ;T2)0P%Kn=C0E}paahc z@@{`@n#lkZ@BNJ<|$uM*nmAv?1hUuoN2L z9YXpfh_A1Mg_}7`G6cN}-q6YNpg*S;VgmKfg>F}gdFS`8^Z5EUEL|=-ECVbB2%m%= zr$2+3MC$Z5=-SG)cs92P(T4$G>A_gc5PN(>V!+MQ4kX}3mS?9YHd1W|kB+mVYd>CR zDGx#$X+3l=p#yebtNZ>Kg6XCUX={d3H|Hl6=v*pcy6dGSe7NW%8j(o^m@dkdNEt!` z$4MNU>(R!o3$*F{cg5M^Mkcl*cTj+hDuiQSntovRb2=%CFXO@bbbHSY=g9LrcmOz6 zE)Db=I$^y(?1}<4da8s8up(&&Jp)F{}ffqz^Oljn9ySM z1M0*GmH%Gkw(!S5J!Ui@F9F0N-M3}vEj2y)UjdxpT?$jcLLe8AqKVisFdXNWl`D`T zPN4V+>I4W9k^Ki&0Gi%=IrfXrLy30a5F}qOa$;(HV1n$zI^5v=8+YEGY}wyLK{(pz zkAvnrz$E)Q^vY>fz%NHO#@CJkEAH~X5b|dtKQoxz;p#wl=e|dYO z;)`99{ai@TZQl220FAGai?d*SA}@melW(#VoUhY^ND4rw8y`?Q*^zw*$`ZxQ@M$pI zUXYY@ePu7vZu}T#M<~#~X#ax&@N>F@jTc|az5SFZ&Uo|eBos9E=nSZosHHU|Q&FZm z3}jlUV4V(lJdeC*`p`iZKb`jryGw3b`w}aMngPiOzn5K5sa6Y2tUFQ!KvTX+XSBUC zhPKMm)Ap7tNKw*2HF%%&RSy5Y1CqIQrOAB}P~0^$)Q3{c9*Dhd+@P|hFKn3@e2&xo zKm(hO)o-wz_~|2^eccP#{;GC+easV^FSoUDGu3h6Y4JL>sos$QjEDlUs0i9>{d0Ot zCg*npNw<6vXm@;MF1|Kc&y#cIvv9OlW5`;8F^;aAbZ+hK&M6EC>9V}ESbeU@1V+`z zJD8F-Wr1E+wg*63(*7Vg12P~KZJgEOzV z!uSzatDD;v%TR6Gb3GZM&fI>|ATSZlqpxGoeX6#`0i7~0e|ln%1*%qf$sWl3;zR=+ z?+WDo7^N4~d|9fbi4Cd9P-xlxxzc&iF!d7k=wzW<%0?o;4QEB4;=gH$eei3W8;!3+GYwCK5qazGkzvI>iwl->4tfjKkhMKaNs6 z;b)@Z!#Nhqvc0aNQJ*5{qNpsxeU6yn+_osEp~TeA~W0%SWL0F~t{9kw`7vBHp`}MiCh=>1#)N^&C>1-aejPo0y zCo?EM^@#QPx*>YiSKG!$fxoctg6PC|jYk47;bx7HhWT|I3s?>(%0BL$jzo2}sB0*> zGgrGNor?%g<@#s^gOuq}nvpxSdS9aay+SO>SAq$nX!`{5l#yNNDi$8>6g3h^S1d8w zVK}PvOBj?Z>UgzxFW|vX`x56tU^iH5v26E%qTat2QpWeCvP9>lSlhSSDGI@U{BrG* zPLGNhVdB0C>4mZl!P~fgXgK8&Ziul_XFRs>77W=GudAp4TClZ8OdT)4dIoO7fze-_ z$7emx&j0X;Ta)Uj{8r;LQT1q*8);AUMA)=UzV)y0B?CQeI&p&@S?!I#@3R(y9fR^XSyrv&=_=WMixp(b`a0liOr8 zLtm1pf`2|zRTE1RL&S6$%K)fMz18d6Xg*23G;xA8Ia2+-VlX!AMo*h|g}XG$UD@V{ zO2XdQ@X;=r62JL$8SE^nuQkPWDfb%m5YKE`v?$Mj%Oz%bQ}|9#xwp-LaU-$nR8)EM ztzofG-IwU^B`<2NShLK}J-^@Eqf=c*B~Bi^58olv{_)&zs^ve8Vv0eF^Y4()6FnjVu($8}EYabla)-au&F(7RYmG1t=)STGAZIk4H0&VMdm(GRv=rjc` zGZY9I^7&`urL&X4TfK11blO#^SdK9DXM$_byP)pS80+rJd~R3hzhL7kZIr^kWZL`2 zL!v#q_nu@82mBAyI?DdgV00D635B4Zj8WeSFt(~LLGA1SH_jA;?%Ll!KQZSID1r#X zREh?1Z!1^yFu7e}f!kgDTGZ&w)Ha4DD&sq&Yu=}h{IYP2XSsV-^AO(B@t@WbHL6Ti2PfWS^J~V{` zo;?A^lA!QDk^CE|NtQ5hyuL{OfT?uGzqc$zrWe3HM3#oS4NTx4hd{M+zG4>77dqA? zJ~oRVNHF(e6KyXA6?qI8MMOE0o^eQxjQnXFNVi=sp18&{p!Ll$gVbh~)tQpfZgm8Y z$+p6DlJq*qP`@CEJ-k^}VosE$pJ zzVWC!J-o_*TZpw6-CieZ};2Ix)fNbF($25%sNj*H?5>`MP(x zm~Yue=!r(iR&GR0e-1^H;Iy?gp0H5cB^6WBt#>>Ej;b_=WSmH69 zNlrE6G!p&jFC76K{;a`whOSTR-33%r9x3V#Y!**wgddb0#A|wi@aZ|;XY?M&t217< zn<2(c)j?!H*nfQf_h!LDPW8#y!uej3=Ey(uWSlHiM5^*M%$*%b82A7~0yMr-$6pNZ z^W{Qv$qagpiB^nC?CtEbc>uikte+*k|JKSz#xPCp)HI-8+tgDr`?KORnx;^6XgsBI zMWhPBDi$ei2T7DPOP&{b?_9Z-x2|_Fl3RydDfzOwc zbp*JaaXKJrgjTBN2Ma1KTCc=YjdPehA1sk%(BUtIToR8Df&9HYw9aU+Mg8NEdDE_dfJeJVFNg zx8|wZ5}jR~O0ENk{!`6iTfbH)uMcCkz#`!C{ERl!GViB>rKLB`Ji#l$d#@f`{S62Z z7u^Iicybk{;B2D zQ_FXTE*7zwux75ISQCT6hFdj`u?`FxligAx!3Hm{xT-R}jF`uQT_IYFBLC670N~r)vr4*y&O<1 zfBPT0`91!TVeXO9^84DU-m;gwL8}@O@B@2$*+WvA+xcIS&hUKpq|17dhpny)Oz35P zLP`3num9m#4UIs;>J=EXj4XL*Ij=dWY6R=F-G2wE7YCpo?!ipxVvQr8&9a+!Is{zU zK<)+r(EfiP|4*pkF#2M!2pxE1irvILA!k?cD{y^?KR2iWIsQ7Fq9hu81r}f+83(kz z_`}9!bLk%cEdUA!UtP>WmgeuIzl!*45ugVCy2jra@i$oh%^CpuZ~FX;BmQEe{}V{$ ZS?(pganrB^|AQR>j4zoRmg~F3{ukT4^SuB7 literal 14140 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 - \ No newline at end of file + diff --git a/android/app/src/main/res/drawable-v21/launch_background.xml b/android/app/src/main/res/drawable-v21/launch_background.xml index 3fe6b2e88..3cc4948a1 100644 --- a/android/app/src/main/res/drawable-v21/launch_background.xml +++ b/android/app/src/main/res/drawable-v21/launch_background.xml @@ -6,4 +6,4 @@ - \ No newline at end of file + diff --git a/android/app/src/main/res/drawable-xhdpi/android12splash.png b/android/app/src/main/res/drawable-xhdpi/android12splash.png new file mode 100644 index 0000000000000000000000000000000000000000..2c419e56e8ec1cd917ec56769be4c96344834d6a GIT binary patch literal 6232 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 dh}fhIFsvL}+;VF zg47UDkP@mW2_QX`80wkJ@4q@X=juGqf3Yu&Kwz!8#vF5uw~RcqFf-)*hyNcK49016 z`GO@3#_9z9J9q#FgBia$lnsOFe=xeBZ*`AlevIQ&kxQN4a;~@O3HX`Y!|IZEm6Co- zD4uocxQaR|+JWtyeErelve6SB@oOkoi3=Qp?30Q(;|k-}@04B~Ptxvm7{hURzRoU; z7&6wgT0gg1Rm2#+`7mf{r)Yh=hf$AVETuCa@AZLO%l~%s2?PJbTpq)~QY@bR`}%JL z{*A!D5%@O(|3={72>cs?|0@E5%KksU&^AVVeZ%;!l@HvwqY@)qaebs2He<4n4;J{< z+7{U#zWwVI^!9q8Z-fbqHBleD13M@BzwdReeYHn#LVIVe53##BU)p1~(tsYDa~SMW z?lUEW@5h@CPU5IxsuMLUQ}O0zD-+XOA)}xC$#+Z1Hj(=eG*7J#PGzvhlX~{18ulrf z!5+@Oj_#e<-KZo#gzFAz)7wSJr*@a4Y4_QMJa)II_0%v-l4Fi^6j^1^p1kjn%-1fp ziE#3}7`Yn`%$;5ngzQ^|Ji3lHh%h}u+p{;D7ei*O_^}SnIqq$`O+Mz8n`nlj&8#Og zmLD9FyT0{`^{_!?j*@%bw!5C*YQx^nQm%9qRq3?e5;JIKS}$Wi4Z$bGa@av%$ck9E zF-)tTE0S)YWf+dgly>#XG;Gt!TH`CRZt+)CJ#8E#*4@U@(}L?nl2fO_plszR{U>8t zFl6-G_N+OEznob4h1&$XM7g3iRz^XQWK+16O}` zpzTRX3mLD{enAZj84DWp9^a;^;g_h)>5PWqdrn_nRcRWc891+7Zg7jd(0Bg zO4m@%IJR`nOoK2#Iv}U;n}EGcE4WgWfqe+pK(DMpciBGsr8Zl#M-rW_y^~OYQcC={sGBw~daeLlWXsQQxf}UB zK0Gu3VZ3^O#J8a?5PkACQ;8Pz`$KMmlA6}yCzqtI8H~oX|FCB+&iYsCQoCJ@e%um; ztynwC`(w*-vRuu4?~7A<^$X5d@YsK*1KbJ{Yh|isC6Om@bF4GbJpu{6KiNJO;dnQC zBN$_Y;k&CD2x_OK`F10_t_4k=@4`MlR!MliQ^{j z9U`P&s>szYH*s5BDh+cU5!0JXWG}`_ESB||dBYFgh*M9{4Ekk%iF}{;>&HX5 zDn{WooBRP|eoy=Gl@{_~!|r-Xa_dC%P|d{7VhK-0kM0&0cahgK*wLn;R4MSwQA2DR zE>cb<)d3CLT8`EmO}+Q?8QEQLi_+UU%#e8~r)6*J7!ee(z0!t9`Z#D}7Ai)3Tz7j1 z()CYADIB2}CtI&76aIi2p_wCO6D?A6NJH<+Qc*u<%NHa%?7GgfzVrevRe z>ErOh!#FWom@3%~wV(BHven(}@A5ScE}2%5p`2t#z3oYO%KE@fV&I!A9~9S=SYFiQ zkCl*BM+(+g5AK|XuezrN*`Ntqqq|#6zV4YWB_r$gj5=Rac47x-L=SC=n(w&d#k7mo zk1P3!*%`#h#>m!|2#8-6DXc9q*nNx$|LnsDdQz4zVSh+)on_JIH4~VLp{%IG*mAqb zD{L<%b<4?^F@eF9Hgjny8wv(lm4el%9YWOljTk&Qk-&x5$V%b<_3@q=I=kd%qEE48 zzB!)~=9@2@{HB?lMfc-a4hIhBE_HCh*T~UYxW?Y+GJ>)+Bb{peOnJzkMPo;z2Fcv5 z1EtRxEvO_mUCRJzM`xhF>a(kWcm;#IIP)~lNJ|d3Kl}}<;>d=@fmVxWgPdxk7S&e@ zOS?6_;hv^Oo?|vQy;Z&na)rqrlBXyLn0QajVl?J(f{THFvemeqcp9G=V@ppS*f|Hw zLTGQzm%8?A#p9!kzQu99p>UXN?UL0d?4Q~0*SMDvbNexI79VqS@Vd)OT6VmdRNA-J zmnR1|UOOc(e)<)Qa+B0sU32JE*JE~=CoINgFuUC6WBbti_|ov!&8aUt_P^xkc~OMD z=Ni3YsJ9u%O}wi5pL(J2<HnSz2_ zg7<#hH&(szX6&&m9$ArE8MZYtF%F91s~Cs&2-T+Zz61e(Qz?JSnh z4TNbt%_zyjc6aMAM!n(D3No@ZxcZMMOQUmPiWow+uC;R5Lb)wi82(7(OsewPA-5E7 z<2ydXA)v%!xA542wI|Cep}j2u{nobL!6V+4712$62?H}yYSqHRGGvVsiPAnZt#TcK zdvUN!?%93L#-+OSxK{@q1(mG2GX>)0NX(XIxL&P2;fI-)mkA}Dh7fHXi{Dr?*Iv0$ zN|LLQFwExBzWD8gMgSHkHJP7+73qcdS}Ssz)dTP__tQv4Qmd;Qzub?MyqbQesA}}s zCGmq!f#*B9uF=H8gGMYgei9?srN@rW7C@bwI{aLqF`A#dzSk*wF%(n?Qc|(K-Q@5; z!(vh2stW`nXADkp*Kb}3ZnFFt1p1x^&n5SWrLc)R<9oXdwK-x#G$4MOaxl$-mG6EAUK>}B#UQ+ zmy{**)^C~|KMKlKPeP7PmDm2^(^22@5CCb35p{74Z-7e>LF->t5Vgza13E68umL>36O1bn}0h~D#f3A-fSyRr6xXM7BpZ-xcOUmYd)(K(a(&{I%bFKei+x0 z->}2%!T1CNWYz2MgR{2r{Cf&W>He)J2vY|`CqXg2Q!x>_MQ0jfO!l_{6gYMlKmu?0 zV}(nwtZL;E_2ov^$3&L6(9Nt@y46_JC&$Nf)idv6lHuV$Sd&}jZ)q@aTq)ov_>LH4 zveN}nL(b7Ez7cab)7Z15SYG_@<=2#c`tXMe5q+h~_AK?vYPXgzGva)EYCyMLFr!o+S^{mYs}+l#5SR@0=9%MXM9PL<=KcfiVDt!HV!nyR{8vruto02IE8=w?3QsH<1Rh>W_W2yeK{ z6S6{^0JT}8urR=nffM`S*^wq zs=W0z=Tc9U(~|F~!gc>RjWj1Z+bNs=dM$$`w{IWg@IYVD#dw1iQ3tof)BKt^Tz8G- z=fv$UjNbe8lC+hNP3H&kX@5@n%zkQgLq2B&5RHL?Pd}fNpPcj=nlB;Ak^ijxGF+b{ zT##}-0#y>p01Xg*lPb4{M<11KtN#3qNs+A>YTAzvG~?d`JFMXif2bQ@R5$x4d4Ead z8?Tr1exiP^jF7UEqOSfTS7dvw<&m*U(PIG5lYhO^)6H|NwBvU_|6x_;_k6qI=)ZM;tuE;N+RXvYunlYH!YD zfxQ~C%<-R!GpulU{yLggU{3@1H6jmT%+oi2I=%=t5R2{1`R)M`HhkT#hX9RbLkCKf9-th);o!n6Om!= zCzGax8Q5!PlKB~(>X#-U+6UN|BK7=yNZlNg3@F)6o44*4#);bZrf?UZvJ2gNJ8v&; zA%2}flAD+An7+E`mmIM{3ENyEH@j7*ZdfiNNH{?xw#c6%>Cs0D2{1J1(PPtTZ8*!;K9DA!_8GxMM-N(t!E84+qNo(CY3>g-ejb zCg8%3TW+pI?MzvkB|O~7S_v4RW3M>D*{gCG*`P2(-^-0E&$$;wJ*tBS zaELT~1g!nmNOMx&d^hzo6&zFFIoH&O?}MLR9dDlJn#Rc|Fe)5_%N^z5wpqs-`D8RO zBk+mo5uX}wjfo*R-3|pX7H+IMki3v5qwLBnBlyZ$`5vYd z&1Du#B`&cVIm~uL-QLO?Wy-V5A^E8{=Wc1VUF1btbxs|(yB!B$)F7%`+FcwFMh4ch zxq>rD!-S8t?~q^P{PB&Q(=XMz`2zf9 zYVAAWHQ~NgaF`tPgbuV=#An2tX?_TJN$A#`lNq#;mtvE@ba9`)t(GAnb?&PHd|{;I zzb<6&x+E)Ncz}PWM$y=??J_$itKy}AWtuQ0||4At;!#b+WO=Yxa;hN=#~xx zEpuWXj@`R~%q?~I1Y3LmmWt?a*OKB(e+`u<>`B_1sega*&;bDOsz9B2l;;=Fwr&nj zawP|T*=pjgw=mYMw&F@yivHf4D{`he{@5bh@5qCW2J~IAZTA(zsi_iAmKPt4U~_r% zt%rZcnjW7)9iJE1V;V``TzW1ukQ%u;O9;|kdjq@F6I8Y8%zu7re(-JR$jJBrDD7=TBB1j*)5mtH**z3N=={l(d4R2m%^vDKB&(=XNTLds6}b%(TAsF1npYt!LN)6bxL=#R>E3e19@$b z+JDjR`{lN8A5S9#`ab*t$j2*80?~<+!T>ch1rmoAGUZRR$%p>VN%8q@f0A<9uuA`K zt%58^GU#Vvp4Qu-VU_Eoo|%^7?&ft2UjgUV2ynZd#`z<(p15OMMeM~;ZC?=nD(rbC zK3}O?jJm4Ppq(%eIsg^@PI?SmnwW%#T_PTITC?ixs+P!KaakxZ?~aiit{!42RAYl8&(;|1qBlG% z4^pg5WXrAGlc~2?iu3z*)^a~5F3diH@Y*$Y_viwkZMozGx}atya7G2vEHdz#V1XQ; zBk;l8qivvBS$6LQSr49kY+=iL@-i7{cVw}YyS*Foc_yCA;O>J-u!NqEH+}2+`;V=? z0Lg8CZ}PD>+&QoH_h-ud`Rs(2D4aw%`KHG`@r;4C%iq% z2;^H%5mxP6eW2IEtF(o3R(q4;uuQhwHN3E$EaB#ouN*8hR0yB@Q7s z6wz#Os`lG;-GH*SUK6|?#x_|PY@m)eJoB2R1J=j!p_KGcRm1z3m*_J!B|tNoZ%nOo zX+;7_1w7e5F#v)$D$|mV+9evV#udpd=IEOw8@+51;ap3%i%!2B@>UMHt#y{?x`T@~ z|Eui7D+Q(9AfGOZ70+wFXnB+Tq2q#Xdpug`t>rCBe{ULFb1hr(M_FD}h(C*eL674{ zps@stMYWU@Ir*JlG&$^*U#Q8`Sn|uS<(Ms2i{g>2RyTWv zs?u%)MAz;E@=uH8PUpmUJGj^lO0g~0u69>MH%0-%`K;(b@yf3@JiYy+47^c^tbEOV zSbDlx3sVWI?BVT}??^e8Zg&F*mxwsGg1O(@|z*l@vP=>uaQbk6w>o`FRtjt znjXuG^h9<4TO$UEc}m^tSydp0BSHt_{a-Ur*#MEWB3k}8itA{#jFuA;8@5(`uiV5N z`P*i=#nO5+9@hHQb-#vtSao}IBxCA`5~i~0AL%lkM_2KOZcit=#F{1C(+>>V?d-O< z4ViAu3y;-kGev+#J>J!AjMjVaQNfkWxqAZk7B@jR|cl3CtBZ#9h`FI+Rn>cX|J? z(D`G(T3<>dX3nhg_K{*G>wqG5%K)F$5vmV!`GP&I zSl4^etKjDCxQoyQf*WT_l%v0$eloiPB&f3gxr+{f_0;``&E;Ctfl@mxbl?S=hIk9Q ztw_$JhqEdJChENjf*u*n81VHpBGdp}*a4h65FY+HxVBQyd=_tYBNtzvG~;^HW%NI= z_g!3kuouXEeCJ%N_w8#O5{+Vk!K}`J<<8C|41&ZT+_0G8366@A<4bOE`s9`ou>q0> zb_5DejLjIK$xnlIf1tilj*f+rPM71_1K0tp${!C7Rp_w65`7NI6rUS0aDqX*1o29T z;6^?<(WmElYj@X)2n3(pD(`9ooPVR;zX!})Szgg5%LABBar`ZVV;WoxHU8K8%H!|$^|!4{LxX%h(O`quSV zaAAG>U;pNB-Fv9}6CLdUoCg5agdr+HVpr-s`fvj%P^9g0U_q4Y{O4^Os6n^3|ExeY4pO@4 zp+Gku-LQboye&#M5=?Gjljqak$EUNBP+3b@5H{^6Vs_@}+>Nlr-#3ILUYoQWvB*P;Es~xQwUoSE{P^`Dd>>>NN2@VRN+J(L0`)7o~Ur~S_ zrFEk5=NBIHyHFG7{tt^2D#fSTQwi`?mH!g&q$WU{`{wHyu7XEwYlH zBM0q+DXwH-9$B5|gPHn#-p_kC!7-9)sqjrjgR~8tn;J^cAQGr5UqwLV;`!IvQb~x0 z+J#KhNw7}O`i*j;%AJCbm#Qic!^A2#hVO(ZMzugD!d)Q4i%RU=?KqZV*TcC8tbV)AZb}bfkc{%$}sLck^zM8 zifF~hP@87<;_J^wvAnS0H6a^%fvzPjJG%tp3BA7^aSDh+;If7nW-wr}Dv{fN+<>%n z_rI`A@$q~o64fC}5N-q5ucIQG^=oDIClh5$VC)2So;1jZir)6M*Q>a0+45@n1Eix=Or_;lVpoi~%=v_f^ zBTMF{_R3TY-SUR#{?!SwPu&*HPRv6{8j?lGe{}?YQ(i#Cpk}KYEf{=#6}TrAI#^rm z={L<&K>Pomc+feimb(^}+x5DPhMCwJcNagbnM2AjVvcs5888IOD*$-`Oo6U6r>g2~ z68D7?o{bhnq<`0=V&&6JI=*51=ZP^Cb#k`7K%Oaac(&GVIPWKFx zAW8_UAG!muyd6-xteHwafKgqOFZO z`5uynT}b(df$!CLYW-;NaMK0= zR3%T}r=~~BtLqU0yDd%_>ai7HzMKS*LzTPhTw$e8n7WQXP`PnGaM9VeHR>wUf|jju zz3)t?szuIk(dCn(Nky8#o=<@$4Swh%=!|qFo1G(#XC_1_`-ej&B2s{>oxd=-_JtL$ z{Z#;9WO4}bmucS&Pet_aMI2`!9#iXRqnBkjR!iKut9w_@g9qbLT({v+fk`efLijrnQ6{uA1%MyO^F4ja_#(qeG6zn3vG<6YNV)f6xSZ= z21%yWw4AsF>9qD%IzFSHu5R&j$j{ECpx=@Nk2=atARyy;_DCZAD|FFqoWJ|gWoV}0 z&;zBPTN8Vc6b(|oBh9B(2&4r*4g1|Eq)y}~$@Q2*p%3u))_X0^^4QtxbzRGgQ+x^0 zEW-TqO53SZ-x?5bYd{q4Dgk3fC2anq;j2p=ro`~wK%}m8DQm)Fo=WoRsoi`TZc(S( znI6j2RfO}~IcP`0HEI01*RVU@z)EqED$p>1AJgzNqLBo;1fPxp2IN&_*d>oa<{7 zoQKU9)qbNyVueFS{S7&svnbExI3Fv%y6rCk@Bd)Nw*Z*QX5{SCKPZkfAS%+!8#oH6<$R^a4kVmh$t=*>1UE8lFxMq$nG~r zx1AhcesXnh6R?51tB_sT+zwJOBw)SY7B5Kr7Aa54Ts+eBR*=$ikHF=JR0tIB%LQh- zWn?{&>tjEOI0hS{DrN_6`pV+D+@sH;GQ*Q)p>kNqw<#SuSTo*V3q~X4YLs`RSj1Nc z?E}cxv?5N`p|{Y~L1&oNFRqW%8JK!BFzq|HamDF^Es&J|eVUlM-^BCoah^;QARb@7 z+!2k@V=oq#By^2AqdE5%i{kA|w9mSpC+RWrXu9mL`;rtybtPrH^xXHEbT}6(aWGfK z9=VFkz^%_AXT?U~EHd0p^x~ABCheIeATubfp%Z&PZ6^gJsKDnS#VBX!zVT^Ipu8H^ zoe|c$q`{tWkyx~Jp+4D4HT##Z1BasliwvPiqfHI!ikXj(dqG(8D5j9DC|qv}2TQAx zSsjG%kk_j1ZY{-`#JHTU|5h5(z4d2bMa;Vpv|Z1Vg{x`cAS2N`fW1d{VAAP{*hv|n zwz{r+?=q(m4H*fhRuC~KNl}3xm9OY5dYAB}_z-s!>e(t7t`T{p@0wp!?KNvUj1cwX zkmR_6hFT(ZQdet+sY3j)KL=8%u$^N7Xp+Iml6B;s7iK*CQVwTix8}==M?aw9hg7YT z|6$tqNb9TJzkAu(K?x&U(td`(rn+hynSrYRVC3mRE1I`*+wI(XqfsEeYTKF+`xfQBML)TaX-q*{Bqpt$KD0IFJF%o{^c*7alVDb6$l z{x^!B0_6o1->m8ZmBowVpYP9H2BQP5Qqt1QPqAWn7g>i@@PN3`xFra`@Tszta%|8I-n{&-3 z;@Xo>z~4wHayrlVq8=Mn*s!}vb$=yE)%GcbRRA7|js63$cxmTgR;8s-6&P5-DfMgA zaC#qYd@r}))W@Y({&Nr+f*fgfK5(0R#4|U|*tX=G4=bngUy}oGi~hb`nz2)$9DLpD z10gTG&OZN*SJY_OfH|-7YKTTk1yH21s7-#xz~}D=oyyK!k?IvvJ@sIxcPs{PY*>uh zV_*;=g|IB?E2mMslW#LJ(vDUIs=MAV-*;V;jkcSIwR8ylcG0?CtWL$sEaOm}HR|gD zmKOuJxAZE%Pmd=Cn!jtvHlSd3r!m0n=jdykF^Yety_WmzC}JJ-bAocr5P<3V5#+${ zBsA@jUgoF0+tZ3MPbG7ExPE&$y223Rz-z>)pl2OqP@*jNj0+BAO5GNRiTWgEPs@Pi&+Lbs zBP4k39RN#m6;;pVpQ)oJ+$^Hpijie2{&4wE72rB4&;-)vVE4Mz>|zZh&_Ry$IoGtQt$L1!rd@1z2+rXw`M7PSE?K6PrW62 z7;_cs9N~>fNCh;H(s^{N>&Bfz>*3x*j?j}zf*2L9b8_jbefF|7_7pG!akF&h!hE#{nsh}VC*%Ka4S1mo>kSY6m zUNoHg+5FFgU! zb3h(1V|E+nwF#o(yq#Im$tJRp8Xe_5Kud z%x0hK1424Pi>rXgNFtuA1U9`cG(3W<-obdXV!$jPZY;LwI)H7-r*>uxsrJ{8bAJ%0 zzK5tmcV^%d*rkb%=WfP6md$BgPF!za6>Uejx5#G><_QO0i&PB|Q>q89;0VW-p67#= zbVhA%KnRam6yfX&@X|bdYF92T^-CD9o1Xs@XDCE@HfF&GcDNG7B`N#0R62guxm#~- z9Fj#L@=J!QYb~Ix-eKyE(tJ|=4*o62NGI?BmX<9Dm;VOyvk31Wwttl}#m8*L%2zwK zaSY>{&2f_$=DaevSt}XP6v~F*4^c2#WFuE6pcfgACMYYU<;a1t&5CH1BPa_EUg=YQ zjVz#*Byv$WMj$v0Y@;&t-qys#hTjdG*5^f_Edx5={&-m9WP%`n8h4m`f}NWuFywP- z!2AP(zx)+2fF?Zs2C_0OQK$`yJAN3Wb*m2%joqU=bS`XUkRV=`#Lr7{9;(MPLIVJ>f{GDS|+CN-kC z&hVoCxz!y1rdu0U0NMr_h@!(Aeo;qnfU}d_XRcSr1oAdT06;l{Ld$hUAS>X~8YANl z97Xq_sy0Bc9)!3Xjp#fK?A&CKTZHZ5jU8Wk0q_js?A|{rILg1?% z$l`z|iM`?Z(+Litv%P`NV4~AwoSslwrjvTKBP^li<0vu+pcnjd>e$DR+L$_;3Q=;^ zwtL+ha5w6bhM@6Px`rRXpAGjMf{#pPYKwXRMeQQx*zAotX58i1rq{9`b+Q32iFXL~OzLTU zQ%lsEFE*eobVj_TAvTl1L}nZ^y=;dpjpWIIRBmHK^j)`aM-D)EcA3dU74)8>Ef5?V?nHvgaMk|~r&tyZwd`-HeZ|qov@@OQ3`^;0(;p{4 zI@0K*Xy7V@CfskEqMt*7VOuP&)zkwm!R*V}wF(M{SdnLX96KQp(Pi)~p{6fk@p_pw z+!EBBz>#LBL?FV{(r)0PK0D;r^}#gs3&s|mzKsS{LC+`NM6-#RtC({4T9Lj z%zvH=OIG!Sg*0=j)&3E3Gt2k%*fk#N3`=GVZMR$(jruI_>MBQs=EPg}Wb$89WJ%9| zff*8q$PDXN$WtGkcq3TeK{`jDpz6gG)WU;Kb$v;~fUav3*4HnIKQrwt5pQF|u^Kj( z9;G@J;5$=_fUhzONJX7rryX<;t!@Fo|EFjMnmKVvckW5>$-ZYQ4L#F#x)UY8K*nt+ zD^&;Ug(6(T4MbxMo{YD3*-F}(O1jVrYb`aFp>b@DJMZZ(bmkp8BLFNsx~VqA!1Wy^ zQy{Okeamb20R{w=jsEquZE$vu>kP|T2iYj9ZIm3Td0TI9RS!S--E=oetq_(IUK~N( z(7kki$d5IVdFY8b?BP{aCd;kpXZQ7|m3;k7g|Kz_uUh~6KHTuX^CK7kuIk?i{2PIP zBk=z*0^1E6bJwAdv^%|SSeFULU4+RWm50HioBhd^WA| rLL>NIY#;al{J+2YZv_6I5jd;#W*$yE*KiwT4b14G*@dF>P7nSMAeJZ5 literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable-xxhdpi/splash.png b/android/app/src/main/res/drawable-xxhdpi/splash.png index 5d1a800fcfb4f745259c036506e59b72979742af..6f25a8fa307cdc7b07866824b7f7057d3af5bfa0 100644 GIT binary patch literal 16866 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 literal 14844 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 diff --git a/android/app/src/main/res/drawable-xxxhdpi/android12splash.png b/android/app/src/main/res/drawable-xxxhdpi/android12splash.png new file mode 100644 index 0000000000000000000000000000000000000000..7938d0a94be5d114dc6b9806719592a788c67c78 GIT binary patch literal 16129 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

@|Cn=s_dTok70A@QXMv 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 literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable-xxxhdpi/splash.png b/android/app/src/main/res/drawable-xxxhdpi/splash.png index 4666c814a09b3df3dc9cb426b92ea2c357b3d9dd..7938d0a94be5d114dc6b9806719592a788c67c78 100644 GIT binary patch literal 16129 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

@|Cn=s_dTok70A@QXMv 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 literal 14075 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 ZY?8$OIIbL3_@g#(+Ro{C<*&#a{{!5uF&F>< diff --git a/android/app/src/main/res/drawable/launch_background.xml b/android/app/src/main/res/drawable/launch_background.xml index 3fe6b2e88..3cc4948a1 100644 --- a/android/app/src/main/res/drawable/launch_background.xml +++ b/android/app/src/main/res/drawable/launch_background.xml @@ -6,4 +6,4 @@ - \ No newline at end of file + diff --git a/android/app/src/main/res/values-night-v31/styles.xml b/android/app/src/main/res/values-night-v31/styles.xml index 2c379953f..8e51f7679 100644 --- a/android/app/src/main/res/values-night-v31/styles.xml +++ b/android/app/src/main/res/values-night-v31/styles.xml @@ -4,7 +4,9 @@ 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 diff --git a/ios/Runner/Base.lproj/LaunchScreen.storyboard b/ios/Runner/Base.lproj/LaunchScreen.storyboard index 28f9d1be4..5a3763008 100644 --- a/ios/Runner/Base.lproj/LaunchScreen.storyboard +++ b/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -38,7 +38,7 @@ - + - \ No newline at end of file + diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index 53e83f8ca..03d7e9698 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -23,19 +23,19 @@ CFBundleSignature ???? MinimumOSVersion - 12.0 + 12.0 LSApplicationQueriesSchemes - - googlegmail - x-dispatch - readdle-spark - airmail - ms-outlook - ymail - fastmail - superhuman - protonmail - + + googlegmail + x-dispatch + readdle-spark + airmail + ms-outlook + ymail + fastmail + superhuman + protonmail + CFBundleURLTypes @@ -67,8 +67,7 @@ NSFaceIDUsageDescription Please allow ente to lock itself with FaceID or TouchID NSCameraUsageDescription - Please allow access to your camera so that you can take photos - within ente + Please allow access to your camera so that you can take photos within ente NSPhotoLibraryUsageDescription Please allow access to your photos so that ente can encrypt and back them up. UIBackgroundModes @@ -102,5 +101,5 @@ UIApplicationSupportsIndirectInputEvents - + diff --git a/pubspec.yaml b/pubspec.yaml index a27cec88d..d2a2e311f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -147,6 +147,14 @@ flutter_native_splash: android_fullscreen: true android_gravity: center ios_content_mode: center + android_12: + # The image parameter sets the splash screen icon image. If this parameter is not specified, + # the app's launcher icon will be used instead. + # Please note that the splash screen will be clipped to a circle on the center of the screen. + # App icon without an icon background: This should be 1152×1152 pixels, and fit within a circle + # 768 pixels in diameter. + image: assets/splash-screen-light.png + image_dark: assets/splash-screen-dark.png # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec From e9dab50fead069bf630065424dbdfeb47e30b5db Mon Sep 17 00:00:00 2001 From: ashilkn Date: Wed, 22 Feb 2023 11:16:13 +0530 Subject: [PATCH 05/49] Removed unused code and converted 'Collection Page' to a StatelessWidget --- lib/ui/viewer/gallery/collection_page.dart | 50 ++++++---------------- 1 file changed, 13 insertions(+), 37 deletions(-) diff --git a/lib/ui/viewer/gallery/collection_page.dart b/lib/ui/viewer/gallery/collection_page.dart index cee67ebad..3903fb043 100644 --- a/lib/ui/viewer/gallery/collection_page.dart +++ b/lib/ui/viewer/gallery/collection_page.dart @@ -16,13 +16,13 @@ import 'package:photos/ui/viewer/gallery/empty_state.dart'; import 'package:photos/ui/viewer/gallery/gallery.dart'; import 'package:photos/ui/viewer/gallery/gallery_app_bar_widget.dart'; -class CollectionPage extends StatefulWidget { +class CollectionPage extends StatelessWidget { final CollectionWithThumbnail c; final String tagPrefix; final GalleryType appBarType; final bool hasVerifiedLock; - const CollectionPage( + CollectionPage( this.c, { this.tagPrefix = "collection", this.appBarType = GalleryType.ownedCollection, @@ -30,42 +30,24 @@ class CollectionPage extends StatefulWidget { Key? key, }) : super(key: key); - @override - State createState() => _CollectionPageState(); -} - -class _CollectionPageState extends State { final _selectedFiles = SelectedFiles(); final GlobalKey shareButtonKey = GlobalKey(); - final ValueNotifier _bottomPosition = ValueNotifier(-150.0); - - @override - void initState() { - _selectedFiles.addListener(_selectedFilesListener); - super.initState(); - } - - @override - void dispose() { - _selectedFiles.removeListener(_selectedFilesListener); - super.dispose(); - } @override Widget build(Object context) { - if (widget.hasVerifiedLock == false && widget.c.collection.isHidden()) { + if (hasVerifiedLock == false && c.collection.isHidden()) { return const EmptyState(); } - final appBarTypeValue = _getGalleryType(widget.c.collection); + final appBarTypeValue = _getGalleryType(c.collection); final List? initialFiles = - widget.c.thumbnail != null ? [widget.c.thumbnail!] : null; + c.thumbnail != null ? [c.thumbnail!] : null; final gallery = Gallery( asyncLoader: (creationStartTime, creationEndTime, {limit, asc}) async { final FileLoadResult result = await FilesDB.instance.getFilesInCollection( - widget.c.collection.id, + c.collection.id, creationStartTime, creationEndTime, limit: limit, @@ -82,25 +64,25 @@ class _CollectionPageState extends State { }, reloadEvent: Bus.instance .on() - .where((event) => event.collectionID == widget.c.collection.id), + .where((event) => event.collectionID == c.collection.id), removalEventTypes: const { EventType.deletedFromRemote, EventType.deletedFromEverywhere, EventType.hide, }, - tagPrefix: widget.tagPrefix, + tagPrefix: tagPrefix, selectedFiles: _selectedFiles, initialFiles: initialFiles, - albumName: widget.c.collection.name, + albumName: c.collection.name, ); return Scaffold( appBar: PreferredSize( preferredSize: const Size.fromHeight(50.0), child: GalleryAppBarWidget( appBarTypeValue, - widget.c.collection.name, + c.collection.name, _selectedFiles, - collection: widget.c.collection, + collection: c.collection, ), ), body: Stack( @@ -110,7 +92,7 @@ class _CollectionPageState extends State { FileSelectionOverlayBar( appBarTypeValue, _selectedFiles, - collection: widget.c.collection, + collection: c.collection, ) ], ), @@ -129,12 +111,6 @@ class _CollectionPageState extends State { } else if (c.type == CollectionType.favorites) { return GalleryType.favorite; } - return widget.appBarType; - } - - _selectedFilesListener() { - _selectedFiles.files.isNotEmpty - ? _bottomPosition.value = 0.0 - : _bottomPosition.value = -150.0; + return appBarType; } } From 8c85130275c59f5564b8126b3af11cb9f79de05b Mon Sep 17 00:00:00 2001 From: ashilkn Date: Wed, 22 Feb 2023 11:36:12 +0530 Subject: [PATCH 06/49] Stop rebuilding TrashPage on file selection + convert to Stateless Widget --- lib/ui/viewer/gallery/trash_page.dart | 35 ++++++--------------------- 1 file changed, 7 insertions(+), 28 deletions(-) diff --git a/lib/ui/viewer/gallery/trash_page.dart b/lib/ui/viewer/gallery/trash_page.dart index 6a60e365f..3f8a8d82b 100644 --- a/lib/ui/viewer/gallery/trash_page.dart +++ b/lib/ui/viewer/gallery/trash_page.dart @@ -14,7 +14,7 @@ import 'package:photos/ui/viewer/gallery/gallery.dart'; import 'package:photos/ui/viewer/gallery/gallery_app_bar_widget.dart'; import 'package:photos/utils/delete_file_util.dart'; -class TrashPage extends StatefulWidget { +class TrashPage extends StatelessWidget { final String tagPrefix; final GalleryType appBarType; final GalleryType overlayType; @@ -26,30 +26,9 @@ class TrashPage extends StatefulWidget { Key? key, }) : super(key: key); - @override - State createState() => _TrashPageState(); -} - -class _TrashPageState extends State { - late Function() _selectedFilesListener; - @override - void initState() { - _selectedFilesListener = () { - setState(() {}); - }; - widget._selectedFiles.addListener(_selectedFilesListener); - super.initState(); - } - - @override - void dispose() { - widget._selectedFiles.removeListener(_selectedFilesListener); - super.dispose(); - } - @override Widget build(Object context) { - final bool filesAreSelected = widget._selectedFiles.files.isNotEmpty; + final bool filesAreSelected = _selectedFiles.files.isNotEmpty; final gallery = Gallery( asyncLoader: (creationStartTime, creationEndTime, {limit, asc}) { @@ -70,8 +49,8 @@ class _TrashPageState extends State { forceReloadEvents: [ Bus.instance.on(), ], - tagPrefix: widget.tagPrefix, - selectedFiles: widget._selectedFiles, + tagPrefix: tagPrefix, + selectedFiles: _selectedFiles, header: _headerWidget(), initialFiles: null, ); @@ -80,9 +59,9 @@ class _TrashPageState extends State { appBar: PreferredSize( preferredSize: const Size.fromHeight(50.0), child: GalleryAppBarWidget( - widget.appBarType, + appBarType, "Trash", - widget._selectedFiles, + _selectedFiles, ), ), body: Stack( @@ -109,7 +88,7 @@ class _TrashPageState extends State { ), ), ), - FileSelectionOverlayBar(GalleryType.trash, widget._selectedFiles) + FileSelectionOverlayBar(GalleryType.trash, _selectedFiles) ], ), ); From e48245b541750817a731515597f0749977d3b28f Mon Sep 17 00:00:00 2001 From: ashilkn Date: Wed, 22 Feb 2023 12:52:57 +0530 Subject: [PATCH 07/49] Force reload trash page on removing files permanently --- lib/utils/delete_file_util.dart | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/utils/delete_file_util.dart b/lib/utils/delete_file_util.dart index 077af27d0..15db93100 100644 --- a/lib/utils/delete_file_util.dart +++ b/lib/utils/delete_file_util.dart @@ -13,6 +13,7 @@ import 'package:photos/core/event_bus.dart'; import 'package:photos/db/files_db.dart'; import 'package:photos/events/collection_updated_event.dart'; import 'package:photos/events/files_updated_event.dart'; +import "package:photos/events/force_reload_trash_page_event.dart"; import 'package:photos/events/local_photos_updated_event.dart'; import 'package:photos/models/file.dart'; import 'package:photos/models/selected_files.dart'; @@ -264,6 +265,9 @@ Future deleteFromTrash(BuildContext context, List files) async { source: "deleteFromTrash", ), ); + //the FilesUpdateEvent is not reloading trash on premanently removing + //files, so need to fire ForceReloadTrashPageEvent + Bus.instance.fire(ForceReloadTrashPageEvent()); } catch (e, s) { _logger.info("failed to delete from trash", e, s); rethrow; From c297be0023753b47d92c5f08f0e075ad3caf51af Mon Sep 17 00:00:00 2001 From: ashilkn Date: Wed, 22 Feb 2023 12:57:34 +0530 Subject: [PATCH 08/49] Added debugRepaintRainbowEnabled in main() --- lib/main.dart | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/main.dart b/lib/main.dart index 77a3f7b89..8a8e22b71 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -5,6 +5,7 @@ import 'package:background_fetch/background_fetch.dart'; import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; +import "package:flutter/rendering.dart"; import 'package:logging/logging.dart'; import 'package:path_provider/path_provider.dart'; import 'package:photos/app.dart'; @@ -54,6 +55,7 @@ const kFGTaskDeathTimeoutInMicroseconds = 5000000; const kBackgroundLockLatency = Duration(seconds: 3); void main() async { + debugRepaintRainbowEnabled = false; WidgetsFlutterBinding.ensureInitialized(); await _runInForeground(); BackgroundFetch.registerHeadlessTask(_headlessTaskHandler); From 5997a31349f9701e901d9648a0c21d5491a04685 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 22 Feb 2023 13:01:39 +0530 Subject: [PATCH 09/49] Refactor: Move delete single file logic inside file_actions --- lib/ui/actions/file/file_actions.dart | 121 +++++++++++++++++++++++++ lib/ui/viewer/file/fading_app_bar.dart | 111 +---------------------- 2 files changed, 126 insertions(+), 106 deletions(-) create mode 100644 lib/ui/actions/file/file_actions.dart diff --git a/lib/ui/actions/file/file_actions.dart b/lib/ui/actions/file/file_actions.dart new file mode 100644 index 000000000..d64727f6a --- /dev/null +++ b/lib/ui/actions/file/file_actions.dart @@ -0,0 +1,121 @@ +import "package:flutter/cupertino.dart"; +import "package:photos/models/file.dart"; +import "package:photos/models/file_type.dart"; +import "package:photos/ui/components/action_sheet_widget.dart"; +import "package:photos/ui/components/button_widget.dart"; +import "package:photos/ui/components/models/button_type.dart"; +import "package:photos/utils/delete_file_util.dart"; +import "package:photos/utils/dialog_util.dart"; +import "package:photos/utils/toast_util.dart"; + +Future showSingleFileDeleteSheet( + BuildContext context, + File file, { + Function(File)? onFileRemoved, +}) async { + final List buttons = []; + final String fileType = file.fileType == FileType.video ? "video" : "photo"; + final bool isBothLocalAndRemote = + file.uploadedFileID != null && file.localID != null; + final bool isLocalOnly = file.uploadedFileID == null && file.localID != null; + final bool isRemoteOnly = file.uploadedFileID != null && file.localID == null; + const String bodyHighlight = "It will be deleted from all albums."; + String body = ""; + if (isBothLocalAndRemote) { + body = "This $fileType is in both ente and your device."; + } else if (isRemoteOnly) { + body = "This $fileType will be deleted from ente."; + } else if (isLocalOnly) { + body = "This $fileType will be deleted from your device."; + } else { + throw AssertionError("Unexpected state"); + } + // Add option to delete from ente + if (isBothLocalAndRemote || isRemoteOnly) { + buttons.add( + ButtonWidget( + labelText: isBothLocalAndRemote ? "Delete from ente" : "Yes, delete", + buttonType: ButtonType.neutral, + buttonSize: ButtonSize.large, + shouldStickToDarkTheme: true, + buttonAction: ButtonAction.first, + shouldSurfaceExecutionStates: true, + isInAlert: true, + onTap: () async { + await deleteFilesFromRemoteOnly(context, [file]); + showShortToast(context, "Moved to trash"); + if (isRemoteOnly) { + Navigator.of(context, rootNavigator: true).pop(); + if (onFileRemoved != null) { + onFileRemoved(file); + } + } + }, + ), + ); + } + // Add option to delete from local + if (isBothLocalAndRemote || isLocalOnly) { + buttons.add( + ButtonWidget( + labelText: isBothLocalAndRemote ? "Delete from device" : "Yes, delete", + buttonType: ButtonType.neutral, + buttonSize: ButtonSize.large, + shouldStickToDarkTheme: true, + buttonAction: ButtonAction.second, + shouldSurfaceExecutionStates: false, + isInAlert: true, + onTap: () async { + await deleteFilesOnDeviceOnly(context, [file]); + if (isLocalOnly) { + Navigator.of(context, rootNavigator: true).pop(); + if (onFileRemoved != null) { + onFileRemoved(file); + } + } + }, + ), + ); + } + if (isBothLocalAndRemote) { + buttons.add( + ButtonWidget( + labelText: "Delete from both", + buttonType: ButtonType.neutral, + buttonSize: ButtonSize.large, + shouldStickToDarkTheme: true, + buttonAction: ButtonAction.third, + shouldSurfaceExecutionStates: true, + isInAlert: true, + onTap: () async { + await deleteFilesFromEverywhere(context, [file]); + Navigator.of(context, rootNavigator: true).pop(); + if (onFileRemoved != null) { + onFileRemoved(file); + } + }, + ), + ); + } + buttons.add( + const ButtonWidget( + labelText: "Cancel", + buttonType: ButtonType.secondary, + buttonSize: ButtonSize.large, + shouldStickToDarkTheme: true, + buttonAction: ButtonAction.fourth, + isInAlert: true, + ), + ); + final actionResult = await showActionSheet( + context: context, + buttons: buttons, + actionSheetType: ActionSheetType.defaultActionSheet, + body: body, + bodyHighlight: bodyHighlight, + ); + if (actionResult?.action != null && + actionResult!.action == ButtonAction.error) { + showGenericErrorDialog(context: context); + } +} diff --git a/lib/ui/viewer/file/fading_app_bar.dart b/lib/ui/viewer/file/fading_app_bar.dart index a9d674970..ff2802845 100644 --- a/lib/ui/viewer/file/fading_app_bar.dart +++ b/lib/ui/viewer/file/fading_app_bar.dart @@ -21,13 +21,10 @@ import 'package:photos/services/favorites_service.dart'; import 'package:photos/services/hidden_service.dart'; import 'package:photos/services/ignored_files_service.dart'; import 'package:photos/services/local_sync_service.dart'; +import "package:photos/ui/actions/file/file_actions.dart"; import 'package:photos/ui/common/progress_dialog.dart'; -import 'package:photos/ui/components/action_sheet_widget.dart'; -import 'package:photos/ui/components/button_widget.dart'; -import 'package:photos/ui/components/models/button_type.dart'; import 'package:photos/ui/create_collection_sheet.dart'; import 'package:photos/ui/viewer/file/custom_app_bar.dart'; -import 'package:photos/utils/delete_file_util.dart'; import 'package:photos/utils/dialog_util.dart'; import 'package:photos/utils/file_util.dart'; import 'package:photos/utils/toast_util.dart'; @@ -339,109 +336,11 @@ class FadingAppBarState extends State { } Future _showSingleFileDeleteSheet(File file) async { - final List buttons = []; - final String fileType = file.fileType == FileType.video ? "video" : "photo"; - final bool isBothLocalAndRemote = - file.uploadedFileID != null && file.localID != null; - final bool isLocalOnly = - file.uploadedFileID == null && file.localID != null; - final bool isRemoteOnly = - file.uploadedFileID != null && file.localID == null; - const String bodyHighlight = "It will be deleted from all albums."; - String body = ""; - if (isBothLocalAndRemote) { - body = "This $fileType is in both ente and your device."; - } else if (isRemoteOnly) { - body = "This $fileType will be deleted from ente."; - } else if (isLocalOnly) { - body = "This $fileType will be deleted from your device."; - } else { - throw AssertionError("Unexpected state"); - } - // Add option to delete from ente - if (isBothLocalAndRemote || isRemoteOnly) { - buttons.add( - ButtonWidget( - labelText: isBothLocalAndRemote ? "Delete from ente" : "Yes, delete", - buttonType: ButtonType.neutral, - buttonSize: ButtonSize.large, - shouldStickToDarkTheme: true, - buttonAction: ButtonAction.first, - shouldSurfaceExecutionStates: true, - isInAlert: true, - onTap: () async { - await deleteFilesFromRemoteOnly(context, [file]); - showShortToast(context, "Moved to trash"); - if (isRemoteOnly) { - Navigator.of(context, rootNavigator: true).pop(); - widget.onFileRemoved(file); - } - }, - ), - ); - } - // Add option to delete from local - if (isBothLocalAndRemote || isLocalOnly) { - buttons.add( - ButtonWidget( - labelText: - isBothLocalAndRemote ? "Delete from device" : "Yes, delete", - buttonType: ButtonType.neutral, - buttonSize: ButtonSize.large, - shouldStickToDarkTheme: true, - buttonAction: ButtonAction.second, - shouldSurfaceExecutionStates: false, - isInAlert: true, - onTap: () async { - await deleteFilesOnDeviceOnly(context, [file]); - if (isLocalOnly) { - Navigator.of(context, rootNavigator: true).pop(); - widget.onFileRemoved(file); - } - }, - ), - ); - } - - if (isBothLocalAndRemote) { - buttons.add( - ButtonWidget( - labelText: "Delete from both", - buttonType: ButtonType.neutral, - buttonSize: ButtonSize.large, - shouldStickToDarkTheme: true, - buttonAction: ButtonAction.third, - shouldSurfaceExecutionStates: true, - isInAlert: true, - onTap: () async { - await deleteFilesFromEverywhere(context, [file]); - Navigator.of(context, rootNavigator: true).pop(); - widget.onFileRemoved(file); - }, - ), - ); - } - buttons.add( - const ButtonWidget( - labelText: "Cancel", - buttonType: ButtonType.secondary, - buttonSize: ButtonSize.large, - shouldStickToDarkTheme: true, - buttonAction: ButtonAction.fourth, - isInAlert: true, - ), + await showSingleFileDeleteSheet( + context, + file, + onFileRemoved: widget.onFileRemoved, ); - final actionResult = await showActionSheet( - context: context, - buttons: buttons, - actionSheetType: ActionSheetType.defaultActionSheet, - body: body, - bodyHighlight: bodyHighlight, - ); - if (actionResult?.action != null && - actionResult!.action == ButtonAction.error) { - showGenericErrorDialog(context: context); - } } Future _download(File file) async { From bdcc0f38a1af705ff8e2f8acbf8f203f5e83e0fb Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 22 Feb 2023 13:08:31 +0530 Subject: [PATCH 10/49] Fixed typo --- lib/ui/viewer/actions/file_selection_actions_widget.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ui/viewer/actions/file_selection_actions_widget.dart b/lib/ui/viewer/actions/file_selection_actions_widget.dart index ef5a69451..a9a2df79e 100644 --- a/lib/ui/viewer/actions/file_selection_actions_widget.dart +++ b/lib/ui/viewer/actions/file_selection_actions_widget.dart @@ -51,7 +51,7 @@ class _FileSelectionActionWidgetState extends State { late CollectionActions collectionActions; late bool isCollectionOwner; - // _cachedCollectionForSharedLink is primarly used to avoid creating duplicate + // _cachedCollectionForSharedLink is primarily used to avoid creating duplicate // links if user keeps on creating Create link button after selecting // few files. This link is reset on any selection changed; Collection? _cachedCollectionForSharedLink; From 39310c8314a57b424161bfe4bbda01f600e3c0ca Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 22 Feb 2023 15:20:33 +0530 Subject: [PATCH 11/49] Refactor: move showInfo action in file_actions --- lib/ui/actions/file/file_actions.dart | 22 ++++++++++++++++++++++ lib/ui/viewer/file/fading_bottom_bar.dart | 19 ++----------------- 2 files changed, 24 insertions(+), 17 deletions(-) diff --git a/lib/ui/actions/file/file_actions.dart b/lib/ui/actions/file/file_actions.dart index d64727f6a..d8465b228 100644 --- a/lib/ui/actions/file/file_actions.dart +++ b/lib/ui/actions/file/file_actions.dart @@ -1,9 +1,13 @@ import "package:flutter/cupertino.dart"; +import "package:modal_bottom_sheet/modal_bottom_sheet.dart"; import "package:photos/models/file.dart"; import "package:photos/models/file_type.dart"; +import "package:photos/theme/colors.dart"; +import "package:photos/theme/ente_theme.dart"; import "package:photos/ui/components/action_sheet_widget.dart"; import "package:photos/ui/components/button_widget.dart"; import "package:photos/ui/components/models/button_type.dart"; +import "package:photos/ui/viewer/file/file_info_widget.dart"; import "package:photos/utils/delete_file_util.dart"; import "package:photos/utils/dialog_util.dart"; import "package:photos/utils/toast_util.dart"; @@ -119,3 +123,21 @@ Future showSingleFileDeleteSheet( showGenericErrorDialog(context: context); } } + +Future showInfoSheet(BuildContext context, File file) async { + final colorScheme = getEnteColorScheme(context); + return showBarModalBottomSheet( + topControl: const SizedBox.shrink(), + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(0)), + backgroundColor: colorScheme.backgroundElevated, + barrierColor: backdropFaintDark, + context: context, + builder: (BuildContext context) { + return Padding( + padding: + EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom), + child: FileInfoWidget(file), + ); + }, + ); +} diff --git a/lib/ui/viewer/file/fading_bottom_bar.dart b/lib/ui/viewer/file/fading_bottom_bar.dart index 6820edebd..a089f1314 100644 --- a/lib/ui/viewer/file/fading_bottom_bar.dart +++ b/lib/ui/viewer/file/fading_bottom_bar.dart @@ -2,7 +2,6 @@ import 'dart:io'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:modal_bottom_sheet/modal_bottom_sheet.dart'; import 'package:photos/core/configuration.dart'; import 'package:photos/models/file.dart'; import 'package:photos/models/file_type.dart'; @@ -12,8 +11,8 @@ import 'package:photos/models/trash_file.dart'; import 'package:photos/services/collections_service.dart'; import 'package:photos/theme/colors.dart'; import 'package:photos/theme/ente_theme.dart'; +import "package:photos/ui/actions/file/file_actions.dart"; import 'package:photos/ui/create_collection_sheet.dart'; -import 'package:photos/ui/viewer/file/file_info_widget.dart'; import 'package:photos/utils/delete_file_util.dart'; import 'package:photos/utils/magic_util.dart'; import 'package:photos/utils/share_util.dart'; @@ -273,20 +272,6 @@ class FadingBottomBarState extends State { } Future _displayInfo(File file) async { - final colorScheme = getEnteColorScheme(context); - return showBarModalBottomSheet( - topControl: const SizedBox.shrink(), - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(0)), - backgroundColor: colorScheme.backgroundElevated, - barrierColor: backdropFaintDark, - context: context, - builder: (BuildContext context) { - return Padding( - padding: - EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom), - child: FileInfoWidget(file), - ); - }, - ); + await showInfoSheet(context, file); } } From a1038ea32ec59b0721c3f55c9d911568f365ebed Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 22 Feb 2023 15:23:50 +0530 Subject: [PATCH 12/49] Switch to PageView --- lib/ui/home/memories_widget.dart | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/lib/ui/home/memories_widget.dart b/lib/ui/home/memories_widget.dart index 93718bc27..5d586e019 100644 --- a/lib/ui/home/memories_widget.dart +++ b/lib/ui/home/memories_widget.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:photos/ente_theme_data.dart'; import 'package:photos/models/memory.dart'; import 'package:photos/services/memories_service.dart'; -import 'package:photos/ui/extents_page_view.dart'; +import "package:photos/ui/actions/file/file_actions.dart"; import 'package:photos/ui/viewer/file/file_widget.dart'; import 'package:photos/ui/viewer/file/thumbnail_widget.dart'; import 'package:photos/utils/date_time_util.dart'; @@ -381,7 +381,7 @@ class _FullScreenMemoryState extends State { Widget _buildSwiper() { _pageController = PageController(initialPage: _index); - return ExtentsPageView.extents( + return PageView.builder( itemBuilder: (BuildContext context, int index) { if (index < widget.memories.length - 1) { final nextFile = widget.memories[index + 1].file; @@ -405,7 +405,6 @@ class _FullScreenMemoryState extends State { }, itemCount: widget.memories.length, controller: _pageController, - extents: 1, onPageChanged: (index) async { await MemoriesService.instance.markMemoryAsSeen(widget.memories[index]); if (mounted) { From bf9f27ef9a7b091d5fa1661e47b239cea7e375dd Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 22 Feb 2023 15:24:39 +0530 Subject: [PATCH 13/49] Memories: Add option to show info and delete file --- lib/ui/home/memories_widget.dart | 68 +++++++++++++++++++++++++++----- 1 file changed, 58 insertions(+), 10 deletions(-) diff --git a/lib/ui/home/memories_widget.dart b/lib/ui/home/memories_widget.dart index 5d586e019..6117f7018 100644 --- a/lib/ui/home/memories_widget.dart +++ b/lib/ui/home/memories_widget.dart @@ -1,3 +1,6 @@ +import "dart:io"; + +import "package:flutter/cupertino.dart"; import 'package:flutter/material.dart'; import 'package:photos/ente_theme_data.dart'; import 'package:photos/models/memory.dart'; @@ -315,6 +318,22 @@ class _FullScreenMemoryState extends State { ); } + void onFileDeleted() { + if (widget.memories.length == 1) { + Navigator.pop(context); + } else { + setState(() { + if (_index != 0) { + _pageController?.jumpToPage(_index - 1); + } + widget.memories.removeAt(_index); + if (_index != 0) { + _index--; + } + }); + } + } + Hero _buildInfoText() { return Hero( tag: widget.title, @@ -346,17 +365,46 @@ class _FullScreenMemoryState extends State { Widget _buildBottomIcons() { final file = widget.memories[_index].file; - return Container( - alignment: Alignment.bottomRight, - padding: const EdgeInsets.fromLTRB(0, 0, 26, 20), - child: IconButton( - icon: Icon( - Icons.adaptive.share, - color: Colors.white, //same for both themes + return SafeArea( + child: Container( + alignment: Alignment.bottomRight, + padding: const EdgeInsets.fromLTRB(26, 0, 26, 20), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + IconButton( + icon: const Icon( + Icons.delete_outline, + color: Colors.white, //same for both themes + ), + onPressed: () async { + await showSingleFileDeleteSheet( + context, + file, + onFileRemoved: (file) => {onFileDeleted()}, + ); + }, + ), + IconButton( + icon: Icon( + Platform.isAndroid ? Icons.info_outline : CupertinoIcons.info, + color: Colors.white, //same for both themes + ), + onPressed: () { + showInfoSheet(context, file); + }, + ), + IconButton( + icon: Icon( + Icons.adaptive.share, + color: Colors.white, //same for both themes + ), + onPressed: () { + share(context, [file]); + }, + ), + ], ), - onPressed: () { - share(context, [file]); - }, ), ); } From 7ba1f11dae3be882b2d1ae7ddd322277c296daed Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 22 Feb 2023 15:29:33 +0530 Subject: [PATCH 14/49] Fix: Clear entries from memory cache on file deletion --- lib/services/memories_service.dart | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/lib/services/memories_service.dart b/lib/services/memories_service.dart index 6ce2d99d7..79f9d0929 100644 --- a/lib/services/memories_service.dart +++ b/lib/services/memories_service.dart @@ -1,8 +1,10 @@ import 'package:flutter/foundation.dart'; import 'package:logging/logging.dart'; import 'package:photos/core/constants.dart'; +import "package:photos/core/event_bus.dart"; import 'package:photos/db/files_db.dart'; import 'package:photos/db/memories_db.dart'; +import "package:photos/events/files_updated_event.dart"; import 'package:photos/models/filters/important_items_filter.dart'; import 'package:photos/models/memory.dart'; import 'package:photos/services/collections_service.dart'; @@ -34,6 +36,17 @@ class MemoriesService extends ChangeNotifier { DateTime.now().microsecondsSinceEpoch - (7 * microSecondsInDay), ); }); + Bus.instance.on().where((event) { + return event.type == EventType.deletedFromEverywhere; + }).listen((event) { + final generatedIDs = event.updatedFiles + .where((element) => element.generatedID != null) + .map((e) => e.generatedID!) + .toSet(); + _cachedMemories?.removeWhere((element) { + return generatedIDs.contains(element.file.generatedID); + }); + }); } void clearCache() { From 919eae547706f3cc1376ddbd1706cffe4ddcd1c1 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 22 Feb 2023 16:24:31 +0530 Subject: [PATCH 15/49] FileViewer: Swap delete and archive/unarchive options --- lib/ui/viewer/file/detail_page.dart | 2 + lib/ui/viewer/file/fading_app_bar.dart | 28 ++++++++------ lib/ui/viewer/file/fading_bottom_bar.dart | 45 +++++++++++------------ 3 files changed, 40 insertions(+), 35 deletions(-) diff --git a/lib/ui/viewer/file/detail_page.dart b/lib/ui/viewer/file/detail_page.dart index c01bc5f94..24f296619 100644 --- a/lib/ui/viewer/file/detail_page.dart +++ b/lib/ui/viewer/file/detail_page.dart @@ -124,6 +124,8 @@ class _DetailPageState extends State { _files![_selectedIndex], _onEditFileRequested, widget.config.mode == DetailPageMode.minimalistic, + onFileRemoved: _onFileRemoved, + userID: Configuration.instance.getUserID(), key: _bottomBarKey, ), ], diff --git a/lib/ui/viewer/file/fading_app_bar.dart b/lib/ui/viewer/file/fading_app_bar.dart index ff2802845..17234a119 100644 --- a/lib/ui/viewer/file/fading_app_bar.dart +++ b/lib/ui/viewer/file/fading_app_bar.dart @@ -14,6 +14,7 @@ import 'package:photos/events/local_photos_updated_event.dart'; import 'package:photos/models/file.dart'; import 'package:photos/models/file_type.dart'; import 'package:photos/models/ignored_file.dart'; +import "package:photos/models/magic_metadata.dart"; import 'package:photos/models/selected_files.dart'; import 'package:photos/models/trash_file.dart'; import 'package:photos/services/collections_service.dart'; @@ -21,12 +22,12 @@ import 'package:photos/services/favorites_service.dart'; import 'package:photos/services/hidden_service.dart'; import 'package:photos/services/ignored_files_service.dart'; import 'package:photos/services/local_sync_service.dart'; -import "package:photos/ui/actions/file/file_actions.dart"; import 'package:photos/ui/common/progress_dialog.dart'; import 'package:photos/ui/create_collection_sheet.dart'; import 'package:photos/ui/viewer/file/custom_app_bar.dart'; import 'package:photos/utils/dialog_util.dart'; import 'package:photos/utils/file_util.dart'; +import "package:photos/utils/magic_util.dart"; import 'package:photos/utils/toast_util.dart'; class FadingAppBar extends StatefulWidget implements PreferredSizeWidget { @@ -145,22 +146,22 @@ class FadingAppBarState extends State { ); } // options for files owned by the user - if (isOwnedByUser) { + if (isOwnedByUser && !isFileHidden) { + final bool isArchived = + widget.file.magicMetadata.visibility == visibilityArchive; items.add( PopupMenuItem( value: 2, child: Row( children: [ Icon( - Platform.isAndroid - ? Icons.delete_outline - : CupertinoIcons.delete, + isArchived ? Icons.unarchive : Icons.archive_outlined, color: Theme.of(context).iconTheme.color, ), const Padding( padding: EdgeInsets.all(8), ), - const Text("Delete"), + Text(isArchived ? "Unarchive" : "Archive"), ], ), ), @@ -232,7 +233,7 @@ class FadingAppBarState extends State { if (value == 1) { _download(widget.file); } else if (value == 2) { - await _showSingleFileDeleteSheet(widget.file); + await _toggleFileArchiveStatus(widget.file); } else if (value == 3) { _setAs(widget.file); } else if (value == 4) { @@ -335,12 +336,17 @@ class FadingAppBarState extends State { ); } - Future _showSingleFileDeleteSheet(File file) async { - await showSingleFileDeleteSheet( + Future _toggleFileArchiveStatus(File file) async { + final bool isArchived = + widget.file.magicMetadata.visibility == visibilityArchive; + await changeVisibility( context, - file, - onFileRemoved: widget.onFileRemoved, + [widget.file], + isArchived ? visibilityVisible : visibilityArchive, ); + if (mounted) { + setState(() {}); + } } Future _download(File file) async { diff --git a/lib/ui/viewer/file/fading_bottom_bar.dart b/lib/ui/viewer/file/fading_bottom_bar.dart index a089f1314..55f6d0271 100644 --- a/lib/ui/viewer/file/fading_bottom_bar.dart +++ b/lib/ui/viewer/file/fading_bottom_bar.dart @@ -2,30 +2,30 @@ import 'dart:io'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:photos/core/configuration.dart'; import 'package:photos/models/file.dart'; import 'package:photos/models/file_type.dart'; -import 'package:photos/models/magic_metadata.dart'; import 'package:photos/models/selected_files.dart'; import 'package:photos/models/trash_file.dart'; -import 'package:photos/services/collections_service.dart'; import 'package:photos/theme/colors.dart'; import 'package:photos/theme/ente_theme.dart'; import "package:photos/ui/actions/file/file_actions.dart"; import 'package:photos/ui/create_collection_sheet.dart'; import 'package:photos/utils/delete_file_util.dart'; -import 'package:photos/utils/magic_util.dart'; import 'package:photos/utils/share_util.dart'; class FadingBottomBar extends StatefulWidget { final File file; final Function(File) onEditRequested; + final Function(File) onFileRemoved; final bool showOnlyInfoButton; + final int? userID; const FadingBottomBar( this.file, this.onEditRequested, this.showOnlyInfoButton, { + required this.onFileRemoved, + this.userID, Key? key, }) : super(key: key); @@ -62,6 +62,8 @@ class FadingBottomBarState extends State { Widget _getBottomBar() { final List children = []; + final bool isOwnedByUser = + widget.file.ownerID == null || widget.file.ownerID == widget.userID; children.add( Tooltip( message: "Info", @@ -87,15 +89,7 @@ class FadingBottomBarState extends State { if (widget.file is TrashFile) { _addTrashOptions(children); } - final bool isUploadedByUser = widget.file.uploadedFileID != null && - widget.file.ownerID == Configuration.instance.getUserID(); - bool isFileHidden = false; - if (isUploadedByUser) { - isFileHidden = CollectionsService.instance - .getCollectionByID(widget.file.collectionID!) - ?.isHidden() ?? - false; - } + if (!widget.showOnlyInfoButton && widget.file is! TrashFile) { if (widget.file.fileType == FileType.image || widget.file.fileType == FileType.livePhoto) { @@ -117,26 +111,21 @@ class FadingBottomBarState extends State { ), ); } - if (isUploadedByUser && !isFileHidden) { - final bool isArchived = - widget.file.magicMetadata.visibility == visibilityArchive; + if (isOwnedByUser) { children.add( Tooltip( - message: isArchived ? "Unarchive" : "Archive", + message: "Delete", child: Padding( padding: const EdgeInsets.only(top: 12, bottom: 12), child: IconButton( icon: Icon( - isArchived ? Icons.unarchive : Icons.archive_outlined, + Platform.isAndroid + ? Icons.delete_outline + : CupertinoIcons.delete, color: Colors.white, ), onPressed: () async { - await changeVisibility( - context, - [widget.file], - isArchived ? visibilityVisible : visibilityArchive, - ); - safeRefresh(); + await _showSingleFileDeleteSheet(widget.file); }, ), ), @@ -222,6 +211,14 @@ class FadingBottomBarState extends State { ); } + Future _showSingleFileDeleteSheet(File file) async { + await showSingleFileDeleteSheet( + context, + file, + onFileRemoved: widget.onFileRemoved, + ); + } + void _addTrashOptions(List children) { children.add( Tooltip( From ec0a41a0197f763122a2502d11e6454553aa7856 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 22 Feb 2023 16:26:26 +0530 Subject: [PATCH 16/49] Swap info and delete button in memories widget --- lib/ui/home/memories_widget.dart | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/lib/ui/home/memories_widget.dart b/lib/ui/home/memories_widget.dart index 6117f7018..e2c298f2b 100644 --- a/lib/ui/home/memories_widget.dart +++ b/lib/ui/home/memories_widget.dart @@ -372,6 +372,15 @@ class _FullScreenMemoryState extends State { child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ + IconButton( + icon: Icon( + Platform.isAndroid ? Icons.info_outline : CupertinoIcons.info, + color: Colors.white, //same for both themes + ), + onPressed: () { + showInfoSheet(context, file); + }, + ), IconButton( icon: const Icon( Icons.delete_outline, @@ -385,15 +394,6 @@ class _FullScreenMemoryState extends State { ); }, ), - IconButton( - icon: Icon( - Platform.isAndroid ? Icons.info_outline : CupertinoIcons.info, - color: Colors.white, //same for both themes - ), - onPressed: () { - showInfoSheet(context, file); - }, - ), IconButton( icon: Icon( Icons.adaptive.share, From 9d2995ba1990761461b0b76de22ae1b3c03655b2 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 22 Feb 2023 16:27:14 +0530 Subject: [PATCH 17/49] Use platform specific delete icon --- lib/ui/home/memories_widget.dart | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/ui/home/memories_widget.dart b/lib/ui/home/memories_widget.dart index e2c298f2b..1e0ccfec1 100644 --- a/lib/ui/home/memories_widget.dart +++ b/lib/ui/home/memories_widget.dart @@ -382,8 +382,10 @@ class _FullScreenMemoryState extends State { }, ), IconButton( - icon: const Icon( - Icons.delete_outline, + icon: Icon( + Platform.isAndroid + ? Icons.delete_outline + : CupertinoIcons.delete, color: Colors.white, //same for both themes ), onPressed: () async { From 16a82b62d1d949318a120120a164123142cddff3 Mon Sep 17 00:00:00 2001 From: Muhesh7 Date: Tue, 21 Feb 2023 20:02:29 +0530 Subject: [PATCH 18/49] feat(file_viewer): implement file view handler --- android/app/src/main/AndroidManifest.xml | 141 +++++++++--------- lib/app.dart | 69 ++++----- lib/services/app_lifecycle_service.dart | 8 +- lib/ui/create_collection_sheet.dart | 7 +- lib/ui/home_widget.dart | 6 +- .../huge_listview/lazy_loading_gallery.dart | 9 +- .../viewer/actions/delete_empty_albums.dart | 5 +- lib/ui/viewer/actions/file_viewer.dart | 104 +++++++++++++ lib/utils/intent_util.dart | 16 ++ pubspec.yaml | 2 +- run.sh | 14 +- 11 files changed, 243 insertions(+), 138 deletions(-) create mode 100644 lib/ui/viewer/actions/file_viewer.dart create mode 100644 lib/utils/intent_util.dart diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 3210b9b97..22ca38364 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -1,107 +1,108 @@ + xmlns:tools="http://schemas.android.com/tools" + package="io.ente.photos"> + android:label="@string/app_name" + android:icon="@mipmap/launcher_icon" + android:usesCleartextTraffic="true" + android:requestLegacyExternalStorage="true" + android:allowBackup="false" + android:fullBackupContent="false" + android:largeHeap="true"> - - - - - - - - - - - - - - - - - - - - + android:theme="@style/LaunchTheme" + android:exported="true" + android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode" + android:hardwareAccelerated="true" + android:windowSoftInputMode="adjustResize"> + + + + + + + + + + + + + + + + + + + + + + + - + + + - - - + + + - - - + + + - - - + + + - - - + + + - + + android:resource="@string/asset_statements" /> + android:value="https://2235e5c99219488ea93da34b9ac1cb68@sentry.ente.io/4" /> + android:value="true" /> - - + + - - - + + + + android:name="android.permission.READ_MEDIA_IMAGES" /> + android:name="android.permission.READ_MEDIA_VIDEO" /> + android:name="android.permission.READ_EXTERNAL_STORAGE" + android:maxSdkVersion="32" /> - - + android:name="android.permission.WRITE_EXTERNAL_STORAGE" + android:maxSdkVersion="29" + tools:ignore="ScopedStorage" /> + + \ No newline at end of file diff --git a/lib/app.dart b/lib/app.dart index 538325b61..498904259 100644 --- a/lib/app.dart +++ b/lib/app.dart @@ -4,16 +4,16 @@ import 'package:adaptive_theme/adaptive_theme.dart'; import 'package:background_fetch/background_fetch.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:logging/logging.dart'; -import 'package:media_extension/media_extension.dart'; import 'package:media_extension/media_extension_action_types.dart'; import 'package:photos/ente_theme_data.dart'; import 'package:photos/services/app_lifecycle_service.dart'; import 'package:photos/services/sync_service.dart'; import 'package:photos/ui/home_widget.dart'; +import "package:photos/ui/viewer/actions/file_viewer.dart"; +import "package:photos/utils/intent_util.dart"; class EnteApp extends StatefulWidget { final Future Function(String) runBackgroundTask; @@ -31,63 +31,44 @@ class EnteApp extends StatefulWidget { class _EnteAppState extends State with WidgetsBindingObserver { final _logger = Logger("EnteAppState"); - final _mediaExtensionPlugin = MediaExtension(); @override void initState() { _logger.info('init App'); super.initState(); + setupIntentAction(); WidgetsBinding.instance.addObserver(this); } - Future initIntentAction() async { - if (!Platform.isAndroid) { - AppLifecycleService.instance.setIntentAction(IntentAction.main); - return true; - } - IntentAction intentAction = IntentAction.main; - try { - final actionResult = await _mediaExtensionPlugin.getIntentAction(); - intentAction = actionResult.action!; - } on PlatformException { - intentAction = IntentAction.main; - } catch (error) { - _logger.info(error); - intentAction = IntentAction.main; - } - if (intentAction == IntentAction.main) { + void setupIntentAction() async { + final mediaExtentionAction = await initIntentAction(); + AppLifecycleService.instance.setMediaExtensionAction(mediaExtentionAction); + if (mediaExtentionAction.action == IntentAction.main) { _configureBackgroundFetch(); } - AppLifecycleService.instance.setIntentAction(intentAction); - return true; } @override Widget build(BuildContext context) { if (Platform.isAndroid || kDebugMode) { - return FutureBuilder( - future: initIntentAction(), - builder: (BuildContext context, AsyncSnapshot snapshot) { - return snapshot.data != null && snapshot.data == true - ? AdaptiveTheme( - light: lightThemeData, - dark: darkThemeData, - initial: AdaptiveThemeMode.system, - builder: (lightTheme, dartTheme) => MaterialApp( - title: "ente", - themeMode: ThemeMode.system, - theme: lightTheme, - darkTheme: dartTheme, - home: const HomeWidget(), - debugShowCheckedModeBanner: false, - builder: EasyLoading.init(), - supportedLocales: AppLocalizations.supportedLocales, - localizationsDelegates: - AppLocalizations.localizationsDelegates, - ), - ) - : Container(); - }, + return AdaptiveTheme( + light: lightThemeData, + dark: darkThemeData, + initial: AdaptiveThemeMode.system, + builder: (lightTheme, dartTheme) => MaterialApp( + title: "ente", + themeMode: ThemeMode.system, + theme: lightTheme, + darkTheme: dartTheme, + home: AppLifecycleService.instance.mediaExtensionAction.action == + IntentAction.view + ? const FileViewer() + : const HomeWidget(), + debugShowCheckedModeBanner: false, + builder: EasyLoading.init(), + supportedLocales: AppLocalizations.supportedLocales, + localizationsDelegates: AppLocalizations.localizationsDelegates, + ), ); } else { return MaterialApp( diff --git a/lib/services/app_lifecycle_service.dart b/lib/services/app_lifecycle_service.dart index 58c761993..127c704a7 100644 --- a/lib/services/app_lifecycle_service.dart +++ b/lib/services/app_lifecycle_service.dart @@ -5,15 +5,17 @@ class AppLifecycleService { final _logger = Logger("AppLifecycleService"); bool isForeground = false; - IntentAction intentAction = IntentAction.main; + MediaExtentionAction mediaExtensionAction = + MediaExtentionAction(action: IntentAction.main); static final AppLifecycleService instance = AppLifecycleService._privateConstructor(); AppLifecycleService._privateConstructor(); - void setIntentAction(IntentAction intentAction) { - this.intentAction = intentAction; + void setMediaExtensionAction(MediaExtentionAction mediaExtensionAction) { + _logger.info("App invoked via ${mediaExtensionAction.action}"); + this.mediaExtensionAction = mediaExtensionAction; } void onAppInForeground(String reason) { diff --git a/lib/ui/create_collection_sheet.dart b/lib/ui/create_collection_sheet.dart index 8effafe02..9d2e418aa 100644 --- a/lib/ui/create_collection_sheet.dart +++ b/lib/ui/create_collection_sheet.dart @@ -457,8 +457,11 @@ class _CreateCollectionSheetState extends State { } Future _restoreFilesToCollection(int toCollectionID) async { - final dialog = createProgressDialog(context, "Restoring files...", - isDismissible: true); + final dialog = createProgressDialog( + context, + "Restoring files...", + isDismissible: true, + ); await dialog.show(); try { await CollectionsService.instance diff --git a/lib/ui/home_widget.dart b/lib/ui/home_widget.dart index 8cd9da256..e0f4015c7 100644 --- a/lib/ui/home_widget.dart +++ b/lib/ui/home_widget.dart @@ -264,7 +264,7 @@ class _HomeWidgetState extends State { _logger.info("Building home_Widget with tab $_selectedTabIndex"); bool isSettingsOpen = false; final enableDrawer = LocalSyncService.instance.hasCompletedFirstImport(); - + final action = AppLifecycleService.instance.mediaExtensionAction.action; return UserDetailsStateWidget( child: WillPopScope( child: Scaffold( @@ -297,9 +297,7 @@ class _HomeWidgetState extends State { Navigator.pop(context); return false; } - if (Platform.isAndroid && - AppLifecycleService.instance.intentAction == - IntentAction.main) { + if (Platform.isAndroid && action == IntentAction.main) { MoveToBackground.moveTaskToBack(); return false; } else { diff --git a/lib/ui/huge_listview/lazy_loading_gallery.dart b/lib/ui/huge_listview/lazy_loading_gallery.dart index 9baa94d67..d1e012f8d 100644 --- a/lib/ui/huge_listview/lazy_loading_gallery.dart +++ b/lib/ui/huge_listview/lazy_loading_gallery.dart @@ -311,7 +311,6 @@ class _LazyLoadingGridViewState extends State { bool? _shouldRender; int? _currentUserID; late StreamSubscription _clearSelectionsEvent; - final _mediaExtensionPlugin = MediaExtension(); @override void initState() { @@ -426,16 +425,18 @@ class _LazyLoadingGridViewState extends State { if (widget.selectedFiles.files.isNotEmpty) { _selectFile(file); } else { - if (AppLifecycleService.instance.intentAction == IntentAction.pick) { + if (AppLifecycleService.instance.mediaExtensionAction.action == + IntentAction.pick) { final ioFile = await getFile(file); - _mediaExtensionPlugin.setResult("file://${ioFile!.path}"); + MediaExtension().setResult("file://${ioFile!.path}"); } else { _routeToDetailPage(file, context); } } }, onLongPress: () { - if (AppLifecycleService.instance.intentAction == IntentAction.main) { + if (AppLifecycleService.instance.mediaExtensionAction.action == + IntentAction.main) { HapticFeedback.lightImpact(); _selectFile(file); } diff --git a/lib/ui/viewer/actions/delete_empty_albums.dart b/lib/ui/viewer/actions/delete_empty_albums.dart index 87c3852af..f474c0eb5 100644 --- a/lib/ui/viewer/actions/delete_empty_albums.dart +++ b/lib/ui/viewer/actions/delete_empty_albums.dart @@ -100,8 +100,9 @@ class _DeleteEmptyAlbumsState extends State { "${collections.length}"; try { await CollectionsService.instance.trashEmptyCollection( - collections[i].collection, - isBulkDelete: true); + collections[i].collection, + isBulkDelete: true, + ); } catch (_) { failedCount++; } diff --git a/lib/ui/viewer/actions/file_viewer.dart b/lib/ui/viewer/actions/file_viewer.dart new file mode 100644 index 000000000..a1a507444 --- /dev/null +++ b/lib/ui/viewer/actions/file_viewer.dart @@ -0,0 +1,104 @@ +import 'dart:convert'; + +import "package:chewie/chewie.dart"; +import "package:flutter/material.dart"; +import "package:flutter/services.dart"; +import "package:logging/logging.dart"; +import "package:media_extension/media_extension_action_types.dart"; +import "package:photo_view/photo_view.dart"; +import "package:photos/services/app_lifecycle_service.dart"; + +import "package:video_player/video_player.dart"; + +class FileViewer extends StatefulWidget { + const FileViewer({super.key}); + + @override + State createState() { + return FileViewerState(); + } +} + +class FileViewerState extends State { + final action = AppLifecycleService.instance.mediaExtensionAction; + ChewieController? controller; + VideoPlayerController? videoController; + final Logger _logger = Logger("FileViewer"); + + @override + void initState() { + super.initState(); + if (action.type == MediaType.video) { + initController(); + } + } + + @override + void dispose() { + videoController?.dispose(); + controller?.dispose(); + super.dispose(); + } + + void initController() async { + videoController = VideoPlayerController.contentUri( + Uri.parse(action.data!), + ); + controller = ChewieController( + videoPlayerController: videoController!, + autoInitialize: true, + aspectRatio: 16 / 9, + autoPlay: true, + looping: true, + showOptions: false, + materialProgressColors: ChewieProgressColors( + playedColor: const Color.fromRGBO(45, 194, 98, 1.0), + handleColor: Colors.white, + bufferedColor: Colors.white, + ), + ); + controller!.addListener(() { + if (!controller!.isFullScreen) { + SystemChrome.setPreferredOrientations( + [DeviceOrientation.portraitUp], + ); + } + }); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + leading: IconButton( + onPressed: () { + SystemChannels.platform.invokeMethod('SystemNavigator.pop'); + }, + icon: const Icon(Icons.arrow_back), + ), + ), + body: Column( + children: [ + Expanded( + child: Center( + child: (() { + if (action.type == MediaType.image) { + return PhotoView( + imageProvider: MemoryImage(base64Decode(action.data!)), + ); + } else if (action.type == MediaType.video) { + return controller != null + ? Chewie(controller: controller!) + : const CircularProgressIndicator(); + } else { + _logger.severe('unsupported file type ${action.type}'); + return const Icon(Icons.error); + } + })(), + ), + ), + ], + ), + ); + } +} diff --git a/lib/utils/intent_util.dart b/lib/utils/intent_util.dart new file mode 100644 index 000000000..224daf503 --- /dev/null +++ b/lib/utils/intent_util.dart @@ -0,0 +1,16 @@ +import "package:flutter/services.dart"; +import "package:media_extension/media_extension.dart"; +import "package:media_extension/media_extension_action_types.dart"; + +Future initIntentAction() async { + final mediaExtensionPlugin = MediaExtension(); + MediaExtentionAction mediaExtensionAction; + try { + mediaExtensionAction = await mediaExtensionPlugin.getIntentAction(); + } on PlatformException { + mediaExtensionAction = MediaExtentionAction(action: IntentAction.main); + } catch (error) { + mediaExtensionAction = MediaExtentionAction(action: IntentAction.main); + } + return mediaExtensionAction; +} diff --git a/pubspec.yaml b/pubspec.yaml index d2a2e311f..8582b400d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -76,7 +76,7 @@ dependencies: local_auth: ^1.1.5 logging: ^1.0.1 lottie: ^1.2.2 - media_extension: ^1.0.0 + media_extension: ^1.0.1 modal_bottom_sheet: ^3.0.0-pre motionphoto: git: "https://github.com/ente-io/motionphoto.git" diff --git a/run.sh b/run.sh index d8588cabd..078eaa019 100755 --- a/run.sh +++ b/run.sh @@ -2,14 +2,12 @@ FLUTTER_RUN="flutter run --flavor dev " -if [ ! -z "$1" ] -then - SUPPLIED_ENV_FILE="$1" - while IFS= read -r line - do - FLUTTER_RUN="$FLUTTER_RUN --dart-define $line" +SUPPLIED_ENV_FILE=".env" +while IFS= read -r line +do + FLUTTER_RUN="$FLUTTER_RUN --dart-define $line" + +done < "$SUPPLIED_ENV_FILE" - done < "$SUPPLIED_ENV_FILE" -fi echo "Running: $FLUTTER_RUN" $FLUTTER_RUN From 77de8fdcb47e7a3cc5e0d9c5aa531e2b76158167 Mon Sep 17 00:00:00 2001 From: Muhesh7 Date: Wed, 22 Feb 2023 16:32:47 +0530 Subject: [PATCH 19/49] fix(intentAction): implement platform specific intentActionCall --- lib/app.dart | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/app.dart b/lib/app.dart index 498904259..20095996c 100644 --- a/lib/app.dart +++ b/lib/app.dart @@ -41,7 +41,9 @@ class _EnteAppState extends State with WidgetsBindingObserver { } void setupIntentAction() async { - final mediaExtentionAction = await initIntentAction(); + final mediaExtentionAction = Platform.isAndroid + ? await initIntentAction() + : MediaExtentionAction(action: IntentAction.main); AppLifecycleService.instance.setMediaExtensionAction(mediaExtentionAction); if (mediaExtentionAction.action == IntentAction.main) { _configureBackgroundFetch(); From 3db345350fa83c5e495959735b77e1a4970203d2 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Wed, 22 Feb 2023 16:37:54 +0530 Subject: [PATCH 20/49] New golden banner --- lib/ui/components/notification_widget.dart | 3 +++ lib/ui/settings_page.dart | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/ui/components/notification_widget.dart b/lib/ui/components/notification_widget.dart index e732293dc..8c3d4d942 100644 --- a/lib/ui/components/notification_widget.dart +++ b/lib/ui/components/notification_widget.dart @@ -8,6 +8,7 @@ import 'package:photos/ui/components/icon_button_widget.dart'; enum NotificationType { warning, banner, + goldenBanner, } class NotificationWidget extends StatelessWidget { @@ -38,6 +39,8 @@ class NotificationWidget extends StatelessWidget { case NotificationType.banner: backgroundColor = backgroundElevated2Dark; break; + case NotificationType.goldenBanner: + backgroundColor = const Color.fromARGB(255, 250, 202, 88); } return Center( child: GestureDetector( diff --git a/lib/ui/settings_page.dart b/lib/ui/settings_page.dart index 46b862409..53ffbaaf9 100644 --- a/lib/ui/settings_page.dart +++ b/lib/ui/settings_page.dart @@ -84,7 +84,7 @@ class SettingsPage extends StatelessWidget { actionIcon: Icons.arrow_forward_outlined, text: "Double your storage", subText: "Refer friends and 2x your plan", - type: NotificationType.banner, + type: NotificationType.goldenBanner, onTap: () async { StorageBonusService.instance.markStorageBonusAsDone(); routeToPage(context, const ReferralScreen()); From f9f76a14c3f5bfaba93f70cb228bab787c14ee5c Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 22 Feb 2023 16:43:45 +0530 Subject: [PATCH 21/49] Fix: LeftAlign the albums list --- lib/ui/viewer/gallery/archive_page.dart | 45 +++++++++++++------------ 1 file changed, 24 insertions(+), 21 deletions(-) diff --git a/lib/ui/viewer/gallery/archive_page.dart b/lib/ui/viewer/gallery/archive_page.dart index 19f2999b1..85533a8a0 100644 --- a/lib/ui/viewer/gallery/archive_page.dart +++ b/lib/ui/viewer/gallery/archive_page.dart @@ -79,28 +79,31 @@ class ArchivePage extends StatelessWidget { } else if (snapshot.hasData) { final collectionsWithThumbnail = snapshot.data as List; - return SizedBox( - height: 200, - child: ListView.builder( - shrinkWrap: true, - scrollDirection: Axis.horizontal, - itemCount: collectionsWithThumbnail.length, - padding: const EdgeInsets.fromLTRB(6, 6, 6, 6), - itemBuilder: (context, index) { - final item = collectionsWithThumbnail[index]; - return GestureDetector( - behavior: HitTestBehavior.opaque, - onTap: () async {}, - child: Padding( - padding: const EdgeInsets.all(2.0), - child: CollectionItem( - item, - 120, - shouldRender: true, + return Align( + alignment: Alignment.centerLeft, + child: SizedBox( + height: 200, + child: ListView.builder( + shrinkWrap: true, + scrollDirection: Axis.horizontal, + itemCount: collectionsWithThumbnail.length, + padding: const EdgeInsets.fromLTRB(6, 6, 6, 6), + itemBuilder: (context, index) { + final item = collectionsWithThumbnail[index]; + return GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () async {}, + child: Padding( + padding: const EdgeInsets.all(2.0), + child: CollectionItem( + item, + 120, + shouldRender: true, + ), ), - ), - ); - }, + ); + }, + ), ), ); } else { From fc419f757e2c58fd1be02319647ba0bb0cfeea6d Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 22 Feb 2023 16:59:02 +0530 Subject: [PATCH 22/49] minor refactor --- lib/services/collections_service.dart | 4 +++- lib/ui/viewer/gallery/archive_page.dart | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/services/collections_service.dart b/lib/services/collections_service.dart index 5c7118ec3..df768578a 100644 --- a/lib/services/collections_service.dart +++ b/lib/services/collections_service.dart @@ -185,7 +185,9 @@ class CollectionsService { Future> getArchivedCollectionWithThumb() async { final allCollections = await getCollectionsWithThumbnails(); return allCollections - .where((element) => element.collection.isArchived()) + .where( + (c) => c.collection.isArchived() && !c.collection.isHidden(), + ) .toList(); } diff --git a/lib/ui/viewer/gallery/archive_page.dart b/lib/ui/viewer/gallery/archive_page.dart index 85533a8a0..f0daea255 100644 --- a/lib/ui/viewer/gallery/archive_page.dart +++ b/lib/ui/viewer/gallery/archive_page.dart @@ -70,7 +70,7 @@ class ArchivePage extends StatelessWidget { emptyState: const EmptyState( text: "You don't have any archived items.", ), - header: FutureBuilder( + header: FutureBuilder>( future: CollectionsService.instance.getArchivedCollectionWithThumb(), builder: (context, snapshot) { if (snapshot.hasError) { From c03a34fa21a38d4f6c30779f2053791ce8470081 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Wed, 22 Feb 2023 18:20:42 +0530 Subject: [PATCH 23/49] Create new golden color --- lib/theme/colors.dart | 4 ++++ lib/ui/components/notification_widget.dart | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/theme/colors.dart b/lib/theme/colors.dart index 721ca4104..9594949cb 100644 --- a/lib/theme/colors.dart +++ b/lib/theme/colors.dart @@ -51,6 +51,7 @@ class EnteColorScheme { //other colors final Color tabIcon; final List avatarColors; + final Color golden500; const EnteColorScheme( this.backgroundBase, @@ -86,6 +87,7 @@ class EnteColorScheme { this.warning500 = _warning500, this.warning400 = _warning400, this.caution500 = _caution500, + this.golden500 = _golden500, }); } @@ -224,6 +226,8 @@ const Color _warning800 = Color(0xFFF53434); const Color _caution500 = Color.fromRGBO(255, 194, 71, 1); +const Color _golden500 = Color(0xFFFFC94D); + const List avatarLight = [ Color.fromRGBO(118, 84, 154, 1), Color.fromRGBO(223, 120, 97, 1), diff --git a/lib/ui/components/notification_widget.dart b/lib/ui/components/notification_widget.dart index 8c3d4d942..cf80c6202 100644 --- a/lib/ui/components/notification_widget.dart +++ b/lib/ui/components/notification_widget.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:photos/ente_theme_data.dart'; import 'package:photos/theme/colors.dart'; +import "package:photos/theme/ente_theme.dart"; import 'package:photos/theme/text_style.dart'; import 'package:photos/ui/components/icon_button_widget.dart'; @@ -40,7 +41,7 @@ class NotificationWidget extends StatelessWidget { backgroundColor = backgroundElevated2Dark; break; case NotificationType.goldenBanner: - backgroundColor = const Color.fromARGB(255, 250, 202, 88); + backgroundColor = getEnteColorScheme(context).golden500; } return Center( child: GestureDetector( From 09fe8288d72814623b3eeb330d903c0d206a1136 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Wed, 22 Feb 2023 18:23:06 +0530 Subject: [PATCH 24/49] Added shimmer animation to golden banner in settings --- lib/ui/settings_page.dart | 33 ++++++++++++++++++++------------- pubspec.lock | 8 ++++++++ pubspec.yaml | 1 + 3 files changed, 29 insertions(+), 13 deletions(-) diff --git a/lib/ui/settings_page.dart b/lib/ui/settings_page.dart index 53ffbaaf9..f21b9195f 100644 --- a/lib/ui/settings_page.dart +++ b/lib/ui/settings_page.dart @@ -2,6 +2,7 @@ import 'dart:io'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; +import "package:flutter_animate/flutter_animate.dart"; import 'package:photos/core/configuration.dart'; import 'package:photos/core/event_bus.dart'; import 'package:photos/events/opened_settings_event.dart'; @@ -46,6 +47,8 @@ class SettingsPage extends StatelessWidget { } Widget _getBody(BuildContext context, EnteColorScheme colorScheme) { + Animate.restartOnHotReload = true; + final hasLoggedIn = Configuration.instance.isLoggedIn(); final enteTextTheme = getEnteTextTheme(context); final List contents = []; @@ -77,19 +80,23 @@ class SettingsPage extends StatelessWidget { contents.addAll([ const StorageCardWidget(), StorageBonusService.instance.shouldShowStorageBonus() - ? Padding( - padding: const EdgeInsets.symmetric(vertical: 8.0), - child: NotificationWidget( - startIcon: Icons.auto_awesome, - actionIcon: Icons.arrow_forward_outlined, - text: "Double your storage", - subText: "Refer friends and 2x your plan", - type: NotificationType.goldenBanner, - onTap: () async { - StorageBonusService.instance.markStorageBonusAsDone(); - routeToPage(context, const ReferralScreen()); - }, - ), + ? RepaintBoundary( + child: Padding( + padding: const EdgeInsets.symmetric(vertical: 8.0), + child: NotificationWidget( + startIcon: Icons.auto_awesome, + actionIcon: Icons.arrow_forward_outlined, + text: "Double your storage", + subText: "Refer friends and 2x your plan", + type: NotificationType.goldenBanner, + onTap: () async { + StorageBonusService.instance.markStorageBonusAsDone(); + routeToPage(context, const ReferralScreen()); + }, + ), + ) + .animate(onPlay: (controller) => controller.repeat()) + .shimmer(duration: 1000.ms, delay: 4000.ms, size: 0.6), ) : const SizedBox(height: 12), const BackupSectionWidget(), diff --git a/pubspec.lock b/pubspec.lock index b1fb94dce..0b23a8530 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -477,6 +477,14 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_animate: + dependency: "direct main" + description: + name: flutter_animate + sha256: c6e38af9fe376fa07fb6995fe6a12d07a08828d2847aa652b7c1bc60f9993374 + url: "https://pub.dev" + source: hosted + version: "4.1.0" flutter_blurhash: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index d2a2e311f..9f91f70a2 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -49,6 +49,7 @@ dependencies: fk_user_agent: ^2.0.1 flutter: sdk: flutter + flutter_animate: ^4.1.0 flutter_cache_manager: ^3.3.0 flutter_datetime_picker: ^1.5.1 flutter_easyloading: ^3.0.0 From 00471301264ac8b917af42fc5ecbde56016334b9 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Wed, 22 Feb 2023 20:08:37 +0530 Subject: [PATCH 25/49] Change shimmer delay --- lib/ui/settings_page.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ui/settings_page.dart b/lib/ui/settings_page.dart index f21b9195f..75373853a 100644 --- a/lib/ui/settings_page.dart +++ b/lib/ui/settings_page.dart @@ -96,7 +96,7 @@ class SettingsPage extends StatelessWidget { ), ) .animate(onPlay: (controller) => controller.repeat()) - .shimmer(duration: 1000.ms, delay: 4000.ms, size: 0.6), + .shimmer(duration: 1000.ms, delay: 3200.ms, size: 0.6), ) : const SizedBox(height: 12), const BackupSectionWidget(), From 098ee63da7b9882f81810783aece7403504cfa18 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Wed, 22 Feb 2023 20:15:40 +0530 Subject: [PATCH 26/49] Removed code used for testing --- lib/ui/settings_page.dart | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib/ui/settings_page.dart b/lib/ui/settings_page.dart index 75373853a..ff3a1b62b 100644 --- a/lib/ui/settings_page.dart +++ b/lib/ui/settings_page.dart @@ -47,8 +47,6 @@ class SettingsPage extends StatelessWidget { } Widget _getBody(BuildContext context, EnteColorScheme colorScheme) { - Animate.restartOnHotReload = true; - final hasLoggedIn = Configuration.instance.isLoggedIn(); final enteTextTheme = getEnteTextTheme(context); final List contents = []; From 01ebff7f7004ed8f8b6c443ffa2cfbc7840be08e Mon Sep 17 00:00:00 2001 From: ashilkn Date: Wed, 22 Feb 2023 20:34:03 +0530 Subject: [PATCH 27/49] Darken golden500 --- lib/theme/colors.dart | 2 +- lib/ui/settings_page.dart | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/theme/colors.dart b/lib/theme/colors.dart index 9594949cb..9b275c22b 100644 --- a/lib/theme/colors.dart +++ b/lib/theme/colors.dart @@ -226,7 +226,7 @@ const Color _warning800 = Color(0xFFF53434); const Color _caution500 = Color.fromRGBO(255, 194, 71, 1); -const Color _golden500 = Color(0xFFFFC94D); +const Color _golden500 = Color(0xFFFDB816); const List avatarLight = [ Color.fromRGBO(118, 84, 154, 1), diff --git a/lib/ui/settings_page.dart b/lib/ui/settings_page.dart index ff3a1b62b..0b709092c 100644 --- a/lib/ui/settings_page.dart +++ b/lib/ui/settings_page.dart @@ -92,9 +92,11 @@ class SettingsPage extends StatelessWidget { routeToPage(context, const ReferralScreen()); }, ), - ) - .animate(onPlay: (controller) => controller.repeat()) - .shimmer(duration: 1000.ms, delay: 3200.ms, size: 0.6), + ).animate(onPlay: (controller) => controller.repeat()).shimmer( + duration: 1000.ms, + delay: 3200.ms, + size: 0.6, + ), ) : const SizedBox(height: 12), const BackupSectionWidget(), From cefd9eb052e0236e299b72f1f0448410404f4bc2 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Wed, 22 Feb 2023 20:55:55 +0530 Subject: [PATCH 28/49] Added linear gradient for golden banner --- lib/theme/colors.dart | 9 +++++++-- lib/ui/components/notification_widget.dart | 12 ++++++++++-- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/lib/theme/colors.dart b/lib/theme/colors.dart index 9b275c22b..fcf2e9f62 100644 --- a/lib/theme/colors.dart +++ b/lib/theme/colors.dart @@ -48,10 +48,13 @@ class EnteColorScheme { final Color warning800; final Color caution500; + //golden colors + final Color golden700; + final Color golden500; + //other colors final Color tabIcon; final List avatarColors; - final Color golden500; const EnteColorScheme( this.backgroundBase, @@ -87,6 +90,7 @@ class EnteColorScheme { this.warning500 = _warning500, this.warning400 = _warning400, this.caution500 = _caution500, + this.golden700 = _golden700, this.golden500 = _golden500, }); } @@ -226,7 +230,8 @@ const Color _warning800 = Color(0xFFF53434); const Color _caution500 = Color.fromRGBO(255, 194, 71, 1); -const Color _golden500 = Color(0xFFFDB816); +const Color _golden700 = Color(0xFFFDB816); +const Color _golden500 = Color(0xFFFFC336); const List avatarLight = [ Color.fromRGBO(118, 84, 154, 1), diff --git a/lib/ui/components/notification_widget.dart b/lib/ui/components/notification_widget.dart index cf80c6202..cc9d7ec44 100644 --- a/lib/ui/components/notification_widget.dart +++ b/lib/ui/components/notification_widget.dart @@ -32,7 +32,9 @@ class NotificationWidget extends StatelessWidget { @override Widget build(BuildContext context) { - Color backgroundColor = Colors.white; + final colorScheme = getEnteColorScheme(context); + LinearGradient? backgroundGradient; + Color? backgroundColor; switch (type) { case NotificationType.warning: backgroundColor = warning500; @@ -41,7 +43,12 @@ class NotificationWidget extends StatelessWidget { backgroundColor = backgroundElevated2Dark; break; case NotificationType.goldenBanner: - backgroundColor = getEnteColorScheme(context).golden500; + backgroundGradient = LinearGradient( + colors: [colorScheme.golden700, colorScheme.golden500], + stops: const [0.25, 1], + begin: Alignment.bottomCenter, + end: Alignment.topCenter, + ); } return Center( child: GestureDetector( @@ -53,6 +60,7 @@ class NotificationWidget extends StatelessWidget { ), boxShadow: Theme.of(context).colorScheme.enteTheme.shadowMenu, color: backgroundColor, + gradient: backgroundGradient, ), child: Padding( padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), From ca28d7c8549eb809c5d12f66117b2af326da6d3a Mon Sep 17 00:00:00 2001 From: vishnukvmd Date: Wed, 22 Feb 2023 21:42:50 +0530 Subject: [PATCH 29/49] Fix minor glitch --- lib/ui/sharing/share_collection_page.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/ui/sharing/share_collection_page.dart b/lib/ui/sharing/share_collection_page.dart index 473c0dd6a..4856c3d91 100644 --- a/lib/ui/sharing/share_collection_page.dart +++ b/lib/ui/sharing/share_collection_page.dart @@ -228,7 +228,6 @@ class _ShareCollectionPageState extends State { ), leadingIcon: Icons.link, menuItemColor: getEnteColorScheme(context).fillFaint, - isBottomBorderRadiusRemoved: true, showOnlyLoadingState: true, onTap: () async { final bool result = From 86e35e5cfc52fa3816d53bdd31ef55c87de56e9a Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Thu, 23 Feb 2023 06:45:29 +0530 Subject: [PATCH 30/49] Refactor:create widget for horizonal album listing --- .../album_horizontal_list_widget.dart | 88 +++++++++++++++++++ lib/ui/viewer/gallery/archive_page.dart | 48 +--------- 2 files changed, 91 insertions(+), 45 deletions(-) create mode 100644 lib/ui/components/album_horizontal_list_widget.dart diff --git a/lib/ui/components/album_horizontal_list_widget.dart b/lib/ui/components/album_horizontal_list_widget.dart new file mode 100644 index 000000000..b713f4e23 --- /dev/null +++ b/lib/ui/components/album_horizontal_list_widget.dart @@ -0,0 +1,88 @@ +import "dart:async"; + +import "package:flutter/cupertino.dart"; +import "package:logging/logging.dart"; +import "package:photos/core/event_bus.dart"; +import "package:photos/events/collection_updated_event.dart"; +import "package:photos/models/collection_items.dart"; +import "package:photos/ui/collections/collection_item_widget.dart"; +import "package:photos/ui/common/loading_widget.dart"; + +class AlbumHorizontalListWidget extends StatefulWidget { + final Future> future; + const AlbumHorizontalListWidget( + this.future, { + Key? key, + }) : super(key: key); + + @override + State createState() => + _AlbumHorizontalListWidgetState(); +} + +class _AlbumHorizontalListWidgetState extends State { + late StreamSubscription + _collectionUpdatesSubscription; + late Logger _logger; + + @override + void initState() { + _collectionUpdatesSubscription = + Bus.instance.on().listen((event) { + setState(() {}); + }); + _logger = Logger((_AlbumHorizontalListWidgetState).toString()); + super.initState(); + } + + @override + void dispose() { + _collectionUpdatesSubscription.cancel(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return FutureBuilder>( + future: widget.future, + builder: (context, snapshot) { + if (snapshot.hasError) { + _logger.severe("failed to fetch albums", snapshot.error); + return const Text("Something went wrong"); + } else if (snapshot.hasData) { + final collectionsWithThumbnail = + snapshot.data as List; + return Align( + alignment: Alignment.centerLeft, + child: SizedBox( + height: 200, + child: ListView.builder( + shrinkWrap: true, + scrollDirection: Axis.horizontal, + itemCount: collectionsWithThumbnail.length, + padding: const EdgeInsets.fromLTRB(6, 6, 6, 6), + itemBuilder: (context, index) { + final item = collectionsWithThumbnail[index]; + return GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () async {}, + child: Padding( + padding: const EdgeInsets.all(2.0), + child: CollectionItem( + item, + 120, + shouldRender: true, + ), + ), + ); + }, + ), + ), + ); + } else { + return const EnteLoadingWidget(); + } + }, + ); + } +} diff --git a/lib/ui/viewer/gallery/archive_page.dart b/lib/ui/viewer/gallery/archive_page.dart index f0daea255..4f7af2750 100644 --- a/lib/ui/viewer/gallery/archive_page.dart +++ b/lib/ui/viewer/gallery/archive_page.dart @@ -1,17 +1,14 @@ import 'package:collection/collection.dart' show IterableExtension; import 'package:flutter/material.dart'; -import "package:logging/logging.dart"; import 'package:photos/core/configuration.dart'; import 'package:photos/core/event_bus.dart'; import 'package:photos/db/files_db.dart'; import 'package:photos/events/files_updated_event.dart'; -import "package:photos/models/collection_items.dart"; import 'package:photos/models/gallery_type.dart'; import 'package:photos/models/magic_metadata.dart'; import 'package:photos/models/selected_files.dart'; import 'package:photos/services/collections_service.dart'; -import "package:photos/ui/collections/collection_item_widget.dart"; -import "package:photos/ui/common/loading_widget.dart"; +import "package:photos/ui/components/album_horizontal_list_widget.dart"; import 'package:photos/ui/viewer/actions/file_selection_overlay_bar.dart'; import "package:photos/ui/viewer/gallery/empty_state.dart"; import 'package:photos/ui/viewer/gallery/gallery.dart'; @@ -22,7 +19,6 @@ class ArchivePage extends StatelessWidget { final GalleryType appBarType; final GalleryType overlayType; final _selectedFiles = SelectedFiles(); - final Logger _logger = Logger("ArchivePage"); ArchivePage({ this.tagPrefix = "archived_page", @@ -70,46 +66,8 @@ class ArchivePage extends StatelessWidget { emptyState: const EmptyState( text: "You don't have any archived items.", ), - header: FutureBuilder>( - future: CollectionsService.instance.getArchivedCollectionWithThumb(), - builder: (context, snapshot) { - if (snapshot.hasError) { - _logger.severe("failed to fetch archived albums", snapshot.error); - return const Text("Something went wrong"); - } else if (snapshot.hasData) { - final collectionsWithThumbnail = - snapshot.data as List; - return Align( - alignment: Alignment.centerLeft, - child: SizedBox( - height: 200, - child: ListView.builder( - shrinkWrap: true, - scrollDirection: Axis.horizontal, - itemCount: collectionsWithThumbnail.length, - padding: const EdgeInsets.fromLTRB(6, 6, 6, 6), - itemBuilder: (context, index) { - final item = collectionsWithThumbnail[index]; - return GestureDetector( - behavior: HitTestBehavior.opaque, - onTap: () async {}, - child: Padding( - padding: const EdgeInsets.all(2.0), - child: CollectionItem( - item, - 120, - shouldRender: true, - ), - ), - ); - }, - ), - ), - ); - } else { - return const EnteLoadingWidget(); - } - }, + header: AlbumHorizontalListWidget( + CollectionsService.instance.getArchivedCollectionWithThumb(), ), ); return Scaffold( From e0b1c2c4636e7b7a33f89c5c3abe4f3152268646 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Thu, 23 Feb 2023 06:52:08 +0530 Subject: [PATCH 31/49] Fix bug in state refresh --- lib/ui/components/album_horizontal_list_widget.dart | 6 ++++-- lib/ui/viewer/gallery/archive_page.dart | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/ui/components/album_horizontal_list_widget.dart b/lib/ui/components/album_horizontal_list_widget.dart index b713f4e23..281e0cc81 100644 --- a/lib/ui/components/album_horizontal_list_widget.dart +++ b/lib/ui/components/album_horizontal_list_widget.dart @@ -9,7 +9,8 @@ import "package:photos/ui/collections/collection_item_widget.dart"; import "package:photos/ui/common/loading_widget.dart"; class AlbumHorizontalListWidget extends StatefulWidget { - final Future> future; + final Future> Function() future; + const AlbumHorizontalListWidget( this.future, { Key? key, @@ -43,8 +44,9 @@ class _AlbumHorizontalListWidgetState extends State { @override Widget build(BuildContext context) { + debugPrint('$runtimeType widget build'); return FutureBuilder>( - future: widget.future, + future: widget.future(), builder: (context, snapshot) { if (snapshot.hasError) { _logger.severe("failed to fetch albums", snapshot.error); diff --git a/lib/ui/viewer/gallery/archive_page.dart b/lib/ui/viewer/gallery/archive_page.dart index 4f7af2750..14cb2f62d 100644 --- a/lib/ui/viewer/gallery/archive_page.dart +++ b/lib/ui/viewer/gallery/archive_page.dart @@ -67,7 +67,7 @@ class ArchivePage extends StatelessWidget { text: "You don't have any archived items.", ), header: AlbumHorizontalListWidget( - CollectionsService.instance.getArchivedCollectionWithThumb(), + CollectionsService.instance.getArchivedCollectionWithThumb, ), ); return Scaffold( From a48812c7e862ff4647a1fb5c06fed2f0645b38ed Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Thu, 23 Feb 2023 07:00:16 +0530 Subject: [PATCH 32/49] Add horizontal divider --- .../album_horizontal_list_widget.dart | 47 +++++++++++-------- 1 file changed, 27 insertions(+), 20 deletions(-) diff --git a/lib/ui/components/album_horizontal_list_widget.dart b/lib/ui/components/album_horizontal_list_widget.dart index 281e0cc81..6972238b7 100644 --- a/lib/ui/components/album_horizontal_list_widget.dart +++ b/lib/ui/components/album_horizontal_list_widget.dart @@ -7,6 +7,7 @@ import "package:photos/events/collection_updated_event.dart"; import "package:photos/models/collection_items.dart"; import "package:photos/ui/collections/collection_item_widget.dart"; import "package:photos/ui/common/loading_widget.dart"; +import "package:photos/ui/components/divider_widget.dart"; class AlbumHorizontalListWidget extends StatefulWidget { final Future> Function() future; @@ -57,27 +58,33 @@ class _AlbumHorizontalListWidgetState extends State { return Align( alignment: Alignment.centerLeft, child: SizedBox( - height: 200, - child: ListView.builder( - shrinkWrap: true, - scrollDirection: Axis.horizontal, - itemCount: collectionsWithThumbnail.length, - padding: const EdgeInsets.fromLTRB(6, 6, 6, 6), - itemBuilder: (context, index) { - final item = collectionsWithThumbnail[index]; - return GestureDetector( - behavior: HitTestBehavior.opaque, - onTap: () async {}, - child: Padding( - padding: const EdgeInsets.all(2.0), - child: CollectionItem( - item, - 120, - shouldRender: true, - ), + height: 180, + child: Column( + children: [ + Expanded( + child: ListView.builder( + scrollDirection: Axis.horizontal, + itemCount: collectionsWithThumbnail.length, + padding: const EdgeInsets.fromLTRB(6, 6, 6, 6), + itemBuilder: (context, index) { + final item = collectionsWithThumbnail[index]; + return GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () async {}, + child: Padding( + padding: const EdgeInsets.all(2.0), + child: CollectionItem( + item, + 120, + shouldRender: true, + ), + ), + ); + }, ), - ); - }, + ), + const DividerWidget(dividerType: DividerType.solid), + ], ), ), ); From cd3a71e56e61cff3d9261f4169e8a9e099f4bf9b Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Thu, 23 Feb 2023 07:05:22 +0530 Subject: [PATCH 33/49] Shrink horizontal album widget when empty --- lib/ui/components/album_horizontal_list_widget.dart | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/ui/components/album_horizontal_list_widget.dart b/lib/ui/components/album_horizontal_list_widget.dart index 6972238b7..ac3782787 100644 --- a/lib/ui/components/album_horizontal_list_widget.dart +++ b/lib/ui/components/album_horizontal_list_widget.dart @@ -53,6 +53,9 @@ class _AlbumHorizontalListWidgetState extends State { _logger.severe("failed to fetch albums", snapshot.error); return const Text("Something went wrong"); } else if (snapshot.hasData) { + if (snapshot.data!.isEmpty) { + return const SizedBox.shrink(); + } final collectionsWithThumbnail = snapshot.data as List; return Align( From 3a24c43bd32003a04da4b71abb2ad91dfe5ed542 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Thu, 23 Feb 2023 07:41:04 +0530 Subject: [PATCH 34/49] bump version to 0.7.27+427 --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 0cbf3b975..94eb50b08 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -12,7 +12,7 @@ description: ente photos application # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 0.7.26+426 +version: 0.7.27+427 environment: sdk: '>=2.17.0 <3.0.0' From 90cad06cde39aada446488147a6e0be581a17cf2 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Thu, 23 Feb 2023 08:42:58 +0530 Subject: [PATCH 35/49] Refactor: Code display in separate widget --- lib/ui/growth/referral_code_widget.dart | 49 +++++++++++++++++++++++++ lib/ui/growth/referral_screen.dart | 38 +------------------ 2 files changed, 51 insertions(+), 36 deletions(-) create mode 100644 lib/ui/growth/referral_code_widget.dart diff --git a/lib/ui/growth/referral_code_widget.dart b/lib/ui/growth/referral_code_widget.dart new file mode 100644 index 000000000..80806431e --- /dev/null +++ b/lib/ui/growth/referral_code_widget.dart @@ -0,0 +1,49 @@ +import "package:dotted_border/dotted_border.dart"; +import "package:flutter/material.dart"; +import "package:photos/theme/ente_theme.dart"; + +// Figma: https://www.figma.com/file/SYtMyLBs5SAOkTbfMMzhqt/ente-Visual-Design?node-id=11219%3A62974&t=BRCLJhxXP11Q3Wyw-0 +class ReferralCodeWidget extends StatelessWidget { + final String codeValue; + + const ReferralCodeWidget(this.codeValue, {Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + final colorScheme = getEnteColorScheme(context); + final textStyle = getEnteTextTheme(context); + return Center( + child: DottedBorder( + color: colorScheme.strokeMuted, + strokeWidth: 1, + dashPattern: const [6, 6], + radius: const Radius.circular(8), + child: Padding( + padding: const EdgeInsets.only( + left: 26.0, + top: 14, + right: 12, + bottom: 14, + ), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + codeValue, + style: textStyle.bodyBold.copyWith( + color: colorScheme.primary700, + ), + ), + const SizedBox(width: 12), + Icon( + Icons.adaptive.share, + size: 22, + color: colorScheme.strokeMuted, + ) + ], + ), + ), + ), + ); + } +} diff --git a/lib/ui/growth/referral_screen.dart b/lib/ui/growth/referral_screen.dart index 1b33e43e2..e179e18a9 100644 --- a/lib/ui/growth/referral_screen.dart +++ b/lib/ui/growth/referral_screen.dart @@ -1,4 +1,3 @@ -import "package:dotted_border/dotted_border.dart"; import "package:flutter/material.dart"; import "package:photos/models/api/storage_bonus/storage_bonus.dart"; import "package:photos/models/user_details.dart"; @@ -14,6 +13,7 @@ import "package:photos/ui/components/menu_item_widget/menu_item_widget.dart"; import "package:photos/ui/components/title_bar_title_widget.dart"; import "package:photos/ui/components/title_bar_widget.dart"; import "package:photos/ui/growth/apply_code_screen.dart"; +import "package:photos/ui/growth/referral_code_widget.dart"; import "package:photos/ui/growth/storage_details_screen.dart"; import "package:photos/utils/data_util.dart"; import "package:photos/utils/navigation_util.dart"; @@ -153,41 +153,7 @@ class ReferralWidget extends StatelessWidget { "friends", ), const SizedBox(height: 12), - Center( - child: DottedBorder( - color: colorScheme.strokeMuted, - //color of dotted/dash line - strokeWidth: 1, - //thickness of dash/dots - dashPattern: const [6, 6], - radius: const Radius.circular(8), - child: Padding( - padding: const EdgeInsets.only( - left: 26.0, - top: 14, - right: 12, - bottom: 14, - ), - child: Row( - mainAxisSize: MainAxisSize.min, - children: [ - Text( - referralView.code, - style: textStyle.bodyBold.copyWith( - color: colorScheme.primary700, - ), - ), - const SizedBox(width: 12), - Icon( - Icons.adaptive.share, - size: 22, - color: colorScheme.strokeMuted, - ) - ], - ), - ), - ), - ), + ReferralCodeWidget(referralView.code), const SizedBox(height: 12), const Text( "2. They sign up for a paid plan", From edb43b161c1946b074bf405e88a289402e459110 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Thu, 23 Feb 2023 08:46:11 +0530 Subject: [PATCH 36/49] Lint: Add trailing commas --- lib/extensions/input_formatter.dart | 4 +++- lib/ui/growth/referral_screen.dart | 20 +++++++++++++------- lib/ui/growth/storage_details_screen.dart | 16 ++++++++++------ 3 files changed, 26 insertions(+), 14 deletions(-) diff --git a/lib/extensions/input_formatter.dart b/lib/extensions/input_formatter.dart index 16a67d7ea..79b59ae6b 100644 --- a/lib/extensions/input_formatter.dart +++ b/lib/extensions/input_formatter.dart @@ -3,7 +3,9 @@ import "package:flutter/services.dart"; class UpperCaseTextFormatter extends TextInputFormatter { @override TextEditingValue formatEditUpdate( - TextEditingValue oldValue, TextEditingValue newValue) { + TextEditingValue oldValue, + TextEditingValue newValue, + ) { return TextEditingValue( text: newValue.text.toUpperCase(), selection: newValue.selection, diff --git a/lib/ui/growth/referral_screen.dart b/lib/ui/growth/referral_screen.dart index e179e18a9..f63a59c7a 100644 --- a/lib/ui/growth/referral_screen.dart +++ b/lib/ui/growth/referral_screen.dart @@ -129,7 +129,8 @@ class ReferralWidget extends StatelessWidget { ? InkWell( onTap: () { shareText( - "ente referral code: ${referralView.code} \n\nApply it in Settings → General → Referrals to get 10 GB free after you signup for a paid plan\n\nhttps://ente.io"); + "ente referral code: ${referralView.code} \n\nApply it in Settings → General → Referrals to get 10 GB free after you signup for a paid plan\n\nhttps://ente.io", + ); }, child: Container( width: double.infinity, @@ -179,9 +180,11 @@ class ReferralWidget extends StatelessWidget { color: colorScheme.strokeMuted, ), const SizedBox(height: 12), - Text("Referrals are currently paused", - style: textStyle.small - .copyWith(color: colorScheme.textFaint)), + Text( + "Referrals are currently paused", + style: textStyle.small + .copyWith(color: colorScheme.textFaint), + ), ], ), ), @@ -239,9 +242,12 @@ class ReferralWidget extends StatelessWidget { alignCaptionedTextToLeft: true, onTap: () async { routeToPage( - context, - const WebPage( - "FAQ", "https://ente.io/faq/general/referral-program")); + context, + const WebPage( + "FAQ", + "https://ente.io/faq/general/referral-program", + ), + ); }, ), const SizedBox(height: 24), diff --git a/lib/ui/growth/storage_details_screen.dart b/lib/ui/growth/storage_details_screen.dart index 2efa187a9..02144f4c0 100644 --- a/lib/ui/growth/storage_details_screen.dart +++ b/lib/ui/growth/storage_details_screen.dart @@ -108,19 +108,23 @@ class _StorageDetailsScreenState extends State { BonusInfoSection( sectionName: "Free storage claimed", leftValue: convertBytesToAbsoluteGBs( - widget.referralView.claimedStorage), + widget.referralView.claimedStorage, + ), leftUnitName: "GB", rightValue: null, ), BonusInfoSection( sectionName: "Free storage usable", - leftValue: convertBytesToAbsoluteGBs(min( - widget.referralView.claimedStorage, - widget.userDetails.getTotalStorage(), - )), + leftValue: convertBytesToAbsoluteGBs( + min( + widget.referralView.claimedStorage, + widget.userDetails.getTotalStorage(), + ), + ), leftUnitName: "GB", rightValue: convertBytesToAbsoluteGBs( - widget.userDetails.getTotalStorage()), + widget.userDetails.getTotalStorage(), + ), rightUnitName: "GB", ), const SizedBox( From 35a13ff1fdb49ed5e4a634825ba97b070b3c9c30 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Thu, 23 Feb 2023 09:29:35 +0530 Subject: [PATCH 37/49] CodeWidget: Fix background color --- lib/ui/growth/referral_code_widget.dart | 57 +++++++++++++------------ 1 file changed, 30 insertions(+), 27 deletions(-) diff --git a/lib/ui/growth/referral_code_widget.dart b/lib/ui/growth/referral_code_widget.dart index 80806431e..65fbf0411 100644 --- a/lib/ui/growth/referral_code_widget.dart +++ b/lib/ui/growth/referral_code_widget.dart @@ -13,34 +13,37 @@ class ReferralCodeWidget extends StatelessWidget { final colorScheme = getEnteColorScheme(context); final textStyle = getEnteTextTheme(context); return Center( - child: DottedBorder( - color: colorScheme.strokeMuted, - strokeWidth: 1, - dashPattern: const [6, 6], - radius: const Radius.circular(8), - child: Padding( - padding: const EdgeInsets.only( - left: 26.0, - top: 14, - right: 12, - bottom: 14, - ), - child: Row( - mainAxisSize: MainAxisSize.min, - children: [ - Text( - codeValue, - style: textStyle.bodyBold.copyWith( - color: colorScheme.primary700, + child: Container( + color: colorScheme.backgroundElevated2, + child: DottedBorder( + color: colorScheme.strokeMuted, + strokeWidth: 1, + dashPattern: const [6, 6], + radius: const Radius.circular(8), + child: Padding( + padding: const EdgeInsets.only( + left: 26.0, + top: 14, + right: 12, + bottom: 14, + ), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + codeValue, + style: textStyle.bodyBold.copyWith( + color: colorScheme.primary700, + ), ), - ), - const SizedBox(width: 12), - Icon( - Icons.adaptive.share, - size: 22, - color: colorScheme.strokeMuted, - ) - ], + const SizedBox(width: 12), + Icon( + Icons.adaptive.share, + size: 22, + color: colorScheme.strokeMuted, + ) + ], + ), ), ), ), From 140f6d26e01447346680c0d39379112047263fd6 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Thu, 23 Feb 2023 09:41:39 +0530 Subject: [PATCH 38/49] Add code success screen --- lib/ui/growth/code_success_screen.dart | 145 +++++++++++++++++++++++++ 1 file changed, 145 insertions(+) create mode 100644 lib/ui/growth/code_success_screen.dart diff --git a/lib/ui/growth/code_success_screen.dart b/lib/ui/growth/code_success_screen.dart new file mode 100644 index 000000000..f19e99018 --- /dev/null +++ b/lib/ui/growth/code_success_screen.dart @@ -0,0 +1,145 @@ +import "package:flutter/material.dart"; +import "package:photos/models/api/storage_bonus/storage_bonus.dart"; +import "package:photos/models/user_details.dart"; +import "package:photos/theme/ente_theme.dart"; +import "package:photos/ui/components/captioned_text_widget.dart"; +import "package:photos/ui/components/icon_button_widget.dart"; +import "package:photos/ui/components/menu_item_widget/menu_item_widget.dart"; +import "package:photos/ui/components/title_bar_title_widget.dart"; +import "package:photos/ui/components/title_bar_widget.dart"; +import "package:photos/ui/growth/referral_code_widget.dart"; +import "package:photos/ui/growth/storage_details_screen.dart"; +import "package:photos/utils/navigation_util.dart"; +import "package:photos/utils/share_util.dart"; + +class CodeSuccessScreen extends StatelessWidget { + final ReferralView referralView; + final UserDetails userDetails; + + const CodeSuccessScreen(this.referralView, this.userDetails, {super.key}); + + @override + Widget build(BuildContext context) { + final colorScheme = getEnteColorScheme(context); + final textStyle = getEnteTextTheme(context); + return Scaffold( + body: CustomScrollView( + primary: false, + slivers: [ + TitleBarWidget( + flexibleSpaceTitle: const TitleBarTitleWidget( + title: "Code applied", + ), + actionIcons: [ + IconButtonWidget( + icon: Icons.close_outlined, + iconButtonType: IconButtonType.secondary, + onTap: () { + Navigator.pop(context); + }, + ), + ], + ), + SliverList( + delegate: SliverChildBuilderDelegate( + (delegateBuildContext, index) { + return Padding( + padding: const EdgeInsets.symmetric( + horizontal: 12, + vertical: 6, + ), + child: Padding( + padding: const EdgeInsets.symmetric(vertical: 12.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + "${referralView.planInfo.storageInGB} GB", + style: textStyle.h2Bold, + ), + Text( + "Claimed", + style: textStyle.body + .copyWith(color: colorScheme.textMuted), + ), + const SizedBox(height: 32), + MenuItemWidget( + captionedTextWidget: const CaptionedTextWidget( + title: "Details", + ), + menuItemColor: colorScheme.fillFaint, + trailingWidget: Icon( + Icons.chevron_right_outlined, + color: colorScheme.strokeBase, + ), + singleBorderRadius: 8, + alignCaptionedTextToLeft: true, + onTap: () async { + routeToPage( + context, + StorageDetailsScreen(referralView, userDetails), + ); + }, + ), + const SizedBox(height: 32), + InkWell( + onTap: () { + shareText( + "ente referral code: ${referralView.code} \n\nApply it in Settings → General → Referrals to get ${referralView.planInfo.storageInGB} GB free after you signup for a paid plan\n\nhttps://ente.io", + ); + }, + child: Container( + width: double.infinity, + decoration: BoxDecoration( + border: Border.all( + color: colorScheme.strokeFaint, + width: 1, + ), + borderRadius: BorderRadius.circular(8), + ), + child: Padding( + padding: const EdgeInsets.symmetric( + vertical: 12, + horizontal: 12, + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + "Claim more!", + style: textStyle.body, + ), + const SizedBox(height: 8), + Text( + "${referralView.planInfo.storageInGB} GB each time someone signs up for a paid plan and applies your code", + style: textStyle.small + .copyWith(color: colorScheme.textMuted), + textAlign: TextAlign.center, + ), + const SizedBox(height: 16), + ReferralCodeWidget(referralView.code), + const SizedBox(height: 16), + Text( + "They also get ${referralView.planInfo.storageInGB} GB", + style: textStyle.small + .copyWith(color: colorScheme.textMuted), + textAlign: TextAlign.center, + ), + ], + ), + ), + ), + ) + ], + ), + ), + ); + }, + childCount: 1, + ), + ), + ], + ), + ); + } +} From b6303e982d728f3bba19a9df0be4a652a4463945 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Thu, 23 Feb 2023 09:53:08 +0530 Subject: [PATCH 39/49] Show check icon on claim success screen --- lib/ui/growth/code_success_screen.dart | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/ui/growth/code_success_screen.dart b/lib/ui/growth/code_success_screen.dart index f19e99018..9a70f001c 100644 --- a/lib/ui/growth/code_success_screen.dart +++ b/lib/ui/growth/code_success_screen.dart @@ -53,6 +53,11 @@ class CodeSuccessScreen extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.center, children: [ + Icon( + Icons.check, + color: colorScheme.primary500, + size: 96, + ), Text( "${referralView.planInfo.storageInGB} GB", style: textStyle.h2Bold, From 3d96e73ad06a6deb85b959c60f69d80d7a10d8a6 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Thu, 23 Feb 2023 09:57:46 +0530 Subject: [PATCH 40/49] Animate success icon --- lib/ui/growth/code_success_screen.dart | 13 ++++++--- pubspec.lock | 40 ++++++++++++++++++++++++++ pubspec.yaml | 1 + 3 files changed, 50 insertions(+), 4 deletions(-) diff --git a/lib/ui/growth/code_success_screen.dart b/lib/ui/growth/code_success_screen.dart index 9a70f001c..71467e9c0 100644 --- a/lib/ui/growth/code_success_screen.dart +++ b/lib/ui/growth/code_success_screen.dart @@ -11,6 +11,7 @@ import "package:photos/ui/growth/referral_code_widget.dart"; import "package:photos/ui/growth/storage_details_screen.dart"; import "package:photos/utils/navigation_util.dart"; import "package:photos/utils/share_util.dart"; +import "package:spring/spring.dart"; class CodeSuccessScreen extends StatelessWidget { final ReferralView referralView; @@ -53,10 +54,14 @@ class CodeSuccessScreen extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.center, children: [ - Icon( - Icons.check, - color: colorScheme.primary500, - size: 96, + Spring.scale( + start: 0.2, + end: 1.0, + child: Icon( + Icons.check, + color: colorScheme.primary500, + size: 96, + ), ), Text( "${referralView.planInfo.storageInGB} GB", diff --git a/pubspec.lock b/pubspec.lock index 0b23a8530..74c1e751c 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1453,6 +1453,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.3" + simple_animations: + dependency: transitive + description: + name: simple_animations + sha256: "48e065ed7264fa6b3e82450544ecde8ae84ff2aaa00fb39e8a90fc05d608084f" + url: "https://pub.dev" + source: hosted + version: "3.1.1" sky_engine: dependency: transitive description: flutter @@ -1482,6 +1490,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.9.1" + spring: + dependency: "direct main" + description: + name: spring + sha256: "25a433dd5dc47e58cd9bd524a536dd164f9b0d7622a80fcda7622a2bbefddedc" + url: "https://pub.dev" + source: hosted + version: "2.0.2" sprintf: dependency: transitive description: @@ -1554,6 +1570,22 @@ packages: url: "https://pub.dev" source: hosted version: "1.2.0" + supercharged: + dependency: transitive + description: + name: supercharged + sha256: ab49c848b33e28243f5ce82b976736de17d0852b71d0dfbde53fbb5e2ecca7cb + url: "https://pub.dev" + source: hosted + version: "2.1.1" + supercharged_dart: + dependency: transitive + description: + name: supercharged_dart + sha256: cb95edda32eacd27664089700a750120be41daa84aa6cd2aeded46227c16b867 + url: "https://pub.dev" + source: hosted + version: "2.1.1" syncfusion_flutter_core: dependency: "direct main" description: @@ -1683,6 +1715,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.4" + universal_platform: + dependency: transitive + description: + name: universal_platform + sha256: d315be0f6641898b280ffa34e2ddb14f3d12b1a37882557869646e0cc363d0cc + url: "https://pub.dev" + source: hosted + version: "1.0.0+1" url_launcher: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 94eb50b08..55258f1a2 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -102,6 +102,7 @@ dependencies: sentry_flutter: ^6.12.1 share_plus: ^4.0.10 shared_preferences: ^2.0.5 + spring: ^2.0.2 sqflite: ^2.0.0+3 sqflite_migration: ^0.3.0 step_progress_indicator: ^1.0.2 From 8661b4dd4594750665bf3368da8a90c726bfd0cd Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Thu, 23 Feb 2023 10:08:09 +0530 Subject: [PATCH 41/49] Route to code_success screen on code applied --- lib/ui/growth/apply_code_screen.dart | 28 +++++++++++++++++++++++----- lib/ui/growth/referral_screen.dart | 2 +- lib/utils/dialog_util.dart | 5 +++-- 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/lib/ui/growth/apply_code_screen.dart b/lib/ui/growth/apply_code_screen.dart index 751a53f18..f9a3029e4 100644 --- a/lib/ui/growth/apply_code_screen.dart +++ b/lib/ui/growth/apply_code_screen.dart @@ -1,6 +1,8 @@ import "package:flutter/material.dart"; import "package:logging/logging.dart"; import "package:photos/extensions/input_formatter.dart"; +import "package:photos/models/api/storage_bonus/storage_bonus.dart"; +import "package:photos/models/user_details.dart"; import "package:photos/services/storage_bonus_service.dart"; import "package:photos/theme/ente_theme.dart"; import "package:photos/ui/components/button_widget.dart"; @@ -8,10 +10,18 @@ import "package:photos/ui/components/icon_button_widget.dart"; import "package:photos/ui/components/models/button_type.dart"; import "package:photos/ui/components/title_bar_title_widget.dart"; import "package:photos/ui/components/title_bar_widget.dart"; +import "package:photos/ui/growth/code_success_screen.dart"; import "package:photos/utils/dialog_util.dart"; class ApplyCodeScreen extends StatefulWidget { - const ApplyCodeScreen({super.key}); + // referrerView and userDetails used to render code_success_screen + final ReferralView referralView; + final UserDetails userDetails; + const ApplyCodeScreen( + this.referralView, + this.userDetails, { + super.key, + }); @override State createState() => _ApplyCodeScreenState(); @@ -112,14 +122,22 @@ class _ApplyCodeScreenState extends State { await StorageBonusService.instance .getGateway() .claimReferralCode(code.trim().toUpperCase()); - Navigator.of(context).pop(); + + Navigator.of(context).pushReplacement( + MaterialPageRoute( + builder: (context) => CodeSuccessScreen( + widget.referralView, + widget.userDetails, + ), + ), + ); } catch (e) { Logger('$runtimeType') .severe("failed to apply referral", e); showErrorDialogForException( - context: context, - exception: e as Exception, - ); + context: context, + exception: e as Exception, + apiErrorPrefix: "Failed to apply code"); } }, ) diff --git a/lib/ui/growth/referral_screen.dart b/lib/ui/growth/referral_screen.dart index f63a59c7a..dcd994dc5 100644 --- a/lib/ui/growth/referral_screen.dart +++ b/lib/ui/growth/referral_screen.dart @@ -216,7 +216,7 @@ class ReferralWidget extends StatelessWidget { onTap: () async { await routeToPage( context, - const ApplyCodeScreen(), + ApplyCodeScreen(referralView, userDetails), ); notifyParent(); }, diff --git a/lib/utils/dialog_util.dart b/lib/utils/dialog_util.dart index 8ffd9c66a..59c9418f0 100644 --- a/lib/utils/dialog_util.dart +++ b/lib/utils/dialog_util.dart @@ -43,14 +43,15 @@ Future showErrorDialogForException({ required BuildContext context, required Exception exception, bool isDismissible = true, + String apiErrorPrefix = "It looks like something went wrong.", }) async { String errorMessage = "It looks like something went wrong. Please retry after some time. If the error persists, please contact our support team."; if (exception is DioError && exception.response != null && exception.response!.data["code"] != null) { - errorMessage = "It looks like something went wrong. \n\nReason: " + - exception.response!.data["code"]; + errorMessage = + "$apiErrorPrefix\n\nReason: " + exception.response!.data["code"]; } return showDialogWidget( context: context, From c894bf06a3112c4860c3b38f1332284072a323df Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Thu, 23 Feb 2023 10:12:03 +0530 Subject: [PATCH 42/49] Show storage banner until 5 counts --- lib/services/storage_bonus_service.dart | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/lib/services/storage_bonus_service.dart b/lib/services/storage_bonus_service.dart index 6fd4758ed..5894a9af9 100644 --- a/lib/services/storage_bonus_service.dart +++ b/lib/services/storage_bonus_service.dart @@ -6,7 +6,8 @@ class StorageBonusService { late StorageBonusGateway gateway; late SharedPreferences prefs; - final String _showStorageBonus = "showStorageBonus.showBanner"; + final int minTapCountBeforeHidingBanner = 5; + final String _showStorageBonusTapCount = "showStorageBonus.tap_count"; void init(SharedPreferences preferences) { prefs = preferences; @@ -18,12 +19,15 @@ class StorageBonusService { static StorageBonusService instance = StorageBonusService._privateConstructor(); + // returns true if _showStorageBonusTapCount value is less than minTapCountBeforeHidingBanner bool shouldShowStorageBonus() { - return prefs.getBool(_showStorageBonus) ?? true; + final tapCount = prefs.getInt(_showStorageBonusTapCount) ?? 0; + return tapCount <= minTapCountBeforeHidingBanner; } void markStorageBonusAsDone() { - prefs.setBool(_showStorageBonus, false).ignore(); + final tapCount = prefs.getInt(_showStorageBonusTapCount) ?? 0; + prefs.setInt(_showStorageBonusTapCount, tapCount + 1).ignore(); } // getter for gateway From bb57d38a9e39da65416075a4d8e65f7e394b1506 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Thu, 23 Feb 2023 12:12:34 +0530 Subject: [PATCH 43/49] Theme: Add textStyle for muted and faint variants --- lib/theme/text_style.dart | 71 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 68 insertions(+), 3 deletions(-) diff --git a/lib/theme/text_style.dart b/lib/theme/text_style.dart index 234ec3b93..2a87c6f08 100644 --- a/lib/theme/text_style.dart +++ b/lib/theme/text_style.dart @@ -86,6 +86,26 @@ class EnteTextTheme { final TextStyle brandSmall; final TextStyle brandMedium; + // textMuted variants + final TextStyle h1Muted; + final TextStyle h2Muted; + final TextStyle h3Muted; + final TextStyle largeMuted; + final TextStyle bodyMuted; + final TextStyle smallMuted; + final TextStyle miniMuted; + final TextStyle tinyMuted; + + // textFaint variants + final TextStyle h1Faint; + final TextStyle h2Faint; + final TextStyle h3Faint; + final TextStyle largeFaint; + final TextStyle bodyFaint; + final TextStyle smallFaint; + final TextStyle miniFaint; + final TextStyle tinyFaint; + const EnteTextTheme({ required this.h1, required this.h1Bold, @@ -105,13 +125,42 @@ class EnteTextTheme { required this.tinyBold, required this.brandSmall, required this.brandMedium, + required this.h1Muted, + required this.h2Muted, + required this.h3Muted, + required this.largeMuted, + required this.bodyMuted, + required this.smallMuted, + required this.miniMuted, + required this.tinyMuted, + required this.h1Faint, + required this.h2Faint, + required this.h3Faint, + required this.largeFaint, + required this.bodyFaint, + required this.smallFaint, + required this.miniFaint, + required this.tinyFaint, }); } -EnteTextTheme lightTextTheme = _buildEnteTextStyle(textBaseLight); -EnteTextTheme darkTextTheme = _buildEnteTextStyle(textBaseDark); +EnteTextTheme lightTextTheme = _buildEnteTextStyle( + textBaseLight, + textMutedLight, + textFaintLight, +); -EnteTextTheme _buildEnteTextStyle(Color color) { +EnteTextTheme darkTextTheme = _buildEnteTextStyle( + textBaseDark, + textMutedDark, + textFaintDark, +); + +EnteTextTheme _buildEnteTextStyle( + Color color, + Color textMuted, + Color textFaint, +) { return EnteTextTheme( h1: h1.copyWith(color: color), h1Bold: h1.copyWith(color: color, fontWeight: _boldWeight), @@ -131,5 +180,21 @@ EnteTextTheme _buildEnteTextStyle(Color color) { tinyBold: tiny.copyWith(color: color, fontWeight: _boldWeight), brandSmall: brandStyleSmall.copyWith(color: color), brandMedium: brandStyleMedium.copyWith(color: color), + h1Muted: h1.copyWith(color: textMuted), + h2Muted: h2.copyWith(color: textMuted), + h3Muted: h3.copyWith(color: textMuted), + largeMuted: large.copyWith(color: textMuted), + bodyMuted: body.copyWith(color: textMuted), + smallMuted: small.copyWith(color: textMuted), + miniMuted: mini.copyWith(color: textMuted), + tinyMuted: tiny.copyWith(color: textMuted), + h1Faint: h1.copyWith(color: textFaint), + h2Faint: h2.copyWith(color: textFaint), + h3Faint: h3.copyWith(color: textFaint), + largeFaint: large.copyWith(color: textFaint), + bodyFaint: body.copyWith(color: textFaint), + smallFaint: small.copyWith(color: textFaint), + miniFaint: mini.copyWith(color: textFaint), + tinyFaint: tiny.copyWith(color: textFaint), ); } From 5e94d722dfc38674f617d246905b5b6ee449d55b Mon Sep 17 00:00:00 2001 From: ashilkn Date: Thu, 23 Feb 2023 12:43:09 +0530 Subject: [PATCH 44/49] Changes for testing --- .../api/storage_bonus/storage_bonus.dart | 2 +- lib/ui/growth/apply_code_screen.dart | 18 +++++++++++++----- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/lib/models/api/storage_bonus/storage_bonus.dart b/lib/models/api/storage_bonus/storage_bonus.dart index 101b427ee..fd5383f9d 100644 --- a/lib/models/api/storage_bonus/storage_bonus.dart +++ b/lib/models/api/storage_bonus/storage_bonus.dart @@ -18,7 +18,7 @@ class ReferralView { factory ReferralView.fromJson(Map json) => ReferralView( planInfo: PlanInfo.fromJson(json["planInfo"]), code: json["code"], - enableApplyCode: json["enableApplyCode"], + enableApplyCode: !json["enableApplyCode"], isFamilyMember: json["isFamilyMember"], hasAppliedCode: json["hasAppliedCode"], claimedStorage: json["claimedStorage"], diff --git a/lib/ui/growth/apply_code_screen.dart b/lib/ui/growth/apply_code_screen.dart index f9a3029e4..ba3bf9950 100644 --- a/lib/ui/growth/apply_code_screen.dart +++ b/lib/ui/growth/apply_code_screen.dart @@ -11,7 +11,7 @@ import "package:photos/ui/components/models/button_type.dart"; import "package:photos/ui/components/title_bar_title_widget.dart"; import "package:photos/ui/components/title_bar_widget.dart"; import "package:photos/ui/growth/code_success_screen.dart"; -import "package:photos/utils/dialog_util.dart"; +// import "package:photos/utils/dialog_util.dart"; class ApplyCodeScreen extends StatefulWidget { // referrerView and userDetails used to render code_success_screen @@ -132,12 +132,20 @@ class _ApplyCodeScreenState extends State { ), ); } catch (e) { + Navigator.of(context).pushReplacement( + MaterialPageRoute( + builder: (context) => CodeSuccessScreen( + widget.referralView, + widget.userDetails, + ), + ), + ); Logger('$runtimeType') .severe("failed to apply referral", e); - showErrorDialogForException( - context: context, - exception: e as Exception, - apiErrorPrefix: "Failed to apply code"); + // showErrorDialogForException( + // context: context, + // exception: e as Exception, + // apiErrorPrefix: "Failed to apply code"); } }, ) From 451507f4b6df84c5393e56f6b137f05c687c5a91 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Thu, 23 Feb 2023 13:04:24 +0530 Subject: [PATCH 45/49] Removed spring package and use flutter_animate for animation --- lib/ui/growth/code_success_screen.dart | 28 +++++++++++------- pubspec.lock | 40 -------------------------- pubspec.yaml | 1 - 3 files changed, 18 insertions(+), 51 deletions(-) diff --git a/lib/ui/growth/code_success_screen.dart b/lib/ui/growth/code_success_screen.dart index 71467e9c0..52b93daac 100644 --- a/lib/ui/growth/code_success_screen.dart +++ b/lib/ui/growth/code_success_screen.dart @@ -1,4 +1,5 @@ import "package:flutter/material.dart"; +import "package:flutter_animate/flutter_animate.dart"; import "package:photos/models/api/storage_bonus/storage_bonus.dart"; import "package:photos/models/user_details.dart"; import "package:photos/theme/ente_theme.dart"; @@ -11,7 +12,6 @@ import "package:photos/ui/growth/referral_code_widget.dart"; import "package:photos/ui/growth/storage_details_screen.dart"; import "package:photos/utils/navigation_util.dart"; import "package:photos/utils/share_util.dart"; -import "package:spring/spring.dart"; class CodeSuccessScreen extends StatelessWidget { final ReferralView referralView; @@ -54,15 +54,23 @@ class CodeSuccessScreen extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.center, children: [ - Spring.scale( - start: 0.2, - end: 1.0, - child: Icon( - Icons.check, - color: colorScheme.primary500, - size: 96, - ), - ), + Icon( + Icons.check, + color: colorScheme.primary500, + size: 96, + ) + .animate() + .scaleXY( + begin: 0.5, + end: 1, + duration: 750.ms, + curve: Curves.easeInOutCubic, + delay: 250.ms, + ) + .fadeIn( + duration: 500.ms, + curve: Curves.easeInOutCubic, + ), Text( "${referralView.planInfo.storageInGB} GB", style: textStyle.h2Bold, diff --git a/pubspec.lock b/pubspec.lock index 74c1e751c..0b23a8530 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1453,14 +1453,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.3" - simple_animations: - dependency: transitive - description: - name: simple_animations - sha256: "48e065ed7264fa6b3e82450544ecde8ae84ff2aaa00fb39e8a90fc05d608084f" - url: "https://pub.dev" - source: hosted - version: "3.1.1" sky_engine: dependency: transitive description: flutter @@ -1490,14 +1482,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.9.1" - spring: - dependency: "direct main" - description: - name: spring - sha256: "25a433dd5dc47e58cd9bd524a536dd164f9b0d7622a80fcda7622a2bbefddedc" - url: "https://pub.dev" - source: hosted - version: "2.0.2" sprintf: dependency: transitive description: @@ -1570,22 +1554,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.2.0" - supercharged: - dependency: transitive - description: - name: supercharged - sha256: ab49c848b33e28243f5ce82b976736de17d0852b71d0dfbde53fbb5e2ecca7cb - url: "https://pub.dev" - source: hosted - version: "2.1.1" - supercharged_dart: - dependency: transitive - description: - name: supercharged_dart - sha256: cb95edda32eacd27664089700a750120be41daa84aa6cd2aeded46227c16b867 - url: "https://pub.dev" - source: hosted - version: "2.1.1" syncfusion_flutter_core: dependency: "direct main" description: @@ -1715,14 +1683,6 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.4" - universal_platform: - dependency: transitive - description: - name: universal_platform - sha256: d315be0f6641898b280ffa34e2ddb14f3d12b1a37882557869646e0cc363d0cc - url: "https://pub.dev" - source: hosted - version: "1.0.0+1" url_launcher: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 55258f1a2..94eb50b08 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -102,7 +102,6 @@ dependencies: sentry_flutter: ^6.12.1 share_plus: ^4.0.10 shared_preferences: ^2.0.5 - spring: ^2.0.2 sqflite: ^2.0.0+3 sqflite_migration: ^0.3.0 step_progress_indicator: ^1.0.2 From 047b4db91a1b4cddc7f2de3604afc0dd36eb883b Mon Sep 17 00:00:00 2001 From: ashilkn Date: Thu, 23 Feb 2023 13:04:46 +0530 Subject: [PATCH 46/49] Revert "Changes for testing" This reverts commit 5e94d722dfc38674f617d246905b5b6ee449d55b. --- .../api/storage_bonus/storage_bonus.dart | 2 +- lib/ui/growth/apply_code_screen.dart | 18 +++++------------- 2 files changed, 6 insertions(+), 14 deletions(-) diff --git a/lib/models/api/storage_bonus/storage_bonus.dart b/lib/models/api/storage_bonus/storage_bonus.dart index fd5383f9d..101b427ee 100644 --- a/lib/models/api/storage_bonus/storage_bonus.dart +++ b/lib/models/api/storage_bonus/storage_bonus.dart @@ -18,7 +18,7 @@ class ReferralView { factory ReferralView.fromJson(Map json) => ReferralView( planInfo: PlanInfo.fromJson(json["planInfo"]), code: json["code"], - enableApplyCode: !json["enableApplyCode"], + enableApplyCode: json["enableApplyCode"], isFamilyMember: json["isFamilyMember"], hasAppliedCode: json["hasAppliedCode"], claimedStorage: json["claimedStorage"], diff --git a/lib/ui/growth/apply_code_screen.dart b/lib/ui/growth/apply_code_screen.dart index ba3bf9950..f9a3029e4 100644 --- a/lib/ui/growth/apply_code_screen.dart +++ b/lib/ui/growth/apply_code_screen.dart @@ -11,7 +11,7 @@ import "package:photos/ui/components/models/button_type.dart"; import "package:photos/ui/components/title_bar_title_widget.dart"; import "package:photos/ui/components/title_bar_widget.dart"; import "package:photos/ui/growth/code_success_screen.dart"; -// import "package:photos/utils/dialog_util.dart"; +import "package:photos/utils/dialog_util.dart"; class ApplyCodeScreen extends StatefulWidget { // referrerView and userDetails used to render code_success_screen @@ -132,20 +132,12 @@ class _ApplyCodeScreenState extends State { ), ); } catch (e) { - Navigator.of(context).pushReplacement( - MaterialPageRoute( - builder: (context) => CodeSuccessScreen( - widget.referralView, - widget.userDetails, - ), - ), - ); Logger('$runtimeType') .severe("failed to apply referral", e); - // showErrorDialogForException( - // context: context, - // exception: e as Exception, - // apiErrorPrefix: "Failed to apply code"); + showErrorDialogForException( + context: context, + exception: e as Exception, + apiErrorPrefix: "Failed to apply code"); } }, ) From 399952d4bff47b88e52b0cd7c40e1120bb30327d Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Thu, 23 Feb 2023 13:06:21 +0530 Subject: [PATCH 47/49] rename --- lib/ui/components/album_horizontal_list_widget.dart | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/ui/components/album_horizontal_list_widget.dart b/lib/ui/components/album_horizontal_list_widget.dart index ac3782787..cbb55d499 100644 --- a/lib/ui/components/album_horizontal_list_widget.dart +++ b/lib/ui/components/album_horizontal_list_widget.dart @@ -10,10 +10,10 @@ import "package:photos/ui/common/loading_widget.dart"; import "package:photos/ui/components/divider_widget.dart"; class AlbumHorizontalListWidget extends StatefulWidget { - final Future> Function() future; + final Future> Function() collectionsFuture; const AlbumHorizontalListWidget( - this.future, { + this.collectionsFuture, { Key? key, }) : super(key: key); @@ -47,7 +47,7 @@ class _AlbumHorizontalListWidgetState extends State { Widget build(BuildContext context) { debugPrint('$runtimeType widget build'); return FutureBuilder>( - future: widget.future(), + future: widget.collectionsFuture(), builder: (context, snapshot) { if (snapshot.hasError) { _logger.severe("failed to fetch albums", snapshot.error); From 040b0fa3f1934177572661c1fbff3e5532ddc3e5 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Thu, 23 Feb 2023 13:23:41 +0530 Subject: [PATCH 48/49] Exclude hidden files from archive count --- lib/db/files_db.dart | 8 ++++++-- .../collections/archived_collections_button_widget.dart | 6 +++++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/lib/db/files_db.dart b/lib/db/files_db.dart index 1b5d1117a..67f09df9e 100644 --- a/lib/db/files_db.dart +++ b/lib/db/files_db.dart @@ -1091,13 +1091,17 @@ class FilesDB { return count ?? 0; } - Future fileCountWithVisibility(int visibility, int ownerID) async { + Future archivedFilesCount( + int visibility, + int ownerID, + Set hiddenCollections, + ) async { final db = await instance.database; final count = Sqflite.firstIntValue( await db.rawQuery( 'SELECT COUNT(distinct($columnUploadedFileID)) FROM $filesTable where ' '$columnMMdVisibility' - ' = $visibility AND $columnOwnerID = $ownerID', + ' = $visibility AND $columnOwnerID = $ownerID AND $columnCollectionID NOT IN (${hiddenCollections.join(', ')})', ), ); return count ?? 0; diff --git a/lib/ui/collections/archived_collections_button_widget.dart b/lib/ui/collections/archived_collections_button_widget.dart index f500e5c9b..e5e092965 100644 --- a/lib/ui/collections/archived_collections_button_widget.dart +++ b/lib/ui/collections/archived_collections_button_widget.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:photos/core/configuration.dart'; import 'package:photos/db/files_db.dart'; import 'package:photos/models/magic_metadata.dart'; +import "package:photos/services/collections_service.dart"; import 'package:photos/ui/viewer/gallery/archive_page.dart'; import 'package:photos/utils/navigation_util.dart'; @@ -15,6 +16,8 @@ class ArchivedCollectionsButtonWidget extends StatelessWidget { @override Widget build(BuildContext context) { + final Set hiddenCollectionId = + CollectionsService.instance.getHiddenCollections(); return OutlinedButton( style: OutlinedButton.styleFrom( backgroundColor: Theme.of(context).backgroundColor, @@ -43,9 +46,10 @@ class ArchivedCollectionsButtonWidget extends StatelessWidget { ), const Padding(padding: EdgeInsets.all(6)), FutureBuilder( - future: FilesDB.instance.fileCountWithVisibility( + future: FilesDB.instance.archivedFilesCount( visibilityArchive, Configuration.instance.getUserID()!, + hiddenCollectionId, ), builder: (context, snapshot) { if (snapshot.hasData && snapshot.data! > 0) { From 435db317ccf6c8588c97c4ec9e00f31437780e14 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Thu, 23 Feb 2023 13:32:13 +0530 Subject: [PATCH 49/49] Changed header height of archive page --- lib/ui/components/album_horizontal_list_widget.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ui/components/album_horizontal_list_widget.dart b/lib/ui/components/album_horizontal_list_widget.dart index ac3782787..a575186d5 100644 --- a/lib/ui/components/album_horizontal_list_widget.dart +++ b/lib/ui/components/album_horizontal_list_widget.dart @@ -61,7 +61,7 @@ class _AlbumHorizontalListWidgetState extends State { return Align( alignment: Alignment.centerLeft, child: SizedBox( - height: 180, + height: 190, child: Column( children: [ Expanded(