From 2da9eb374aeb1a3af54f9884a9cde32d886aa1e5 Mon Sep 17 00:00:00 2001 From: Debojyoti Mishra <105543436+DebojyotiMishra@users.noreply.github.com> Date: Thu, 27 Mar 2025 22:30:37 +0100 Subject: [PATCH 01/83] ci(github): add GitHub Actions workflow and PR template --- .github/pull_request_template.md | 27 +++++++++++++++++++++++++++ .github/workflows/android.yml | 30 ++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) create mode 100644 .github/pull_request_template.md create mode 100644 .github/workflows/android.yml diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000..27cf69a --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,27 @@ +# Pull Request + +## Description + + +## Related Issues + + +## Type of Change +- [ ] Bug fix (non-breaking change that fixes an issue) +- [ ] New feature (non-breaking change that adds functionality) +- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected) +- [ ] This change requires a documentation update + +## How Has This Been Tested? + +- [ ] Unit tests +- [ ] Integration tests +- [ ] Manual testing + +## Checklist: +- [ ] My code follows the project's coding style +- [ ] I have commented my code, particularly in hard-to-understand areas +- [ ] I have made corresponding changes to the documentation +- [ ] My changes generate no new warnings +- [ ] I have added tests that prove my fix is effective or that my feature works +- [ ] New and existing unit tests pass locally with my changes \ No newline at end of file diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml new file mode 100644 index 0000000..c842498 --- /dev/null +++ b/.github/workflows/android.yml @@ -0,0 +1,30 @@ +name: Android CI + +on: + push: + branches: [ main, develop, production ] + pull_request: + branches: [ main, develop, production ] + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + + - name: Set up JDK 17 + uses: actions/setup-java@v3 + with: + java-version: '17' + distribution: 'temurin' + cache: gradle + + - name: Grant execute permission for gradlew + run: chmod +x gradlew + + - name: Build with Gradle + run: ./gradlew build + + - name: Run Tests + run: ./gradlew test \ No newline at end of file From b200ddba00218fc105bdc7e96af00d45f22a56e3 Mon Sep 17 00:00:00 2001 From: Debojyoti Mishra <105543436+DebojyotiMishra@users.noreply.github.com> Date: Thu, 27 Mar 2025 22:40:47 +0100 Subject: [PATCH 02/83] docs(readme): add development instructions --- README.md | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 4401384..42d8112 100644 --- a/README.md +++ b/README.md @@ -76,7 +76,44 @@ When the develop branch is stable and ready for release: ## Development Setup -[Add your development setup instructions here] +### Requirements + +- Android Studio Iguana (2023.2.1) or newer +- JDK 17 or higher +- Android SDK with minimum API level 26 (Android 8.0 Oreo) +- Git + +### Getting Started + +1. Clone the repository: + ```bash + git clone https://github.com/arcreane/android-project-pineapple.git + cd android-project-pineapple + ``` + +2. Set up the git hooks: + ```bash + ./scripts/setup-hooks.sh + ``` + +3. Open the project in Android Studio: + - Launch Android Studio + - Select "Open an existing project" + - Navigate to the cloned repository and click "Open" + +4. Sync the project with Gradle files: + - Android Studio should automatically sync + - If not, select "File > Sync Project with Gradle Files" + +5. Run the app: + - Connect an Android device or use an emulator + - Click the "Run" button (green triangle) in Android Studio + +### Troubleshooting + +- If you encounter Gradle sync issues, ensure you have the correct JDK version +- For build errors, check the "Build" tab in Android Studio for specific error messages +- If GitHub Actions CI builds fail but local builds succeed, check Java version compatibility ## UML Diagram ![UML Diagram](UML.svg) \ No newline at end of file From a0ecb1f9acce84b51ed35230846751ad3a644fef Mon Sep 17 00:00:00 2001 From: Debojyoti Mishra <105543436+DebojyotiMishra@users.noreply.github.com> Date: Thu, 27 Mar 2025 22:52:50 +0100 Subject: [PATCH 03/83] docs(readme): add contributing guide for new team members --- README.md | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git a/README.md b/README.md index 42d8112..1c77935 100644 --- a/README.md +++ b/README.md @@ -115,5 +115,86 @@ When the develop branch is stable and ready for release: - For build errors, check the "Build" tab in Android Studio for specific error messages - If GitHub Actions CI builds fail but local builds succeed, check Java version compatibility +## Contributing + +### First-Time Setup + +1. Fork the repository on GitHub: + - Visit the repository page on GitHub + - Click the "Fork" button in the top-right corner + - Select your account as the destination + +2. Clone your forked repository: + ```bash + git clone https://github.com/YOUR_USERNAME/android-project-pineapple.git + cd android-project-pineapple + ``` + +3. Add the original repository as upstream: + ```bash + git remote add upstream https://github.com/arcreane/android-project-pineapple.git + ``` + +### Making Contributions + +1. Sync your local develop branch: + ```bash + git checkout develop + git pull upstream develop + git push origin develop + ``` + +2. Create a new feature branch: + ```bash + git checkout -b feature/your-feature-name develop + ``` + Branch naming convention: + - `feature/*` for new features + - `bugfix/*` for bug fixes + - `docs/*` for documentation changes + - `hotfix/*` for urgent production fixes + +3. Make your changes: + - Write clear, concise commit messages following our convention: + ```bash + git commit -m "type(scope): description" + ``` + - Types: feat, fix, docs, style, refactor, test, chore + - Example: `git commit -m "feat(login): add biometric authentication"` + +4. Push your changes: + ```bash + git push -u origin feature/your-feature-name + ``` + +5. Create a Pull Request: + - Go to the original repository on GitHub + - Click "Pull Requests" > "New Pull Request" + - Select `develop` as the base branch + - Write a clear PR description explaining your changes + - Link any related issues + +6. Address review feedback: + - Make requested changes in your feature branch + - Commit and push updates + - The PR will update automatically + +7. After PR is merged: + ```bash + git checkout develop + git pull upstream develop + git push origin develop + git branch -d feature/your-feature-name + ``` + +### Best Practices + +- Keep PRs focused and reasonably sized +- Update your feature branch regularly with develop +- Write meaningful commit messages +- Add tests for new features +- Update documentation as needed +- Ensure CI checks pass before requesting review + ## UML Diagram ![UML Diagram](UML.svg) \ No newline at end of file From 502c36218870ed5362165b73a3c3ce0bcf9c67dd Mon Sep 17 00:00:00 2001 From: Debojyoti Mishra <105543436+DebojyotiMishra@users.noreply.github.com> Date: Mon, 31 Mar 2025 12:06:03 +0200 Subject: [PATCH 04/83] feat(core): initialize Android project with MVVM and Firebase --- .DS_Store | Bin 0 -> 6148 bytes .gradle/8.10.2/checksums/checksums.lock | Bin 0 -> 17 bytes .gradle/8.10.2/checksums/md5-checksums.bin | Bin 0 -> 23097 bytes .gradle/8.10.2/checksums/sha1-checksums.bin | Bin 0 -> 28055 bytes ...rariesForLibs$AndroidPluginAccessors.class | Bin 0 -> 920 bytes ...ibs$AndroidxEspressoLibraryAccessors.class | Bin 0 -> 932 bytes ...riesForLibs$AndroidxLibraryAccessors.class | Bin 0 -> 1702 bytes .../dm/LibrariesForLibs$BundleAccessors.class | Bin 0 -> 765 bytes .../dm/LibrariesForLibs$PluginAccessors.class | Bin 0 -> 1118 bytes .../LibrariesForLibs$VersionAccessors.class | Bin 0 -> 1449 bytes .../accessors/dm/LibrariesForLibs.class | Bin 0 -> 3662 bytes ...nPluginsBlock$AndroidPluginAccessors.class | Bin 0 -> 962 bytes ...ock$AndroidxEspressoLibraryAccessors.class | Bin 0 -> 2232 bytes ...luginsBlock$AndroidxLibraryAccessors.class | Bin 0 -> 3248 bytes ...orLibsInPluginsBlock$BundleAccessors.class | Bin 0 -> 891 bytes ...orLibsInPluginsBlock$PluginAccessors.class | Bin 0 -> 1202 bytes ...rLibsInPluginsBlock$VersionAccessors.class | Bin 0 -> 1491 bytes .../dm/LibrariesForLibsInPluginsBlock.class | Bin 0 -> 5251 bytes .../metadata.bin | 1 + .../gradle/accessors/dm/LibrariesForLibs.java | 273 +++++++++++++++ .../dm/LibrariesForLibsInPluginsBlock.java | 325 ++++++++++++++++++ .../dependencies-accessors/gc.properties | 0 .../executionHistory/executionHistory.lock | Bin 0 -> 17 bytes .gradle/8.10.2/fileChanges/last-build.bin | Bin 0 -> 1 bytes .gradle/8.10.2/fileHashes/fileHashes.bin | Bin 0 -> 20247 bytes .gradle/8.10.2/fileHashes/fileHashes.lock | Bin 0 -> 17 bytes .gradle/8.10.2/gc.properties | 0 .../buildOutputCleanup.lock | Bin 0 -> 17 bytes .gradle/buildOutputCleanup/cache.properties | 2 + .gradle/file-system.probe | Bin 0 -> 8 bytes .gradle/vcs-1/gc.properties | 0 app/build.gradle | 10 + .../pineapple/capture/auth/AuthActivity.java | 99 ++++++ .../pineapple/capture/auth/AuthViewModel.java | 97 ++++++ .../com/pineapple/capture/feed/FeedItem.java | 42 +++ .../capture/feed/MainFeedActivity.java | 29 ++ .../capture/feed/MainFeedViewModel.java | 44 +++ .../com/pineapple/capture/friends/Friend.java | 31 ++ .../capture/friends/FriendsActivity.java | 29 ++ .../capture/friends/FriendsViewModel.java | 68 ++++ .../capture/profile/ProfileActivity.java | 36 ++ .../capture/profile/ProfileViewModel.java | 49 +++ .../capture/profile/UserProfile.java | 25 ++ app/src/main/res/layout/activity_auth.xml | 66 ++++ build.gradle | 1 + 45 files changed, 1227 insertions(+) create mode 100644 .DS_Store create mode 100644 .gradle/8.10.2/checksums/checksums.lock create mode 100644 .gradle/8.10.2/checksums/md5-checksums.bin create mode 100644 .gradle/8.10.2/checksums/sha1-checksums.bin create mode 100644 .gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/classes/org/gradle/accessors/dm/LibrariesForLibs$AndroidPluginAccessors.class create mode 100644 .gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/classes/org/gradle/accessors/dm/LibrariesForLibs$AndroidxEspressoLibraryAccessors.class create mode 100644 .gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/classes/org/gradle/accessors/dm/LibrariesForLibs$AndroidxLibraryAccessors.class create mode 100644 .gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/classes/org/gradle/accessors/dm/LibrariesForLibs$BundleAccessors.class create mode 100644 .gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/classes/org/gradle/accessors/dm/LibrariesForLibs$PluginAccessors.class create mode 100644 .gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/classes/org/gradle/accessors/dm/LibrariesForLibs$VersionAccessors.class create mode 100644 .gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/classes/org/gradle/accessors/dm/LibrariesForLibs.class create mode 100644 .gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/classes/org/gradle/accessors/dm/LibrariesForLibsInPluginsBlock$AndroidPluginAccessors.class create mode 100644 .gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/classes/org/gradle/accessors/dm/LibrariesForLibsInPluginsBlock$AndroidxEspressoLibraryAccessors.class create mode 100644 .gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/classes/org/gradle/accessors/dm/LibrariesForLibsInPluginsBlock$AndroidxLibraryAccessors.class create mode 100644 .gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/classes/org/gradle/accessors/dm/LibrariesForLibsInPluginsBlock$BundleAccessors.class create mode 100644 .gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/classes/org/gradle/accessors/dm/LibrariesForLibsInPluginsBlock$PluginAccessors.class create mode 100644 .gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/classes/org/gradle/accessors/dm/LibrariesForLibsInPluginsBlock$VersionAccessors.class create mode 100644 .gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/classes/org/gradle/accessors/dm/LibrariesForLibsInPluginsBlock.class create mode 100644 .gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/metadata.bin create mode 100644 .gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/sources/org/gradle/accessors/dm/LibrariesForLibs.java create mode 100644 .gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/sources/org/gradle/accessors/dm/LibrariesForLibsInPluginsBlock.java create mode 100644 .gradle/8.10.2/dependencies-accessors/gc.properties create mode 100644 .gradle/8.10.2/executionHistory/executionHistory.lock create mode 100644 .gradle/8.10.2/fileChanges/last-build.bin create mode 100644 .gradle/8.10.2/fileHashes/fileHashes.bin create mode 100644 .gradle/8.10.2/fileHashes/fileHashes.lock create mode 100644 .gradle/8.10.2/gc.properties create mode 100644 .gradle/buildOutputCleanup/buildOutputCleanup.lock create mode 100644 .gradle/buildOutputCleanup/cache.properties create mode 100644 .gradle/file-system.probe create mode 100644 .gradle/vcs-1/gc.properties create mode 100644 app/src/main/java/com/pineapple/capture/auth/AuthActivity.java create mode 100644 app/src/main/java/com/pineapple/capture/auth/AuthViewModel.java create mode 100644 app/src/main/java/com/pineapple/capture/feed/FeedItem.java create mode 100644 app/src/main/java/com/pineapple/capture/feed/MainFeedActivity.java create mode 100644 app/src/main/java/com/pineapple/capture/feed/MainFeedViewModel.java create mode 100644 app/src/main/java/com/pineapple/capture/friends/Friend.java create mode 100644 app/src/main/java/com/pineapple/capture/friends/FriendsActivity.java create mode 100644 app/src/main/java/com/pineapple/capture/friends/FriendsViewModel.java create mode 100644 app/src/main/java/com/pineapple/capture/profile/ProfileActivity.java create mode 100644 app/src/main/java/com/pineapple/capture/profile/ProfileViewModel.java create mode 100644 app/src/main/java/com/pineapple/capture/profile/UserProfile.java create mode 100644 app/src/main/res/layout/activity_auth.xml diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 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 A2LJ#7 literal 0 HcmV?d00001 diff --git a/.gradle/8.10.2/checksums/sha1-checksums.bin b/.gradle/8.10.2/checksums/sha1-checksums.bin new file mode 100644 index 0000000000000000000000000000000000000000..681e6befffb8801436a93b89757272c0a6d4ff90 GIT binary patch literal 28055 zcmeI3cTf~dyT%ukw4h`WQ89raNDxVaA`&F$oHGar7*JHq5(E{MU?M1>A|gRVB#9z; z6i_gbwO!@7_1pL9XZoE^GtBBzDD(NIVWIp} zg#Y=-{KU)vGXu;FFf+i+05b#33@|gm%m6b3%nUFyz{~(M1I!FCGr-IMGXu;FFf+i+ z05b#sUov2eHG~QpGhdb!|G>MOLQ&wsJ`^1i8xC3%-q!%W4jMv#KR6`KzD|loKMrtj zZh}Am8ZKOWgAH)ESBM|cf5)|u!Y%^1-D-k|?yA$D7<>e{p*iA5OK#fPD|AG{dK3|l z6*G+hu9=TfuxQ7Vhm*pm3H^04O4!CIy;#mqs>pri(*8#Xg z3F247qSx##m<|Tq{yM=6f})z*Z`cFwmPYWR=*jP0g&P3(bVmG|ho7)hq9Mvp1L8Sp zC2tCnm!1Xj{zSWSCXOEapx0jweKk;g?)Vpb*>~&;fcsP+p2zd$L|$Z17T`ut3BHgo zq3rpp_kagfA%06t{qkb>enY^wdj7-R+V^*~8w2iWk9huy<^*TGz z68oKi8x!NAFspE|HS@zYznWGEgoW& zbijl35U=Y9H69C4=mgyH5#o=hINl70YZd`+vmfy%xxvSOUNeE$*Q*8b`rZf&v2&Xr zfOsQU#2ZwDQa`>ZuK?V#8u4eb-xr4|ZE6JEO9}BN-9*l{h9Xx1_f15+Im{PhoSc%7SD5Buj9VjOi|+qGZ&;P`V8Z^4V=y9&=JC(24q z0`74X@i$)=4hcq|sE7O$;@xJonU^aCod6HaLi|rr?qsnLH$K1}4kF$YJIj3hm?o^p zTov)&zVF47SvQkFy!lqd`-Hq+mAnlP1Kgqr@qS0PquY}9zXRM_o#2%%HJt`$a{+h0 zf%u?CLy+cNg=oO7&Jlc=RfxYmUaIYRogAst6661@jvaVY=`4SwDb{9}QRi{Be zc%l~0C$_eTbFY__!UZ-sG z>V5iZzzv9aQNC`O4qyI-fLjcqc+pgrdDKkK5x_kq5MOYSmAz0X_iw;$HY2{cX~&wO z0f#GqyVfDT#Qf79lV5+z18zMF@uj&NqjD{&cLCojgZQ$0ckei?6HW!(hnR<#O?w9Y z%-}=wb{~pgo;rBKb$?MAhz}&@ljR==M@Cgj;CgCFjNcVXnM&6>oMHbo9Ygi3WD8ud zCBj1o)MKz4aVbX$XZb~o6k+`=h)Z*qy9KQ1h5HJx41zCo61rEmXaK|;D-%51>VRWv z=uyC(zxt8)0!WjOTQPX^#SodQRs^eDSgGBbEW+N z_apMA6&|+q2UQ8qht3=*e&bWbwqr#keko#i1iBq zcM(S1U^|CUh*UPL$MYA#_m@rNN(R)ydX^JBjpwKHws%H=n_41nJRaBc(#s6a{|=*w zn`&>h?beTh`)BK`h@0i<`G=~oup{rWd4T%` zp?Iq{QI|WqYvJ|X;*Pk@2jSlG%O!AqG!#YLHc2OQ_pvLdKs^?Eh}-M5UbJp}4cA%s zUc_AzmQM0?mcwyjD~`D9^uyqL(Y;xq9&=(`xbxOK#ES*10q*(}#d~PqT*Z6lnK$4z z#RT^ZpRG795CynfMdne}{nhEy<{!Fu^L;ilSyXUl|kg zd6?Gw4o&`e2N3W12N9o^8e+Oj!WVGY1jM(UU0K%M_DL3S=kAbtxme)p#ADgC3*@d4nzD117y;JSO#d&+OXEho?y`)!BzxLYj!3vj1P zh@<~06h64;01?b1GXu;FFf+i+05b#33@|gm%m6b3%nUFyz{~(M1I!FCGr-IMGXu;F zFf+i+05b#33@|gm%m6b3%nUFyz{~(M1I!Hk?-@|SzQ$kdk-+~64Z9_UYbD` zm&1g;DGzl!?RIW^)#jbKvBo)T=V%dB!FMjD@OLTcR0GdyUus0RrRs#v`~8yBTFNXs z0efSGCAlMj%My5r;%{xxsmOV${(bwV-G`f7QqFm-de(BjVe6qw*jqyQ_0rb^UOD(% zaCBY^!}S;cz9oKWmD5o!fyMgTJM)6EXqw6ps4^Basye*l98QNyXgo=0k7B!iB-)<8 z5qo0@S6OTWsui67mg+zk3%B!*zq1d9M;@t&Ul6dYF@|25(CZMR*Dcf9Qr#CV(u+c)UdP8ZeN_4z^N+bZ(fEU(R! zPY3=CXERJ&vJUon3;3R&YYU@_oYyAHr+Y%8I=h>1)XPk8Wd7|=8OMGDLAzei%g}() zi`*HK^P0_n`AUn5XJeAurEDAXyMOO0ti1!z@G;1t0sgiyT@J~qHnpakO8=I-*4Y=Q zxBtaC%kuj=*qfnvHY~Amh8IVC9i#Iir~2mX{aab7J)2AZRF`P`!yov6#d8Fe1xgrurp)`6YVb1nieD^}1hA$-KpT`zJfANA(*QDa@De&f%!4qIf895}fS zdvh7TURGkj%lS2<7dh3)`awgU$j!H6O9oyX_*~r~wsH{rH3rQKUsA{?iN-0+1g?ddGf*-w)doYDbuVdBKS6x&WoIC-Pv&EkXiQ^nkoec7f+e9 zZP9)|1ik!$mzyo47dh2PxXVDDubg1s#m-!o?>>pI#K*AlL~GX`;5B!K>lM1HW5p@8 zIcuI}K2T||l8YE#t_*kPR!~LFWjw?GrkBES%(tkRnz#)&Kh{u6+F$ZIsbRn5ptb8P zXcw<0;~A1u?e=}}NJKLB;cV|iqmgVM3Rh}U9zri{oZ)5hPV7L}H^`~JWju^g*HiXw zYdtj`>!;)ND^au?dcpZnn9AryPL(pdV7S&|ZQYsVs+~`xE1&x8G30<=_wiOyD8^Vj z>Dxt472@tF-m)TXzT~;ef;>*E!aUD-5$N@XW<}vR!{|j$Ws+rfy?ucP_ws^stJ%(d z2@6l=#_lj^eFM8U!pp1~?l{P)*l-t6wUSNiEw}V%>&!- z;@PmqdlFV=f58rPXZYXrO7xhWpLukl)A@j!l{*@;VpVPrbHg*7LpwnV`v%4{+-`p- zv}iIoYJL*0V#B2G+IscKxBsbP+s~-_Z+acN;#I)V8kt z<*4&IVlD@Er%P*BDez*SVLl|MGTGz*YVQ$MH%ZZznWNDH8A}XZ6`|Kl;Ken@*e-Ia zw?lEKQ;NCklS+eDj|86mC9|u(0(#-kp|COwzrUpG8#)j9FD6*`E37g~PF%2Q%trDj z&r>>8IipHKSm}brh`}dSN>LHVx*vBGr&*5tr-~ihSJ8X@-#^3PSr;RMzM5W%`xyOH zrIGttPvweA&@LOepJ$(9Y?o5~1McVRzrNieE*Pu#!%QIAyDbH(1h8nVu)AUhy38lN z{Aw2$ux)Pdlu^^;2DR?|Jz?118t;cT*!qkYjv3a6?7kT!FxTMNtzX9 z-V#PHa;o5Z)=^4wfUx*kWvOME1kRw^Pt-Bk=N`;aMd)Rr+AV z%cC_(O-A)kGPCpgc`NMrJD`^f@Z!A9*sg4rn&R%mPp!;GB*YRWEPD>|%NgOS4ui#5 z&%z7eBkVxmqgcmWH)`_oX*iX(2z}3y?R_kR^*?-k*#^=?lsTUmRsI9ix^YkTsJ)`< z`F_S{zto$4E`ch1PlFYqIP5^@MNaj_|IDEA?K~CBL$cAeyMy-XS*gJ%Ft$lFE6TE5 zMlW)z@r<&YkL+Ae&8^>5DH}hm{!{l%By1P{oEIx>zpw*cyU3|Z>VI*`%QpILpH<4H z(ZccMi;I39^ukvltO(DLLvpIqJ6wdDVouzlo``(8{X<&glE$e3=!HMM!iw`x>_FEp za;j6_3yLG{Zm;DIa2+m6i!7QOkjfg=Xq6WOT)FEa&3FLJ6$ZNDB?qs>lV25Y>dl%EIGjs39; zw(BtPnuoQM{(6y9xr?0t-o$(Q9luezO+rB>`+?=Wub>xvQsIK{Wa;__In|4b)#JIc z!_l%D*=Oez*_x~MzO95__hr}lue^}lv`l` zsF~^5k=ZbZaOc3gfYFPbO8>`KFH`<|X~FE&eY`cvmgKNz2dJ89)#LJd!OL@;nl3xN<8&r9zfgR`4{TS0&r$Xg zAcuTWj9wd}Jq2?vOiU@=9lKr|IJ9~>n;iChm!`t@Q+T1qUs1mB{eXs8MYD$6_nmMZ;g zOCfJX1((9U-)j0M0g72Y3*gS&{xtC7m|-s}UHner!v-Uc@qtcreje)%?YHd>@C=^- zmB2LP8S3A=9(9+x(x1yYn%`5y!TvzXYucSuM*zDSRJAjz$az)0b&|A?D_&n|B{j>I z({^vJye;g#_W1oIRya7Y1Kss9D%aW(L5;QPzdUIqE&SL0*7qMZLAxBVoh)A1@p}k5 zmAGH>^^`Qf3K5|t7cU$+5uDnAPoDTyc36RHD3s+JvBSTjia+MJDLQ-q&J#!5<({{% zUb4YR*adpY<4zRHoG$D@=S5C+%D-x^f_mj4`Ju%5bDzI(?8&RPfnItvE6Pmwu;f%r z^A+REy+nc^^yX}BS~XH_7A?aCz3@9jtjzR`h@8sIN=9w)F2|)d-QM1E7oMwi*}0pb z7rp{vg=2=*eBG#KZTB?0)q!fAfc+a%cIEHoUjtRuKsD3TRC226cc;Cktu{&R^L-dn z>lWx+k>mxRiZ}`ZFHU^^pu5W16Tz(Ot&Y8#w5gg5Pj=>D0c0nNt*P#q2Pm)mh7eUqL3n-8VV*2xa7W;rece-D|V&O{HylT zLJ$1`{ZXZ($RS3_Arzs}?C8z#X5Q?dzrTJ1c!L)mw6G9hv5O@v3w*RLm8nxnMpETk zYEzIiDwDA)RAy5dO?}~1T)h8U|2U$YOhP8U7;)6Pi~dPgrrOL-0?P;5=;BZy9*i5s zb7#+WLQbB{oLN%X1m0kAM4wfe6{qC9wq{s!3wKXfup+RjOyaCg_Enx|nu#-{gAVQm z=yuV=s=&K>CUH#OTjynRCdYc}l+)x#*0JyVQC+KUD!PISbYn-VpgJz_b};^;&XvrR zN#&$)+N9xbvyB`5h60O2n~=cTSQ|Pn&!*%)scFWM)s%|px&eXy;7$eG6P+4Wl#Xj0 z-y!8-o@IWioh&`cy0dF}!$W4&=ys}b;MJ{Uu8m?`hc2Y4(H&5!%P zwo0H^6Pm3^fM)`O`Lb8i+@_+y_U$_2CGSOxZvxng>I$%3wtKG*w_CKZ& B4yXVC literal 0 HcmV?d00001 diff --git a/.gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/classes/org/gradle/accessors/dm/LibrariesForLibs$AndroidxEspressoLibraryAccessors.class b/.gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/classes/org/gradle/accessors/dm/LibrariesForLibs$AndroidxEspressoLibraryAccessors.class new file mode 100644 index 0000000000000000000000000000000000000000..5219695510b0d1f7cd0252b955a55be8d5b43506 GIT binary patch literal 932 zcmbtT&2AGh5dIuOwh4jK(w6@MQVwY=#TUdSRi!92Ql%6j1@(+~*Q|^-b~N@@%`>_h(aYQICwlWo^L#!Z~Wuux9&n^yL>WQ|gw#jtBUPsf`sEGe?3e@(EHQ_*D&>sHx z9o?Oi6|4wsDVvfr=~+kn32EgLD_7Uz2^cK7SPZK4uaoJ2o zcqGtX%s!{-GHwN){*7HcM;T{Zie+sAf-m<@=kB?4&fJ;l&tKnu0C(|7}ED$Vfhpp zt}joy2bL+7{_@!17}p82Cov4y2@8(v&=xJX86+@I80k4yGJyrc=!t8;$%RIUmt2!s zj8!a0zGyaTQtgVG&7O2!2E{IOLN<2}QiNpHsyiZRD!$>(IUpNRr9uVPTW%3w-{DSZ z2)o-sJFeNZ<)4-*Y!(QUOtKV_PSD!kkV1m3XC0x#Y=zPLV_mgN3W0C7R z#&eR3K5RR-hS=so$!msxts~w(pU$rwf%4y>y~=+^@(5#JF#f3xT;z2W1HA4ra2Hd& z6K>%)12gPh;GKBa@)J{EarGmc#Bn>3fY->f9m5^=-t7mP>jScSKui5VH~N759#F0y z=w=_#`yS9T@=P+rbmw^wH4Sny#-oZpu$q;&rhB;0`y3}HhE+U>Cwa)N;Ss_)x5ocX F$=^0B-LL=v literal 0 HcmV?d00001 diff --git a/.gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/classes/org/gradle/accessors/dm/LibrariesForLibs$BundleAccessors.class b/.gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/classes/org/gradle/accessors/dm/LibrariesForLibs$BundleAccessors.class new file mode 100644 index 0000000000000000000000000000000000000000..c4caf0bb5478b76f9a0719b435c344001acb20dc GIT binary patch literal 765 zcmbVKO>Yx15Pc45mWGrm>l47Nwk^GQ?ZEFWg68g$=>MhYIfS@39G=-`sB$e?%ZJ3 t>9glAcH6rfpJ6`zLUnbWp@8qoyrZ^-9=6o(sMo?>+*5@N_wfLmKLOUu@N@tG literal 0 HcmV?d00001 diff --git a/.gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/classes/org/gradle/accessors/dm/LibrariesForLibs$PluginAccessors.class b/.gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/classes/org/gradle/accessors/dm/LibrariesForLibs$PluginAccessors.class new file mode 100644 index 0000000000000000000000000000000000000000..17b0402efd8cd25cbe4c1cd5d847001f1af6aa88 GIT binary patch literal 1118 zcmbVLU279T6g`u)U3c9!TH9))QCp*=QQQ|nF`|UjfDp7$Dfl?qoh~EWnJ}{{_FpL| z1qFYAKS=siyxVLf*{ak&%-lOO_nvdV=Ew2Z?*Ja*o`(|34rYAJVvgaBHgOOe9wj2+ z0~tt_3Zr-uggoVmj)QjJriO><%MYW6O)(HE5-L3C(ycZJ^{r$WOO>A(=AKC<)8`Cf zqgMbQ7`-neVS=q($(>q7!&6agid{ZT(j8%})T%Rzt+lb^-~z*oNt!Se)@oyeXfNo= zzTrj++tr42TW_n#Xc>(nZjVh}c(~}m_c4zJh9_r+E8sA=;|wjsMlq@J+o|j`{!2bC zW09&CYPBn4hQ~$sGuFg|gK~zr>|+I28EOL_hE#w*=g!ccA{y7^Kg!o)nCa+9FjRU{ ziPyuuzA$fjKcO2h7HLk*&}mH9LbY+IWTx{{f_k5o-_^*@_rju}Mg>`V7 z(wyw-xdxqKernVm++k=;!u~5EhLyi{pi-D4tWo<)^j#SivmTOGBAxy#?bqn^l=L#m zYV-bsL$KyIIPaRD;nJ!c;>s5+eLC@8rG4SV@`!wYViiY(P{s8er$&;I%`7=Cef;f` h(E!IpdV^#MHQXdwC7=>+QE)De*gEPYJ(73f{sJumP5=M^ literal 0 HcmV?d00001 diff --git a/.gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/classes/org/gradle/accessors/dm/LibrariesForLibs$VersionAccessors.class b/.gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/classes/org/gradle/accessors/dm/LibrariesForLibs$VersionAccessors.class new file mode 100644 index 0000000000000000000000000000000000000000..f351234066a7c7fbf084aa1a0c01508029654a8d GIT binary patch literal 1449 zcmbW0OK%e~5Xb*c+w3L{ZD}cQD31c^gDx*2P^wB%+DJtKRVwP;*_f59jlJ@2D*9PC za|SLTIB?;H#F;Z^z5`-5*;GsFLxmza&I^rT9JQ9Sf~p72lyUcDVBhWp9Z>%qaMh=l40ViOggAk za0*ilPxG05U&OICvDfK(E!j5QND()+Av+$HUmpfBlmjtL#PGP<+UEz{3%Lrs-NZ;0 z)RsoeJ*KPXVuqo_qsZ6Yh$k*)8D@N~(#IrmAwSeT@}6NB_q7o&&N5U)9GSGzM&EOu zVPd~WPwC6TRDMX%cy<|S{3kg zRlF+$#gm>P_Q?s5_2ZATQKMqhv_tI-bF^)YXlHQx-ZaxRSz9^nq>Vh!QtgAozL{xf zn54t!N7~D~x@UaRl&RkN(e|#T&7*?0l@g{A@;DZ;gEfYFen9?f@ENB59eoG)8LIhv zhcjgxJer3LKN>w;ry(xTcM6n1-A9quE3{j{82tced1dtz*atEhuF{$Y0B>krz%@b# z!G*rpS)O%1qV#?w_$_4th2Ef`n>J|L0=>&Yi#F)A1^S$WZrPwY3-m1q-L^sV7U)L~ zx?_XRS)iXesA_{QSfF1yXvqd$vOvF&paPcrkH3Od`k$pX6mSN38agqC={eEU{N4_tRl9wNueQtrUJ!M(faIUGsNL+c5`NT5k83D zL(dU8r=H^n@I!gLlNT@~ka+wf+?|>GzQ4J5`1_wXe*u`oZUUEZIgTz1-H0({d{wlI ziWgjA^Rl$17YgNZ*LHZwUB75&@a))9L>_Xt$SzhLO>B{h6!w-2#!EACB2$h=I?nMuJ<49Pz z0*hh#WKJAM1c9$eN6B83dBv3!!K$z5J7DPcfA)l8$eIah#L#wGQgOUxl=nQ_lNqm| zd|BA9I(3k#Gbhl8ehrpu467H{_d>YT^7FQZcQD8>=5oiO_*t&{h;q=`+w@#)o)n}SvzU}%fMIQC5 zQ{_ooxP!Y4alg_Fs5p~myv=%ruFHK3Ha=vycHAFoy?|lSRMIHXG4pxNMC+fm@G<5X zhMg8IgW+jwGwn5<1g7vnL*ikxF5E0~)8hXP8&iLWiEAz1UP7v15$#Ag5kmR+AiPYw#&Vuy+y;(E2b{)X{7cULr;lRD9K%ht}IPqhO2AR z6B|(}FVsstS{X)OL|!OMVp|4M&sxu`jY_(ngB8>J^x)95+s;)8m8z#G!e`oJy1~sgF4e3XO6YDkKZxTehFquG_g8|l(vL_JHw@$T@LRE9g4)0(`bVG}1Nw1FUjzCb zR-rWCE0j8Bg;HB08V9uy#7OFMTKz)uF`^=Q=kC3cu95B|uw?QO@#LTAdzJhh@grP4 z!~iXa^m3SfH;yoVh}*O^rMG74+eGit@1rApa)^04PM?riIK<*_WQbvn{@x-tfN^qp z82uQ*7`?@2F^Vs60|g3dolaxKyHSyNj?J38V?-J4#ghZsKd|y^eC zur8Xco4AbcDxrSg$kh+D{*ivOl#D(q>udDVyRrwI=oHaB(KJzqXo2Vs(IQca-hTn4 Cm|`*j literal 0 HcmV?d00001 diff --git a/.gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/classes/org/gradle/accessors/dm/LibrariesForLibsInPluginsBlock$AndroidPluginAccessors.class b/.gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/classes/org/gradle/accessors/dm/LibrariesForLibsInPluginsBlock$AndroidPluginAccessors.class new file mode 100644 index 0000000000000000000000000000000000000000..b62b535886f1b8009fa6c3ef9870cfdc7a91c837 GIT binary patch literal 962 zcmbVL-)j>=5dJo;y(XruwpxE%#5|-b-4_ugrEsPO3b7U-!G?&+)K@2IeBnw{Zmv0&ktqWad?BNUB^* zZ42^N8JVa;8JEd;915?J;`OKc$1de$Q?kj)fTPZzbPi0JX*)RyENpA5iyeWaJDe$= zdv~l;^73HfOpAfmVaY#OBXZtm`-sa&V76sOnO}*3UmdbOZnK(mQXyIyv zb{k7r7I-twBuOX)=Yvd-yd8l~_fiF$ zBb`}Ql%8wsUm|6Dnq_{fq$~r;y0de!dppdwHFBj-XrL>GkN-Zpt!f}Vs6A`R_l*jH zLWDa4@w62GwQ&MVHNDCDM7YlqOqV?q>fZ_rtp8bKJmL*%@SOo$QC$|cD}36(96vzx zWSZKBGCkGmdeFuUft@td%NsBiS+BNMT)V+)kn>0qZ_6y6g6Zu~I8{n1OYr za^pSW_M#+|%DSCM`;X=-sNh8h)hb@X%M8~GF&<(Nh@KJThP-){V%}fZVJHkkEuR-l zVvqNwPRQ74tUu&^?nPXM-d1cV*5-5(fs?#%P=Y)ZONopEVe0w0M`tw0ah_puQ$_o3 zVnv>B21K4?2E<7K)bNUfi&eae35MqyB17e|jQ3hWU;2V!^Z8=Zte}S1sbU^mBm zcX$iC8Ph7bg0~#FRlJRN7`{CP(f&q-V`5^MOu^pnrDZHu6B&pt;isf!xY}5I79Ecm zy4iV1Ynu-03}2ryH0>u{q2jDwDwx81Ra`}b!BITiwrRzTHqt_#pjhnJJum*YHq^Ik>drxNFQv6zZw;NV41FIg z-#-u!azX0k8^L3u=8co6nTlf1=suxpygS2AlcBV%1KNLXomlZr((MRyk9Q)nIH8D_ zDHn$NUm19ur%KK<5ipduWT<$Yr2D`75BnF2b(@~RO)MXfGFxwh1h~tiT(~!MkVJyc z8p?O`CS`HyZlYr1_KviYqHigs5AKgJnkX>mC`8&+*&?O$MO&unPW}5`%%xOgsIDm` z%yPu771jYg3$5ba{;!9J;o`HN9tSOk`GWV;2`Fr_mJ}r}nX#Yd?bhKs|;J(=oLGneY+)11M!{7crVy z>ow;mlxyb(xbPIU0VdCn*WMW5@>5I=@a{})dVp)+A9_mvJOIDqGJeA+)B|qNcLbl} zGiuXw=BX{=^UT^Dt|`tf(98_QJc2K9t5hZ-U&Ip16#F8Ushy(sHnp=@!79ps0y}la AfdBvi literal 0 HcmV?d00001 diff --git a/.gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/classes/org/gradle/accessors/dm/LibrariesForLibsInPluginsBlock$AndroidxLibraryAccessors.class b/.gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/classes/org/gradle/accessors/dm/LibrariesForLibsInPluginsBlock$AndroidxLibraryAccessors.class new file mode 100644 index 0000000000000000000000000000000000000000..d42a79f30a1e02d6786223983c9d27048caeb610 GIT binary patch literal 3248 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 literal 0 HcmV?d00001 diff --git a/.gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/classes/org/gradle/accessors/dm/LibrariesForLibsInPluginsBlock.class b/.gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/classes/org/gradle/accessors/dm/LibrariesForLibsInPluginsBlock.class new file mode 100644 index 0000000000000000000000000000000000000000..11a86ad22ea3f6d692b4ecf656067375c3bd6251 GIT binary patch literal 5251 zcmb_g`BxKH6#kw9fjCx8D@xs>(u%00TI=VIZ>kL%6fOyL|V1_uj|9|NZq3faCZzj&)ccL!E|tGzfIr zPCk`)^qeVEdeKN3mM0xcH&a>N(@i^{>dLsDqi4MfQ^AY#vM8;bw6fE^d}=$>0u7yp zWq4p|!7_*zoxn`7);iHK7qrF~l`&fF^LF8k1~Rx~}a|MO1HDzL}Yvsq$O%e=tVdB}urEsbr>h=|iRfxcDZRAzMrA4P-~4bNkTKvT$RSK#10 zx4G-WcMJHgH0;u_8+*9TvbHs0Tjpv`xxNUTjVh_6Z|>tK6)2_un1+{eTwr^)Mi~+~SKG|;3RxTna6-}L zM2vV@~IJy2v$BluR<@SeTXex&&zJ#FgdfdhIZ#{ z5Q;%=$jg>Fo%CH9#_K8|!Wc_HECs+YF2`_1!&O`psHWMPT@;8vFuc26xk)1{IVn6{ zOww@-9xRtw*JNFILFXn*ky6JBXDVruGv|?Agy40jbj`c4O!&a@hm+*%3)SuecQpY zMoe%Rz2|etkF$c@)nMSBnnxU|dnC(=rO2WV77Ka-6JrWA7O288bY9l=aF`d^G{~$C z`-O~juB!=Mpyirxc}(Y+;TmdWx2*ES&5pda1lAPKE$Rr6>Msda=f=GB29(Ea+Vg3( zxHIH`NFGT5nnsMgrF*_Z^LLi9zO#BWDhqn0r3~?KRM5@v{4`|ed{fd^`4p8tqk2hI z%IDnRiwz88sDhBX3x{EWk%(U_=ro~{=s;h#Se~p1@1@n-STLRuV)`F6IjSC5z3OPA z3^WJ*XKk7T9hI(0JmMp45?R@6C?@U?0IPLm>rlH?U`Lb;!?rc-n`T$hphB(R;;F93 z)LmE7+3mG*A+R|LAvZ@PbUul=9K+WFr&nDU*dr?htm={5YF4r>r8m`uB!(XZhN?W^ zpt0OTZ+I|^1jQXvhAHwQhMxs)tj*Tc1($;YPvz0wAdn1`Q|lA#WkFoW|E$y_p-%g} zN~ptYN%G)Rk{lOHl5-bj3@oN-;Hm=ee&hNEO4)ws@R63fmik8!?d>y&wf~Kcx7r^f z_6VD1kl<~zy4}v-&PPbjU_T!nP>&9Vk13Dvck~fnnZYT(?yOpIW(H^fpdkT^e|OUj zAW4_EV>4Q?hlkW-*ulYKCvptR=Gz8-TP&@38xHD9?w-SXJ_TA6J%8dt;?gXJ9%FbG zBbyr&H)e6`F~(=1w%a zI-h7~3e${3!GES4&%P(e^AL$>G`+OaSGE$O6-4n4-eoLG`z}g_Rz0(_e@=k{795BK z-oyJVb>!5Xo&eUHG;?cFM?S!Zv=MdW?3{wYkvnwZBRaGWA6N463GYAUZvajFA5SAb rqim-9obmwW7nGfpUs4X^D||zFoAO)Aamw!~zvufODSx8;1x^10h1Gw< literal 0 HcmV?d00001 diff --git a/.gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/metadata.bin b/.gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/metadata.bin new file mode 100644 index 0000000..a2fbd1d --- /dev/null +++ b/.gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/metadata.bin @@ -0,0 +1 @@ +›obb6ye2mprgjphhpsvy2ytelmq67Oø³Ï·¦ç[š'TŸˆclassesŒþJ˜Ú h*¥={ž•+ˆsources Pÿlý ím¹%Ò¶º;å \ No newline at end of file diff --git a/.gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/sources/org/gradle/accessors/dm/LibrariesForLibs.java b/.gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/sources/org/gradle/accessors/dm/LibrariesForLibs.java new file mode 100644 index 0000000..711b517 --- /dev/null +++ b/.gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/sources/org/gradle/accessors/dm/LibrariesForLibs.java @@ -0,0 +1,273 @@ +package org.gradle.accessors.dm; + +import org.gradle.api.NonNullApi; +import org.gradle.api.artifacts.MinimalExternalModuleDependency; +import org.gradle.plugin.use.PluginDependency; +import org.gradle.api.artifacts.ExternalModuleDependencyBundle; +import org.gradle.api.artifacts.MutableVersionConstraint; +import org.gradle.api.provider.Provider; +import org.gradle.api.model.ObjectFactory; +import org.gradle.api.provider.ProviderFactory; +import org.gradle.api.internal.catalog.AbstractExternalDependencyFactory; +import org.gradle.api.internal.catalog.DefaultVersionCatalog; +import java.util.Map; +import org.gradle.api.internal.attributes.ImmutableAttributesFactory; +import org.gradle.api.internal.artifacts.dsl.CapabilityNotationParser; +import javax.inject.Inject; + +/** + * A catalog of dependencies accessible via the {@code libs} extension. + */ +@NonNullApi +public class LibrariesForLibs extends AbstractExternalDependencyFactory { + + private final AbstractExternalDependencyFactory owner = this; + private final AndroidxLibraryAccessors laccForAndroidxLibraryAccessors = new AndroidxLibraryAccessors(owner); + private final VersionAccessors vaccForVersionAccessors = new VersionAccessors(providers, config); + private final BundleAccessors baccForBundleAccessors = new BundleAccessors(objects, providers, config, attributesFactory, capabilityNotationParser); + private final PluginAccessors paccForPluginAccessors = new PluginAccessors(providers, config); + + @Inject + public LibrariesForLibs(DefaultVersionCatalog config, ProviderFactory providers, ObjectFactory objects, ImmutableAttributesFactory attributesFactory, CapabilityNotationParser capabilityNotationParser) { + super(config, providers, objects, attributesFactory, capabilityNotationParser); + } + + /** + * Dependency provider for junit with junit:junit coordinates and + * with version reference junit + *

+ * This dependency was declared in catalog libs.versions.toml + */ + public Provider getJunit() { + return create("junit"); + } + + /** + * Dependency provider for material with com.google.android.material:material coordinates and + * with version reference material + *

+ * This dependency was declared in catalog libs.versions.toml + */ + public Provider getMaterial() { + return create("material"); + } + + /** + * Group of libraries at androidx + */ + public AndroidxLibraryAccessors getAndroidx() { + return laccForAndroidxLibraryAccessors; + } + + /** + * Group of versions at versions + */ + public VersionAccessors getVersions() { + return vaccForVersionAccessors; + } + + /** + * Group of bundles at bundles + */ + public BundleAccessors getBundles() { + return baccForBundleAccessors; + } + + /** + * Group of plugins at plugins + */ + public PluginAccessors getPlugins() { + return paccForPluginAccessors; + } + + public static class AndroidxLibraryAccessors extends SubDependencyFactory { + private final AndroidxEspressoLibraryAccessors laccForAndroidxEspressoLibraryAccessors = new AndroidxEspressoLibraryAccessors(owner); + + public AndroidxLibraryAccessors(AbstractExternalDependencyFactory owner) { super(owner); } + + /** + * Dependency provider for appcompat with androidx.appcompat:appcompat coordinates and + * with version reference appcompat + *

+ * This dependency was declared in catalog libs.versions.toml + */ + public Provider getAppcompat() { + return create("androidx.appcompat"); + } + + /** + * Dependency provider for constraintlayout with androidx.constraintlayout:constraintlayout coordinates and + * with version reference constraintlayout + *

+ * This dependency was declared in catalog libs.versions.toml + */ + public Provider getConstraintlayout() { + return create("androidx.constraintlayout"); + } + + /** + * Dependency provider for core with androidx.core:core coordinates and + * with version reference core + *

+ * This dependency was declared in catalog libs.versions.toml + */ + public Provider getCore() { + return create("androidx.core"); + } + + /** + * Dependency provider for junit with androidx.test.ext:junit coordinates and + * with version reference junitVersion + *

+ * This dependency was declared in catalog libs.versions.toml + */ + public Provider getJunit() { + return create("androidx.junit"); + } + + /** + * Group of libraries at androidx.espresso + */ + public AndroidxEspressoLibraryAccessors getEspresso() { + return laccForAndroidxEspressoLibraryAccessors; + } + + } + + public static class AndroidxEspressoLibraryAccessors extends SubDependencyFactory { + + public AndroidxEspressoLibraryAccessors(AbstractExternalDependencyFactory owner) { super(owner); } + + /** + * Dependency provider for core with androidx.test.espresso:espresso-core coordinates and + * with version reference espressoCore + *

+ * This dependency was declared in catalog libs.versions.toml + */ + public Provider getCore() { + return create("androidx.espresso.core"); + } + + } + + public static class VersionAccessors extends VersionFactory { + + public VersionAccessors(ProviderFactory providers, DefaultVersionCatalog config) { super(providers, config); } + + /** + * Version alias agp with value 8.8.2 + *

+ * If the version is a rich version and cannot be represented as a + * single version string, an empty string is returned. + *

+ * This version was declared in catalog libs.versions.toml + */ + public Provider getAgp() { return getVersion("agp"); } + + /** + * Version alias appcompat with value 1.6.1 + *

+ * If the version is a rich version and cannot be represented as a + * single version string, an empty string is returned. + *

+ * This version was declared in catalog libs.versions.toml + */ + public Provider getAppcompat() { return getVersion("appcompat"); } + + /** + * Version alias constraintlayout with value 2.1.4 + *

+ * If the version is a rich version and cannot be represented as a + * single version string, an empty string is returned. + *

+ * This version was declared in catalog libs.versions.toml + */ + public Provider getConstraintlayout() { return getVersion("constraintlayout"); } + + /** + * Version alias core with value 1.12.0 + *

+ * If the version is a rich version and cannot be represented as a + * single version string, an empty string is returned. + *

+ * This version was declared in catalog libs.versions.toml + */ + public Provider getCore() { return getVersion("core"); } + + /** + * Version alias espressoCore with value 3.6.1 + *

+ * If the version is a rich version and cannot be represented as a + * single version string, an empty string is returned. + *

+ * This version was declared in catalog libs.versions.toml + */ + public Provider getEspressoCore() { return getVersion("espressoCore"); } + + /** + * Version alias junit with value 4.13.2 + *

+ * If the version is a rich version and cannot be represented as a + * single version string, an empty string is returned. + *

+ * This version was declared in catalog libs.versions.toml + */ + public Provider getJunit() { return getVersion("junit"); } + + /** + * Version alias junitVersion with value 1.2.1 + *

+ * If the version is a rich version and cannot be represented as a + * single version string, an empty string is returned. + *

+ * This version was declared in catalog libs.versions.toml + */ + public Provider getJunitVersion() { return getVersion("junitVersion"); } + + /** + * Version alias material with value 1.11.0 + *

+ * If the version is a rich version and cannot be represented as a + * single version string, an empty string is returned. + *

+ * This version was declared in catalog libs.versions.toml + */ + public Provider getMaterial() { return getVersion("material"); } + + } + + public static class BundleAccessors extends BundleFactory { + + public BundleAccessors(ObjectFactory objects, ProviderFactory providers, DefaultVersionCatalog config, ImmutableAttributesFactory attributesFactory, CapabilityNotationParser capabilityNotationParser) { super(objects, providers, config, attributesFactory, capabilityNotationParser); } + + } + + public static class PluginAccessors extends PluginFactory { + private final AndroidPluginAccessors paccForAndroidPluginAccessors = new AndroidPluginAccessors(providers, config); + + public PluginAccessors(ProviderFactory providers, DefaultVersionCatalog config) { super(providers, config); } + + /** + * Group of plugins at plugins.android + */ + public AndroidPluginAccessors getAndroid() { + return paccForAndroidPluginAccessors; + } + + } + + public static class AndroidPluginAccessors extends PluginFactory { + + public AndroidPluginAccessors(ProviderFactory providers, DefaultVersionCatalog config) { super(providers, config); } + + /** + * Plugin provider for android.application with plugin id com.android.application and + * with version reference agp + *

+ * This plugin was declared in catalog libs.versions.toml + */ + public Provider getApplication() { return createPlugin("android.application"); } + + } + +} diff --git a/.gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/sources/org/gradle/accessors/dm/LibrariesForLibsInPluginsBlock.java b/.gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/sources/org/gradle/accessors/dm/LibrariesForLibsInPluginsBlock.java new file mode 100644 index 0000000..32ef50d --- /dev/null +++ b/.gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/sources/org/gradle/accessors/dm/LibrariesForLibsInPluginsBlock.java @@ -0,0 +1,325 @@ +package org.gradle.accessors.dm; + +import org.gradle.api.NonNullApi; +import org.gradle.api.artifacts.MinimalExternalModuleDependency; +import org.gradle.plugin.use.PluginDependency; +import org.gradle.api.artifacts.ExternalModuleDependencyBundle; +import org.gradle.api.artifacts.MutableVersionConstraint; +import org.gradle.api.provider.Provider; +import org.gradle.api.model.ObjectFactory; +import org.gradle.api.provider.ProviderFactory; +import org.gradle.api.internal.catalog.AbstractExternalDependencyFactory; +import org.gradle.api.internal.catalog.DefaultVersionCatalog; +import java.util.Map; +import org.gradle.api.internal.attributes.ImmutableAttributesFactory; +import org.gradle.api.internal.artifacts.dsl.CapabilityNotationParser; +import javax.inject.Inject; + +/** + * A catalog of dependencies accessible via the {@code libs} extension. + */ +@NonNullApi +public class LibrariesForLibsInPluginsBlock extends AbstractExternalDependencyFactory { + + private final AbstractExternalDependencyFactory owner = this; + private final AndroidxLibraryAccessors laccForAndroidxLibraryAccessors = new AndroidxLibraryAccessors(owner); + private final VersionAccessors vaccForVersionAccessors = new VersionAccessors(providers, config); + private final BundleAccessors baccForBundleAccessors = new BundleAccessors(objects, providers, config, attributesFactory, capabilityNotationParser); + private final PluginAccessors paccForPluginAccessors = new PluginAccessors(providers, config); + + @Inject + public LibrariesForLibsInPluginsBlock(DefaultVersionCatalog config, ProviderFactory providers, ObjectFactory objects, ImmutableAttributesFactory attributesFactory, CapabilityNotationParser capabilityNotationParser) { + super(config, providers, objects, attributesFactory, capabilityNotationParser); + } + + /** + * Dependency provider for junit with junit:junit coordinates and + * with version reference junit + *

+ * This dependency was declared in catalog libs.versions.toml + * + * @deprecated Will be removed in Gradle 9.0. + */ + @Deprecated + public Provider getJunit() { + org.gradle.internal.deprecation.DeprecationLogger.deprecateBehaviour("Accessing libraries or bundles from version catalogs in the plugins block.").withAdvice("Only use versions or plugins from catalogs in the plugins block.").willBeRemovedInGradle9().withUpgradeGuideSection(8, "kotlin_dsl_deprecated_catalogs_plugins_block").nagUser(); + return create("junit"); + } + + /** + * Dependency provider for material with com.google.android.material:material coordinates and + * with version reference material + *

+ * This dependency was declared in catalog libs.versions.toml + * + * @deprecated Will be removed in Gradle 9.0. + */ + @Deprecated + public Provider getMaterial() { + org.gradle.internal.deprecation.DeprecationLogger.deprecateBehaviour("Accessing libraries or bundles from version catalogs in the plugins block.").withAdvice("Only use versions or plugins from catalogs in the plugins block.").willBeRemovedInGradle9().withUpgradeGuideSection(8, "kotlin_dsl_deprecated_catalogs_plugins_block").nagUser(); + return create("material"); + } + + /** + * Group of libraries at androidx + * + * @deprecated Will be removed in Gradle 9.0. + */ + @Deprecated + public AndroidxLibraryAccessors getAndroidx() { + org.gradle.internal.deprecation.DeprecationLogger.deprecateBehaviour("Accessing libraries or bundles from version catalogs in the plugins block.").withAdvice("Only use versions or plugins from catalogs in the plugins block.").willBeRemovedInGradle9().withUpgradeGuideSection(8, "kotlin_dsl_deprecated_catalogs_plugins_block").nagUser(); + return laccForAndroidxLibraryAccessors; + } + + /** + * Group of versions at versions + */ + public VersionAccessors getVersions() { + return vaccForVersionAccessors; + } + + /** + * Group of bundles at bundles + * + * @deprecated Will be removed in Gradle 9.0. + */ + @Deprecated + public BundleAccessors getBundles() { + org.gradle.internal.deprecation.DeprecationLogger.deprecateBehaviour("Accessing libraries or bundles from version catalogs in the plugins block.").withAdvice("Only use versions or plugins from catalogs in the plugins block.").willBeRemovedInGradle9().withUpgradeGuideSection(8, "kotlin_dsl_deprecated_catalogs_plugins_block").nagUser(); + return baccForBundleAccessors; + } + + /** + * Group of plugins at plugins + */ + public PluginAccessors getPlugins() { + return paccForPluginAccessors; + } + + /** + * @deprecated Will be removed in Gradle 9.0. + */ + @Deprecated + public static class AndroidxLibraryAccessors extends SubDependencyFactory { + private final AndroidxEspressoLibraryAccessors laccForAndroidxEspressoLibraryAccessors = new AndroidxEspressoLibraryAccessors(owner); + + public AndroidxLibraryAccessors(AbstractExternalDependencyFactory owner) { super(owner); } + + /** + * Dependency provider for appcompat with androidx.appcompat:appcompat coordinates and + * with version reference appcompat + *

+ * This dependency was declared in catalog libs.versions.toml + * + * @deprecated Will be removed in Gradle 9.0. + */ + @Deprecated + public Provider getAppcompat() { + org.gradle.internal.deprecation.DeprecationLogger.deprecateBehaviour("Accessing libraries or bundles from version catalogs in the plugins block.").withAdvice("Only use versions or plugins from catalogs in the plugins block.").willBeRemovedInGradle9().withUpgradeGuideSection(8, "kotlin_dsl_deprecated_catalogs_plugins_block").nagUser(); + return create("androidx.appcompat"); + } + + /** + * Dependency provider for constraintlayout with androidx.constraintlayout:constraintlayout coordinates and + * with version reference constraintlayout + *

+ * This dependency was declared in catalog libs.versions.toml + * + * @deprecated Will be removed in Gradle 9.0. + */ + @Deprecated + public Provider getConstraintlayout() { + org.gradle.internal.deprecation.DeprecationLogger.deprecateBehaviour("Accessing libraries or bundles from version catalogs in the plugins block.").withAdvice("Only use versions or plugins from catalogs in the plugins block.").willBeRemovedInGradle9().withUpgradeGuideSection(8, "kotlin_dsl_deprecated_catalogs_plugins_block").nagUser(); + return create("androidx.constraintlayout"); + } + + /** + * Dependency provider for core with androidx.core:core coordinates and + * with version reference core + *

+ * This dependency was declared in catalog libs.versions.toml + * + * @deprecated Will be removed in Gradle 9.0. + */ + @Deprecated + public Provider getCore() { + org.gradle.internal.deprecation.DeprecationLogger.deprecateBehaviour("Accessing libraries or bundles from version catalogs in the plugins block.").withAdvice("Only use versions or plugins from catalogs in the plugins block.").willBeRemovedInGradle9().withUpgradeGuideSection(8, "kotlin_dsl_deprecated_catalogs_plugins_block").nagUser(); + return create("androidx.core"); + } + + /** + * Dependency provider for junit with androidx.test.ext:junit coordinates and + * with version reference junitVersion + *

+ * This dependency was declared in catalog libs.versions.toml + * + * @deprecated Will be removed in Gradle 9.0. + */ + @Deprecated + public Provider getJunit() { + org.gradle.internal.deprecation.DeprecationLogger.deprecateBehaviour("Accessing libraries or bundles from version catalogs in the plugins block.").withAdvice("Only use versions or plugins from catalogs in the plugins block.").willBeRemovedInGradle9().withUpgradeGuideSection(8, "kotlin_dsl_deprecated_catalogs_plugins_block").nagUser(); + return create("androidx.junit"); + } + + /** + * Group of libraries at androidx.espresso + * + * @deprecated Will be removed in Gradle 9.0. + */ + @Deprecated + public AndroidxEspressoLibraryAccessors getEspresso() { + org.gradle.internal.deprecation.DeprecationLogger.deprecateBehaviour("Accessing libraries or bundles from version catalogs in the plugins block.").withAdvice("Only use versions or plugins from catalogs in the plugins block.").willBeRemovedInGradle9().withUpgradeGuideSection(8, "kotlin_dsl_deprecated_catalogs_plugins_block").nagUser(); + return laccForAndroidxEspressoLibraryAccessors; + } + + } + + /** + * @deprecated Will be removed in Gradle 9.0. + */ + @Deprecated + public static class AndroidxEspressoLibraryAccessors extends SubDependencyFactory { + + public AndroidxEspressoLibraryAccessors(AbstractExternalDependencyFactory owner) { super(owner); } + + /** + * Dependency provider for core with androidx.test.espresso:espresso-core coordinates and + * with version reference espressoCore + *

+ * This dependency was declared in catalog libs.versions.toml + * + * @deprecated Will be removed in Gradle 9.0. + */ + @Deprecated + public Provider getCore() { + org.gradle.internal.deprecation.DeprecationLogger.deprecateBehaviour("Accessing libraries or bundles from version catalogs in the plugins block.").withAdvice("Only use versions or plugins from catalogs in the plugins block.").willBeRemovedInGradle9().withUpgradeGuideSection(8, "kotlin_dsl_deprecated_catalogs_plugins_block").nagUser(); + return create("androidx.espresso.core"); + } + + } + + public static class VersionAccessors extends VersionFactory { + + public VersionAccessors(ProviderFactory providers, DefaultVersionCatalog config) { super(providers, config); } + + /** + * Version alias agp with value 8.8.2 + *

+ * If the version is a rich version and cannot be represented as a + * single version string, an empty string is returned. + *

+ * This version was declared in catalog libs.versions.toml + */ + public Provider getAgp() { return getVersion("agp"); } + + /** + * Version alias appcompat with value 1.6.1 + *

+ * If the version is a rich version and cannot be represented as a + * single version string, an empty string is returned. + *

+ * This version was declared in catalog libs.versions.toml + */ + public Provider getAppcompat() { return getVersion("appcompat"); } + + /** + * Version alias constraintlayout with value 2.1.4 + *

+ * If the version is a rich version and cannot be represented as a + * single version string, an empty string is returned. + *

+ * This version was declared in catalog libs.versions.toml + */ + public Provider getConstraintlayout() { return getVersion("constraintlayout"); } + + /** + * Version alias core with value 1.12.0 + *

+ * If the version is a rich version and cannot be represented as a + * single version string, an empty string is returned. + *

+ * This version was declared in catalog libs.versions.toml + */ + public Provider getCore() { return getVersion("core"); } + + /** + * Version alias espressoCore with value 3.6.1 + *

+ * If the version is a rich version and cannot be represented as a + * single version string, an empty string is returned. + *

+ * This version was declared in catalog libs.versions.toml + */ + public Provider getEspressoCore() { return getVersion("espressoCore"); } + + /** + * Version alias junit with value 4.13.2 + *

+ * If the version is a rich version and cannot be represented as a + * single version string, an empty string is returned. + *

+ * This version was declared in catalog libs.versions.toml + */ + public Provider getJunit() { return getVersion("junit"); } + + /** + * Version alias junitVersion with value 1.2.1 + *

+ * If the version is a rich version and cannot be represented as a + * single version string, an empty string is returned. + *

+ * This version was declared in catalog libs.versions.toml + */ + public Provider getJunitVersion() { return getVersion("junitVersion"); } + + /** + * Version alias material with value 1.11.0 + *

+ * If the version is a rich version and cannot be represented as a + * single version string, an empty string is returned. + *

+ * This version was declared in catalog libs.versions.toml + */ + public Provider getMaterial() { return getVersion("material"); } + + } + + /** + * @deprecated Will be removed in Gradle 9.0. + */ + @Deprecated + public static class BundleAccessors extends BundleFactory { + + public BundleAccessors(ObjectFactory objects, ProviderFactory providers, DefaultVersionCatalog config, ImmutableAttributesFactory attributesFactory, CapabilityNotationParser capabilityNotationParser) { super(objects, providers, config, attributesFactory, capabilityNotationParser); } + + } + + public static class PluginAccessors extends PluginFactory { + private final AndroidPluginAccessors paccForAndroidPluginAccessors = new AndroidPluginAccessors(providers, config); + + public PluginAccessors(ProviderFactory providers, DefaultVersionCatalog config) { super(providers, config); } + + /** + * Group of plugins at plugins.android + */ + public AndroidPluginAccessors getAndroid() { + return paccForAndroidPluginAccessors; + } + + } + + public static class AndroidPluginAccessors extends PluginFactory { + + public AndroidPluginAccessors(ProviderFactory providers, DefaultVersionCatalog config) { super(providers, config); } + + /** + * Plugin provider for android.application with plugin id com.android.application and + * with version reference agp + *

+ * This plugin was declared in catalog libs.versions.toml + */ + public Provider getApplication() { return createPlugin("android.application"); } + + } + +} diff --git a/.gradle/8.10.2/dependencies-accessors/gc.properties b/.gradle/8.10.2/dependencies-accessors/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/.gradle/8.10.2/executionHistory/executionHistory.lock b/.gradle/8.10.2/executionHistory/executionHistory.lock new file mode 100644 index 0000000000000000000000000000000000000000..68f7b59a53a585010b07dec5c22288bd0fa9288f GIT binary patch literal 17 TcmZR+@n{9Fjq|Er1}FdkHYEfp literal 0 HcmV?d00001 diff --git a/.gradle/8.10.2/fileChanges/last-build.bin b/.gradle/8.10.2/fileChanges/last-build.bin new file mode 100644 index 0000000000000000000000000000000000000000..f76dd238ade08917e6712764a16a22005a50573d GIT binary patch literal 1 IcmZPo000310RR91 literal 0 HcmV?d00001 diff --git a/.gradle/8.10.2/fileHashes/fileHashes.bin b/.gradle/8.10.2/fileHashes/fileHashes.bin new file mode 100644 index 0000000000000000000000000000000000000000..93a17fa28c1d820f2a892e28d766618e6538cbb7 GIT binary patch literal 20247 zcmeI4drVVT9LF!*7922J6<9N9fl@;1N?QeirBX^lHu|6p6)K__9vLI7vl9fAbT1TS z8wTh2L}asQovZ26t!-rjtA zzUT3|=ca%3w22fY;5%`l9u>bwmv99JzyKHk17H9QfB`T72EYIq00UqE41fVJ00zJS z7ytuc01W(J45Tp=@j{ak$lP5Qyi$r%`Y;!v)#mgM`aV`Qp||xT{?GP7EBd)U(e*X7`I*Yw*E8@o6 zgnuFOjxv`C^Duvt@Db~GvF($*Ul2EB51Mu#18#PtfopU%5=g%@|`5aLNigbVp?zbWi5Uq;+8MELr!?PIO) znl~b@eS+|3d`)*E?;GAh+}KCBtR#2f;5Q>2#FIk_kFM_tw8iGXgt-1b;i|$H&&`xa zdLXW&30H5KZEx=3X%SEQfpE?AuV?1?5odAxX@sYD`<_VM?WMu>j}e}k)}P~uH@TK1 zQ;fogeE#ew`wSA?j$xMYEQzv$*UT~b@_ysip#mSXoV1QeKz6cZBq#%Q6gR^$#)4S zuM|aRpbVVB02lxRU;qq&0WbgtzyKHk17H9QfB`T72EYIq00UqE41fVJ00zJS7ytuc z01SWuFaQR?02lxRU;qq&0WbgtzyKHk1CP&uYtyupIYL|qKd>zimzgsE9JINCRm`d`0COktZw{7ZR<;;P)JyU(>2T?*k#MESpYJ@qhNOZMUtho@k z^Uw{e-kF%cG=mf8mIIX3waa=%LUOZF=hn2vCv*M1{oCi`nEl+YQ7Pt8!lQ$oc)Qb* z8u4t%#@FvuU8KXG{1hdW_?HU473@TKaHt@~(x?zhS1s&1JT-v(c!2tFUt%W)e!8@H zz!^1nLmS_8TtWrnK73JvE@vkOOEtC9ubo&1Qc=+v(`*`>Sjj zmvCZnIY6y8vJ?Hv+qRB^Q=5OD{LnmIZ4bh(uwCv1JMn(A;HoL7cEg%m311#=Kf$bW z*Qm(M>5J?{S>#g&fi+;;NqLtyC-bA-I3Yu$qH_O@1Uw(`eBjmopL;$Y&*#VAx(!t> literal 0 HcmV?d00001 diff --git a/.gradle/8.10.2/fileHashes/fileHashes.lock b/.gradle/8.10.2/fileHashes/fileHashes.lock new file mode 100644 index 0000000000000000000000000000000000000000..0d13aa07a7a8936e73735bf978ca5c0efcbadb17 GIT binary patch literal 17 TcmZP;WYX;aWzFNl00Ei+9617g literal 0 HcmV?d00001 diff --git a/.gradle/8.10.2/gc.properties b/.gradle/8.10.2/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock new file mode 100644 index 0000000000000000000000000000000000000000..1f9ee57ab661d933544c3727946da75e9de2c154 GIT binary patch literal 17 UcmZRcuhL|{$!2B}0|YPv04n$casU7T literal 0 HcmV?d00001 diff --git a/.gradle/buildOutputCleanup/cache.properties b/.gradle/buildOutputCleanup/cache.properties new file mode 100644 index 0000000..e71494c --- /dev/null +++ b/.gradle/buildOutputCleanup/cache.properties @@ -0,0 +1,2 @@ +#Mon Mar 31 11:26:32 CEST 2025 +gradle.version=8.10.2 diff --git a/.gradle/file-system.probe b/.gradle/file-system.probe new file mode 100644 index 0000000000000000000000000000000000000000..02940b1b62a06de4025b3783f57a8e3385a2311c GIT binary patch literal 8 PcmZQzV4V88&GHif37G>k literal 0 HcmV?d00001 diff --git a/.gradle/vcs-1/gc.properties b/.gradle/vcs-1/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/app/build.gradle b/app/build.gradle index b04e2fe..ce5eb55 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,5 +1,6 @@ plugins { id 'com.android.application' + id 'com.google.gms.google-services' } android { @@ -36,6 +37,15 @@ dependencies { implementation 'androidx.core:core:1.12.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' implementation 'com.google.android.material:material:1.11.0' + implementation platform('com.google.firebase:firebase-bom:32.7.4') + implementation 'com.google.firebase:firebase-auth' + implementation 'com.google.firebase:firebase-firestore' + implementation 'com.google.firebase:firebase-storage' + implementation 'androidx.lifecycle:lifecycle-viewmodel:2.7.0' + implementation 'androidx.lifecycle:lifecycle-livedata:2.7.0' + implementation 'androidx.lifecycle:lifecycle-runtime:2.7.0' + implementation 'androidx.navigation:navigation-fragment:2.7.7' + implementation 'androidx.navigation:navigation-ui:2.7.7' testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.5' androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' diff --git a/app/src/main/java/com/pineapple/capture/auth/AuthActivity.java b/app/src/main/java/com/pineapple/capture/auth/AuthActivity.java new file mode 100644 index 0000000..c0972e8 --- /dev/null +++ b/app/src/main/java/com/pineapple/capture/auth/AuthActivity.java @@ -0,0 +1,99 @@ +package com.pineapple.capture.auth; + +import android.content.Intent; +import android.os.Bundle; +import android.view.View; +import android.widget.TextView; +import androidx.appcompat.app.AppCompatActivity; +import androidx.lifecycle.ViewModelProvider; +import com.google.android.material.button.MaterialButton; +import com.google.android.material.textfield.TextInputEditText; +import com.pineapple.capture.R; +import com.pineapple.capture.feed.MainFeedActivity; + +public class AuthActivity extends AppCompatActivity { + private AuthViewModel authViewModel; + private TextInputEditText usernameInput; + private TextInputEditText passwordInput; + private MaterialButton loginButton; + private MaterialButton signupButton; + private TextView errorText; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_auth); + + authViewModel = new ViewModelProvider(this).get(AuthViewModel.class); + + // Initialize views + usernameInput = findViewById(R.id.username_input); + passwordInput = findViewById(R.id.password_input); + loginButton = findViewById(R.id.login_button); + signupButton = findViewById(R.id.signup_button); + errorText = findViewById(R.id.error_text); + + // Set up click listeners + loginButton.setOnClickListener(v -> handleLogin()); + signupButton.setOnClickListener(v -> handleSignup()); + + // Observe authentication state changes + authViewModel.getAuthState().observe(this, isAuthenticated -> { + if (isAuthenticated) { + startActivity(new Intent(this, MainFeedActivity.class)); + finish(); + } + }); + + // Observe error messages + authViewModel.getErrorMessage().observe(this, error -> { + if (error != null && !error.isEmpty()) { + errorText.setText(error); + errorText.setVisibility(View.VISIBLE); + } else { + errorText.setVisibility(View.GONE); + } + }); + } + + private void handleLogin() { + String username = usernameInput.getText().toString().trim(); + String password = passwordInput.getText().toString().trim(); + + if (validateInput(username, password)) { + authViewModel.signIn(username + "@pineapple.com", password); + } + } + + private void handleSignup() { + String username = usernameInput.getText().toString().trim(); + String password = passwordInput.getText().toString().trim(); + + if (validateInput(username, password)) { + authViewModel.signUp(username + "@pineapple.com", password); + } + } + + private boolean validateInput(String username, String password) { + if (username.isEmpty()) { + errorText.setText("Username cannot be empty"); + errorText.setVisibility(View.VISIBLE); + return false; + } + + if (password.isEmpty()) { + errorText.setText("Password cannot be empty"); + errorText.setVisibility(View.VISIBLE); + return false; + } + + if (password.length() < 6) { + errorText.setText("Password must be at least 6 characters"); + errorText.setVisibility(View.VISIBLE); + return false; + } + + errorText.setVisibility(View.GONE); + return true; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/pineapple/capture/auth/AuthViewModel.java b/app/src/main/java/com/pineapple/capture/auth/AuthViewModel.java new file mode 100644 index 0000000..b4029a7 --- /dev/null +++ b/app/src/main/java/com/pineapple/capture/auth/AuthViewModel.java @@ -0,0 +1,97 @@ +package com.pineapple.capture.auth; + +import androidx.lifecycle.LiveData; +import androidx.lifecycle.MutableLiveData; +import androidx.lifecycle.ViewModel; +import com.google.firebase.auth.FirebaseAuth; +import com.google.firebase.auth.FirebaseUser; +import com.google.firebase.firestore.FirebaseFirestore; +import com.pineapple.capture.profile.UserProfile; + +public class AuthViewModel extends ViewModel { + private FirebaseAuth auth; + private FirebaseFirestore db; + private MutableLiveData authState; + private MutableLiveData errorMessage; + + public AuthViewModel() { + auth = FirebaseAuth.getInstance(); + db = FirebaseFirestore.getInstance(); + authState = new MutableLiveData<>(); + errorMessage = new MutableLiveData<>(); + } + + public void signIn(String email, String password) { + auth.signInWithEmailAndPassword(email, password) + .addOnSuccessListener(authResult -> authState.setValue(true)) + .addOnFailureListener(e -> errorMessage.setValue("Invalid username or password")); + } + + public void signUp(String email, String password) { + String username = email.replace("@pineapple.com", ""); + + // Check if username already exists + db.collection("usernames") + .document(username) + .get() + .addOnSuccessListener(document -> { + if (document.exists()) { + errorMessage.setValue("Username already taken"); + } else { + // Create new user + auth.createUserWithEmailAndPassword(email, password) + .addOnSuccessListener(authResult -> { + FirebaseUser user = authResult.getUser(); + if (user != null) { + // Create user profile + UserProfile profile = new UserProfile(username, ""); + db.collection("users") + .document(user.getUid()) + .set(profile) + .addOnSuccessListener(aVoid -> { + // Reserve username + db.collection("usernames") + .document(username) + .set(new UsernameReservation(user.getUid())) + .addOnSuccessListener(aVoid2 -> authState.setValue(true)) + .addOnFailureListener(e -> errorMessage.setValue("Failed to create user profile")); + }) + .addOnFailureListener(e -> errorMessage.setValue("Failed to create user profile")); + } + }) + .addOnFailureListener(e -> errorMessage.setValue("Failed to create account")); + } + }) + .addOnFailureListener(e -> errorMessage.setValue("Failed to check username availability")); + } + + public void signOut() { + auth.signOut(); + authState.setValue(false); + } + + public LiveData getAuthState() { + return authState; + } + + public LiveData getErrorMessage() { + return errorMessage; + } + + public FirebaseUser getCurrentUser() { + return auth.getCurrentUser(); + } + + private static class UsernameReservation { + private String userId; + + public UsernameReservation() {} + + public UsernameReservation(String userId) { + this.userId = userId; + } + + public String getUserId() { return userId; } + public void setUserId(String userId) { this.userId = userId; } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/pineapple/capture/feed/FeedItem.java b/app/src/main/java/com/pineapple/capture/feed/FeedItem.java new file mode 100644 index 0000000..19414fa --- /dev/null +++ b/app/src/main/java/com/pineapple/capture/feed/FeedItem.java @@ -0,0 +1,42 @@ +package com.pineapple.capture.feed; + +import com.google.firebase.Timestamp; + +public class FeedItem { + private String id; + private String userId; + private String content; + private String imageUrl; + private Timestamp timestamp; + private int likes; + + // Required empty constructor for Firestore + public FeedItem() {} + + public FeedItem(String userId, String content, String imageUrl) { + this.userId = userId; + this.content = content; + this.imageUrl = imageUrl; + this.timestamp = Timestamp.now(); + this.likes = 0; + } + + // Getters and setters + public String getId() { return id; } + public void setId(String id) { this.id = id; } + + public String getUserId() { return userId; } + public void setUserId(String userId) { this.userId = userId; } + + public String getContent() { return content; } + public void setContent(String content) { this.content = content; } + + public String getImageUrl() { return imageUrl; } + public void setImageUrl(String imageUrl) { this.imageUrl = imageUrl; } + + public Timestamp getTimestamp() { return timestamp; } + public void setTimestamp(Timestamp timestamp) { this.timestamp = timestamp; } + + public int getLikes() { return likes; } + public void setLikes(int likes) { this.likes = likes; } +} \ No newline at end of file diff --git a/app/src/main/java/com/pineapple/capture/feed/MainFeedActivity.java b/app/src/main/java/com/pineapple/capture/feed/MainFeedActivity.java new file mode 100644 index 0000000..2c2c967 --- /dev/null +++ b/app/src/main/java/com/pineapple/capture/feed/MainFeedActivity.java @@ -0,0 +1,29 @@ +package com.pineapple.capture.feed; + +import android.os.Bundle; +import androidx.appcompat.app.AppCompatActivity; +import androidx.lifecycle.ViewModelProvider; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import com.pineapple.capture.R; + +public class MainFeedActivity extends AppCompatActivity { + private MainFeedViewModel viewModel; + private RecyclerView recyclerView; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main_feed); + + viewModel = new ViewModelProvider(this).get(MainFeedViewModel.class); + + recyclerView = findViewById(R.id.feed_recycler_view); + recyclerView.setLayoutManager(new LinearLayoutManager(this)); + + // Observe feed updates + viewModel.getFeedItems().observe(this, feedItems -> { + // Update RecyclerView adapter with new items + }); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/pineapple/capture/feed/MainFeedViewModel.java b/app/src/main/java/com/pineapple/capture/feed/MainFeedViewModel.java new file mode 100644 index 0000000..e5a9a0c --- /dev/null +++ b/app/src/main/java/com/pineapple/capture/feed/MainFeedViewModel.java @@ -0,0 +1,44 @@ +package com.pineapple.capture.feed; + +import androidx.lifecycle.LiveData; +import androidx.lifecycle.MutableLiveData; +import androidx.lifecycle.ViewModel; +import com.google.firebase.firestore.FirebaseFirestore; +import java.util.List; +import java.util.ArrayList; + +public class MainFeedViewModel extends ViewModel { + private FirebaseFirestore db; + private MutableLiveData> feedItems; + + public MainFeedViewModel() { + db = FirebaseFirestore.getInstance(); + feedItems = new MutableLiveData<>(new ArrayList<>()); + loadFeedItems(); + } + + private void loadFeedItems() { + db.collection("posts") + .orderBy("timestamp", com.google.firebase.firestore.Query.Direction.DESCENDING) + .addSnapshotListener((value, error) -> { + if (error != null) { + return; + } + + List items = new ArrayList<>(); + if (value != null) { + for (com.google.firebase.firestore.DocumentSnapshot doc : value) { + FeedItem item = doc.toObject(FeedItem.class); + if (item != null) { + items.add(item); + } + } + } + feedItems.setValue(items); + }); + } + + public LiveData> getFeedItems() { + return feedItems; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/pineapple/capture/friends/Friend.java b/app/src/main/java/com/pineapple/capture/friends/Friend.java new file mode 100644 index 0000000..fe72702 --- /dev/null +++ b/app/src/main/java/com/pineapple/capture/friends/Friend.java @@ -0,0 +1,31 @@ +package com.pineapple.capture.friends; + +public class Friend { + private String userId; + private String name; + private String profileImageUrl; + private long friendsSince; + + // Required empty constructor for Firestore + public Friend() {} + + public Friend(String userId, String name, String profileImageUrl) { + this.userId = userId; + this.name = name; + this.profileImageUrl = profileImageUrl; + this.friendsSince = System.currentTimeMillis(); + } + + // Getters and setters + public String getUserId() { return userId; } + public void setUserId(String userId) { this.userId = userId; } + + public String getName() { return name; } + public void setName(String name) { this.name = name; } + + public String getProfileImageUrl() { return profileImageUrl; } + public void setProfileImageUrl(String profileImageUrl) { this.profileImageUrl = profileImageUrl; } + + public long getFriendsSince() { return friendsSince; } + public void setFriendsSince(long friendsSince) { this.friendsSince = friendsSince; } +} \ No newline at end of file diff --git a/app/src/main/java/com/pineapple/capture/friends/FriendsActivity.java b/app/src/main/java/com/pineapple/capture/friends/FriendsActivity.java new file mode 100644 index 0000000..2dd9366 --- /dev/null +++ b/app/src/main/java/com/pineapple/capture/friends/FriendsActivity.java @@ -0,0 +1,29 @@ +package com.pineapple.capture.friends; + +import android.os.Bundle; +import androidx.appcompat.app.AppCompatActivity; +import androidx.lifecycle.ViewModelProvider; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import com.pineapple.capture.R; + +public class FriendsActivity extends AppCompatActivity { + private FriendsViewModel viewModel; + private RecyclerView recyclerView; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_friends); + + viewModel = new ViewModelProvider(this).get(FriendsViewModel.class); + + recyclerView = findViewById(R.id.friends_recycler_view); + recyclerView.setLayoutManager(new LinearLayoutManager(this)); + + // Observe friends list changes + viewModel.getFriends().observe(this, friends -> { + // Update RecyclerView adapter with new friends list + }); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/pineapple/capture/friends/FriendsViewModel.java b/app/src/main/java/com/pineapple/capture/friends/FriendsViewModel.java new file mode 100644 index 0000000..3b638a2 --- /dev/null +++ b/app/src/main/java/com/pineapple/capture/friends/FriendsViewModel.java @@ -0,0 +1,68 @@ +package com.pineapple.capture.friends; + +import androidx.lifecycle.LiveData; +import androidx.lifecycle.MutableLiveData; +import androidx.lifecycle.ViewModel; +import com.google.firebase.auth.FirebaseAuth; +import com.google.firebase.firestore.FirebaseFirestore; +import java.util.List; +import java.util.ArrayList; + +public class FriendsViewModel extends ViewModel { + private FirebaseFirestore db; + private FirebaseAuth auth; + private MutableLiveData> friends; + + public FriendsViewModel() { + db = FirebaseFirestore.getInstance(); + auth = FirebaseAuth.getInstance(); + friends = new MutableLiveData<>(new ArrayList<>()); + loadFriends(); + } + + private void loadFriends() { + String userId = auth.getCurrentUser() != null ? auth.getCurrentUser().getUid() : null; + if (userId != null) { + db.collection("users").document(userId) + .collection("friends") + .addSnapshotListener((value, error) -> { + if (error != null) { + return; + } + List friendsList = new ArrayList<>(); + if (value != null) { + for (com.google.firebase.firestore.DocumentSnapshot doc : value) { + Friend friend = doc.toObject(Friend.class); + if (friend != null) { + friendsList.add(friend); + } + } + } + friends.setValue(friendsList); + }); + } + } + + public void addFriend(String friendId) { + String userId = auth.getCurrentUser() != null ? auth.getCurrentUser().getUid() : null; + if (userId != null) { + db.collection("users").document(friendId) + .get() + .addOnSuccessListener(documentSnapshot -> { + if (documentSnapshot.exists()) { + Friend friend = documentSnapshot.toObject(Friend.class); + if (friend != null) { + db.collection("users").document(userId) + .collection("friends") + .document(friendId) + .set(friend); + } + } + }); + } + } + + public LiveData> getFriends() { + return friends; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/pineapple/capture/profile/ProfileActivity.java b/app/src/main/java/com/pineapple/capture/profile/ProfileActivity.java new file mode 100644 index 0000000..96af38a --- /dev/null +++ b/app/src/main/java/com/pineapple/capture/profile/ProfileActivity.java @@ -0,0 +1,36 @@ +package com.pineapple.capture.profile; + +import android.os.Bundle; +import android.widget.ImageView; +import android.widget.TextView; +import androidx.appcompat.app.AppCompatActivity; +import androidx.lifecycle.ViewModelProvider; +import com.pineapple.capture.R; + +public class ProfileActivity extends AppCompatActivity { + private ProfileViewModel viewModel; + private ImageView profileImage; + private TextView userName; + private TextView userBio; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_profile); + + viewModel = new ViewModelProvider(this).get(ProfileViewModel.class); + + profileImage = findViewById(R.id.profile_image); + userName = findViewById(R.id.user_name); + userBio = findViewById(R.id.user_bio); + + // Observe profile data changes + viewModel.getUserProfile().observe(this, userProfile -> { + if (userProfile != null) { + userName.setText(userProfile.getName()); + userBio.setText(userProfile.getBio()); + // Load profile image using a library like Glide + } + }); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/pineapple/capture/profile/ProfileViewModel.java b/app/src/main/java/com/pineapple/capture/profile/ProfileViewModel.java new file mode 100644 index 0000000..a3a8a7d --- /dev/null +++ b/app/src/main/java/com/pineapple/capture/profile/ProfileViewModel.java @@ -0,0 +1,49 @@ +package com.pineapple.capture.profile; + +import androidx.lifecycle.LiveData; +import androidx.lifecycle.MutableLiveData; +import androidx.lifecycle.ViewModel; +import com.google.firebase.auth.FirebaseAuth; +import com.google.firebase.firestore.FirebaseFirestore; + +public class ProfileViewModel extends ViewModel { + private FirebaseFirestore db; + private FirebaseAuth auth; + private MutableLiveData userProfile; + + public ProfileViewModel() { + db = FirebaseFirestore.getInstance(); + auth = FirebaseAuth.getInstance(); + userProfile = new MutableLiveData<>(); + loadUserProfile(); + } + + private void loadUserProfile() { + String userId = auth.getCurrentUser() != null ? auth.getCurrentUser().getUid() : null; + if (userId != null) { + db.collection("users").document(userId) + .addSnapshotListener((document, error) -> { + if (error != null) { + return; + } + if (document != null && document.exists()) { + UserProfile profile = document.toObject(UserProfile.class); + userProfile.setValue(profile); + } + }); + } + } + + public void updateProfile(String name, String bio) { + String userId = auth.getCurrentUser() != null ? auth.getCurrentUser().getUid() : null; + if (userId != null) { + UserProfile profile = new UserProfile(name, bio); + db.collection("users").document(userId) + .set(profile); + } + } + + public LiveData getUserProfile() { + return userProfile; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/pineapple/capture/profile/UserProfile.java b/app/src/main/java/com/pineapple/capture/profile/UserProfile.java new file mode 100644 index 0000000..c7239e3 --- /dev/null +++ b/app/src/main/java/com/pineapple/capture/profile/UserProfile.java @@ -0,0 +1,25 @@ +package com.pineapple.capture.profile; + +public class UserProfile { + private String name; + private String bio; + private String profileImageUrl; + + // Required empty constructor for Firestore + public UserProfile() {} + + public UserProfile(String name, String bio) { + this.name = name; + this.bio = bio; + } + + // Getters and setters + public String getName() { return name; } + public void setName(String name) { this.name = name; } + + public String getBio() { return bio; } + public void setBio(String bio) { this.bio = bio; } + + public String getProfileImageUrl() { return profileImageUrl; } + public void setProfileImageUrl(String profileImageUrl) { this.profileImageUrl = profileImageUrl; } +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_auth.xml b/app/src/main/res/layout/activity_auth.xml new file mode 100644 index 0000000..ba26d5e --- /dev/null +++ b/app/src/main/res/layout/activity_auth.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/build.gradle b/build.gradle index cff100c..e6d4cc7 100644 --- a/build.gradle +++ b/build.gradle @@ -6,6 +6,7 @@ buildscript { } dependencies { classpath 'com.android.tools.build:gradle:8.2.2' + classpath 'com.google.gms:google-services:4.4.1' // Google Services plugin } } From 145cf237a47da72042d83f49231a305a9f749a5c Mon Sep 17 00:00:00 2001 From: Debojyoti Mishra <105543436+DebojyotiMishra@users.noreply.github.com> Date: Mon, 31 Mar 2025 12:21:12 +0200 Subject: [PATCH 05/83] chore(config): add Firebase configuration and gitignore --- .gitignore | 62 ++++++++++++++++++ .gradle/8.10.2/checksums/checksums.lock | Bin 17 -> 17 bytes .gradle/8.10.2/checksums/md5-checksums.bin | Bin 23097 -> 23197 bytes .gradle/8.10.2/checksums/sha1-checksums.bin | Bin 28055 -> 39989 bytes .../executionHistory/executionHistory.lock | Bin 17 -> 17 bytes .gradle/8.10.2/fileHashes/fileHashes.bin | Bin 20247 -> 26347 bytes .gradle/8.10.2/fileHashes/fileHashes.lock | Bin 17 -> 17 bytes .../buildOutputCleanup.lock | Bin 17 -> 17 bytes .gradle/file-system.probe | Bin 8 -> 8 bytes 9 files changed, 62 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ab485f9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,62 @@ +*.iml +.gradle +/local.properties +/.idea +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +local.properties + +# Firebase configuration file +google-services.json +app/google-services.json + +# Generated files +bin/ +gen/ +out/ + +# Gradle files +.gradle/ +build/ + +# Local configuration file (sdk path, etc) +local.properties + +# Log Files +*.log + +# Android Studio Navigation editor temp files +.navigation/ + +# Android Studio captures folder +captures/ + +# IntelliJ +*.iml +.idea/workspace.xml +.idea/tasks.xml +.idea/gradle.xml +.idea/assetWizardSettings.xml +.idea/dictionaries +.idea/libraries +.idea/caches + +# Keystore files +*.jks +*.keystore + +# External native build folder generated in Android Studio 2.2 and later +.externalNativeBuild +.cxx/ + +# Version control +vcs.xml + +# lint +lint/intermediates/ +lint/generated/ +lint/outputs/ +lint/tmp/ \ No newline at end of file diff --git a/.gradle/8.10.2/checksums/checksums.lock b/.gradle/8.10.2/checksums/checksums.lock index c6dbb4e996e2829f0a4d04d998341d13015d9305..526040c200fd2b6b1864f45992e4384a37e90083 100644 GIT binary patch literal 17 VcmZQRqC96!Pv}!G1~6d!0suCS1vmfz literal 17 VcmZQRqC96!Pv}!G1~6b01OPRw1XTb4 diff --git a/.gradle/8.10.2/checksums/md5-checksums.bin b/.gradle/8.10.2/checksums/md5-checksums.bin index 32df44c35b203e230e5b872de0de38e233f85e28..27911fe84e4c3c717547f5fa31e66bd28dad4cbf 100644 GIT binary patch delta 176 zcmdnFg>mjy#tkMCjB%SyB^;OpPHed~?Fy&G0|qdNvfP|2mB1!Iqn{oU~QC8lfJs{>bWvE)=!f$G=`(ZO>UqyqpN#WBPH delta 41 zcmV+^0M`GVwE?-b0kAX}0bH{+7(fEEjT%@5v;7|v0RgeGA@~=uFlZ06K}h%!JgyHX diff --git a/.gradle/8.10.2/checksums/sha1-checksums.bin b/.gradle/8.10.2/checksums/sha1-checksums.bin index 681e6befffb8801436a93b89757272c0a6d4ff90..017772f2d476b8c5cfe8a51e979c858ba0e7585c 100644 GIT binary patch literal 39989 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]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 delta 426 zcmXZYF-#h96vuHisV>HJG57u|P?UozocBNBz!qrIK{*CS+^8-%cQNhK(a~t~jXF7M z;$Tu@Xu5Qyo8!4Oj=FWE=|bxpe90$o`v2eWy}|d%vtJWmOEQ`06H36TIE=KvGY(@D zur=Q#o)_8+mV?EJ@uH=hJmy8p(oXGip9;vOkGM@6{-u55SC(GJ@H6AkSh5V3gt7Mh zWy|knA(=JoWrfr15gk`Ja9cdOKHXeIoD;&l(91^*^M*h9CY{%ob9J#|xLdKLR(*P_ z!cdJ=qad6Y437n$&7yFq;-X>76DnSlp{M_NmhCl%!J5VM4Ig}mLtkfE;fuOf_tr2Q z?C=nLW`A9{SZ^^^`ou{|=#+)qvhG*boT24M7}2iiTXkKrxK+JP)$pzA@K6=H8=6DK z8xi3f&8kMK@m3h9xtg$9YjIg?lC0}(>y}|X!fnXR|L001US9Pxf1SSlIDPXz+IF7+ DHu|3c diff --git a/.gradle/8.10.2/executionHistory/executionHistory.lock b/.gradle/8.10.2/executionHistory/executionHistory.lock index 68f7b59a53a585010b07dec5c22288bd0fa9288f..33951f484dbf7ca6d32d1ee4c8c2a6faa70cb253 100644 GIT binary patch literal 17 UcmZR+@n{9Fjq|Er1_)3D05(PhN&o-= literal 17 TcmZR+@n{9Fjq|Er1}FdkHYEfp diff --git a/.gradle/8.10.2/fileHashes/fileHashes.bin b/.gradle/8.10.2/fileHashes/fileHashes.bin index 93a17fa28c1d820f2a892e28d766618e6538cbb7..6d960d2c6fffd32233b09fd88e5f25fc83acea65 100644 GIT binary patch literal 26347 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 vf##`7PJX5;K3P{ya&nxS_~fN(5k From 4060d29416a77739145836f6b823576f7c9b2998 Mon Sep 17 00:00:00 2001 From: natthanicha Date: Mon, 31 Mar 2025 13:00:31 +0200 Subject: [PATCH 06/83] chore(test): testing --- app/test.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 app/test.txt diff --git a/app/test.txt b/app/test.txt new file mode 100644 index 0000000..e69de29 From 44dab2db526466605e6e650ceb9ebba6b073e444 Mon Sep 17 00:00:00 2001 From: tienquocbui Date: Mon, 31 Mar 2025 13:37:51 +0200 Subject: [PATCH 07/83] test(profile): add TestFile.java for test commit --- .gradle/8.10.2/checksums/checksums.lock | Bin 17 -> 17 bytes .gradle/8.10.2/checksums/md5-checksums.bin | Bin 23197 -> 26297 bytes .gradle/8.10.2/checksums/sha1-checksums.bin | Bin 39989 -> 75029 bytes .gradle/8.10.2/fileHashes/fileHashes.bin | Bin 26347 -> 27297 bytes .gradle/8.10.2/fileHashes/fileHashes.lock | Bin 17 -> 17 bytes .gradle/file-system.probe | Bin 8 -> 8 bytes .../pineapple/capture/profile/TestFile.java | 5 +++++ 7 files changed, 5 insertions(+) create mode 100644 app/src/main/java/com/pineapple/capture/profile/TestFile.java diff --git a/.gradle/8.10.2/checksums/checksums.lock b/.gradle/8.10.2/checksums/checksums.lock index 526040c200fd2b6b1864f45992e4384a37e90083..7afeec11a137c71e8c5639c2c4fc0c69e50080dc 100644 GIT binary patch literal 17 VcmZQRqC96!Pv}!G1~6dy4gfZj1v~%% literal 17 VcmZQRqC96!Pv}!G1~6d!0suCS1vmfz diff --git a/.gradle/8.10.2/checksums/md5-checksums.bin b/.gradle/8.10.2/checksums/md5-checksums.bin index 27911fe84e4c3c717547f5fa31e66bd28dad4cbf..2b7674fb88dae44b63a5fd86e98af925f514150c 100644 GIT binary patch delta 2251 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 delta 527 zcmXYtJxo(k0EJ(PG8n};(B22_qlHohD(}8xs}(3g&^`uT3~tzVA#q^TRtGlXL>0fZ zi34s_I!J12mBpV$1{2+iok&b9H6|Dnq_}`y6HoHx3}-keC->nMN z)--us(;QjCqDWH+0=mhZZt+PMI6G{z9SJ<0Q{+2s+T4Pe+hkdJ-L2#FJm9rQu%qx8 zI@gR0TZSai6=$JK((b)W!E3VPwTSpkp80f|z65jKf{Nmx+h(Rmr_ke~s=U>|%7)*? zoC31A-?5Nt{8!m7q-_n8Y|+ zqixV+dQh@Fm|@0Dv1tknnItbw_M}D3O7qcDBSR^&A(LuI6%7fofB(zlS1;D@{rgAL zmPY^l7rCz~+UhPw>ym|fk(=9s>~@mY#zWQ`l4e6?-%_j%se+*lm2)X(zpGKnTZuK##Y%H ztMPI_!R6l;*>SaayvF-Wf;~m=geshv!a12JuS}L4tQ-oehmSDhCU@e3f?_j%tED&f N+*dkQ9=Cs8{|gI`*9HIp diff --git a/.gradle/8.10.2/fileHashes/fileHashes.bin b/.gradle/8.10.2/fileHashes/fileHashes.bin index 6d960d2c6fffd32233b09fd88e5f25fc83acea65..4001f042e73e9317fff8ad8c65cb4d6cbea58eff 100644 GIT binary patch delta 617 zcmaETmT}=##tkMCk{cRQn8nTBpMAps23h(4po&nV@2uC;LhU2rRJGXHak1dmkd0DY$v6WCOFn zv(UR)ZAW50K}6GDPv(^k5O~ccd??Mz?;}*H^X5=l1114Z@92jKTdblWq8V!^*UD!I z2p!qDhdXZVTZmwK_oSsy-(STJ6_uSFt7svhIlcA|M^wxfsDAOuy^0M2 zdWZD)Fq9o_h6;L4W>uQWZ_@F>dh-=0h**~GIWOIE}mx3y+o*b&IAmDW; zYAMSuJvWG8=JLt8${7M7Q4_0m6PNyj3YKm@tDMNhzjo5EpOU7zP&2tFtEy!PR6dy7 zlWeUi4G~O#I=NL%k$>XBjo$ZVmqK;loIF=8ib-JNM#UfE8x1T)lACnWlk+{)!FJDtx`EqYpLq+*+R3*5 T`utn{AA;;;oSXUxNa+CpmKMuV delta 107 zcmV-x0F?is)dB0x0kAX}0iBag7)XfJ(C{Y3q$+02$ N7qKu<39~^+svgs~DFpxk diff --git a/.gradle/8.10.2/fileHashes/fileHashes.lock b/.gradle/8.10.2/fileHashes/fileHashes.lock index 266846e4d8ec1da96cc90ad40b5b7def0bed80a7..540b0fc9e7085193977ca52667113990a79d52fc 100644 GIT binary patch literal 17 TcmZP;WYX;aWzFNl00D;p9MS_8 literal 17 TcmZP;WYX;aWzFNl00FB29J&Jj diff --git a/.gradle/file-system.probe b/.gradle/file-system.probe index 4096145b307c76d65639f0f9cfc1b4b40cab970a..23f87c672e8cd445f84967d2297aa7993a0e66e4 100644 GIT binary patch literal 8 PcmZQzV4V8;mn0Ve3C#kZ literal 8 PcmZQzV4V7TLt8Nb3NiyL diff --git a/app/src/main/java/com/pineapple/capture/profile/TestFile.java b/app/src/main/java/com/pineapple/capture/profile/TestFile.java new file mode 100644 index 0000000..fc6f16c --- /dev/null +++ b/app/src/main/java/com/pineapple/capture/profile/TestFile.java @@ -0,0 +1,5 @@ +package com.pineapple.capture.profile; + +public class TestFile { +// hmm +} From 14c6ff2ed19b5d77161f1d9026fff21875babd7c Mon Sep 17 00:00:00 2001 From: Phuong Khanh Pham Date: Mon, 31 Mar 2025 13:56:22 +0200 Subject: [PATCH 08/83] delete tracked ggradle --- .gradle/8.10.2/checksums/checksums.lock | Bin 17 -> 0 bytes .gradle/8.10.2/checksums/md5-checksums.bin | Bin 23197 -> 0 bytes .gradle/8.10.2/checksums/sha1-checksums.bin | Bin 39989 -> 0 bytes ...rariesForLibs$AndroidPluginAccessors.class | Bin 920 -> 0 bytes ...ibs$AndroidxEspressoLibraryAccessors.class | Bin 932 -> 0 bytes ...riesForLibs$AndroidxLibraryAccessors.class | Bin 1702 -> 0 bytes .../dm/LibrariesForLibs$BundleAccessors.class | Bin 765 -> 0 bytes .../dm/LibrariesForLibs$PluginAccessors.class | Bin 1118 -> 0 bytes .../LibrariesForLibs$VersionAccessors.class | Bin 1449 -> 0 bytes .../accessors/dm/LibrariesForLibs.class | Bin 3662 -> 0 bytes ...nPluginsBlock$AndroidPluginAccessors.class | Bin 962 -> 0 bytes ...ock$AndroidxEspressoLibraryAccessors.class | Bin 2232 -> 0 bytes ...luginsBlock$AndroidxLibraryAccessors.class | Bin 3248 -> 0 bytes ...orLibsInPluginsBlock$BundleAccessors.class | Bin 891 -> 0 bytes ...orLibsInPluginsBlock$PluginAccessors.class | Bin 1202 -> 0 bytes ...rLibsInPluginsBlock$VersionAccessors.class | Bin 1491 -> 0 bytes .../dm/LibrariesForLibsInPluginsBlock.class | Bin 5251 -> 0 bytes .../metadata.bin | 1 - .../gradle/accessors/dm/LibrariesForLibs.java | 273 --------------- .../dm/LibrariesForLibsInPluginsBlock.java | 325 ------------------ .../dependencies-accessors/gc.properties | 0 .../executionHistory/executionHistory.lock | Bin 17 -> 0 bytes .gradle/8.10.2/fileChanges/last-build.bin | Bin 1 -> 0 bytes .gradle/8.10.2/fileHashes/fileHashes.bin | Bin 26347 -> 0 bytes .gradle/8.10.2/fileHashes/fileHashes.lock | Bin 17 -> 0 bytes .gradle/8.10.2/gc.properties | 0 .../buildOutputCleanup.lock | Bin 17 -> 0 bytes .gradle/buildOutputCleanup/cache.properties | 2 - .gradle/file-system.probe | Bin 8 -> 0 bytes .gradle/vcs-1/gc.properties | 0 30 files changed, 601 deletions(-) delete mode 100644 .gradle/8.10.2/checksums/checksums.lock delete mode 100644 .gradle/8.10.2/checksums/md5-checksums.bin delete mode 100644 .gradle/8.10.2/checksums/sha1-checksums.bin delete mode 100644 .gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/classes/org/gradle/accessors/dm/LibrariesForLibs$AndroidPluginAccessors.class delete mode 100644 .gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/classes/org/gradle/accessors/dm/LibrariesForLibs$AndroidxEspressoLibraryAccessors.class delete mode 100644 .gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/classes/org/gradle/accessors/dm/LibrariesForLibs$AndroidxLibraryAccessors.class delete mode 100644 .gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/classes/org/gradle/accessors/dm/LibrariesForLibs$BundleAccessors.class delete mode 100644 .gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/classes/org/gradle/accessors/dm/LibrariesForLibs$PluginAccessors.class delete mode 100644 .gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/classes/org/gradle/accessors/dm/LibrariesForLibs$VersionAccessors.class delete mode 100644 .gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/classes/org/gradle/accessors/dm/LibrariesForLibs.class delete mode 100644 .gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/classes/org/gradle/accessors/dm/LibrariesForLibsInPluginsBlock$AndroidPluginAccessors.class delete mode 100644 .gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/classes/org/gradle/accessors/dm/LibrariesForLibsInPluginsBlock$AndroidxEspressoLibraryAccessors.class delete mode 100644 .gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/classes/org/gradle/accessors/dm/LibrariesForLibsInPluginsBlock$AndroidxLibraryAccessors.class delete mode 100644 .gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/classes/org/gradle/accessors/dm/LibrariesForLibsInPluginsBlock$BundleAccessors.class delete mode 100644 .gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/classes/org/gradle/accessors/dm/LibrariesForLibsInPluginsBlock$PluginAccessors.class delete mode 100644 .gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/classes/org/gradle/accessors/dm/LibrariesForLibsInPluginsBlock$VersionAccessors.class delete mode 100644 .gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/classes/org/gradle/accessors/dm/LibrariesForLibsInPluginsBlock.class delete mode 100644 .gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/metadata.bin delete mode 100644 .gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/sources/org/gradle/accessors/dm/LibrariesForLibs.java delete mode 100644 .gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/sources/org/gradle/accessors/dm/LibrariesForLibsInPluginsBlock.java delete mode 100644 .gradle/8.10.2/dependencies-accessors/gc.properties delete mode 100644 .gradle/8.10.2/executionHistory/executionHistory.lock delete mode 100644 .gradle/8.10.2/fileChanges/last-build.bin delete mode 100644 .gradle/8.10.2/fileHashes/fileHashes.bin delete mode 100644 .gradle/8.10.2/fileHashes/fileHashes.lock delete mode 100644 .gradle/8.10.2/gc.properties delete mode 100644 .gradle/buildOutputCleanup/buildOutputCleanup.lock delete mode 100644 .gradle/buildOutputCleanup/cache.properties delete mode 100644 .gradle/file-system.probe delete mode 100644 .gradle/vcs-1/gc.properties diff --git a/.gradle/8.10.2/checksums/checksums.lock b/.gradle/8.10.2/checksums/checksums.lock deleted file mode 100644 index 526040c200fd2b6b1864f45992e4384a37e90083..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17 VcmZQRqC96!Pv}!G1~6d!0suCS1vmfz diff --git a/.gradle/8.10.2/checksums/md5-checksums.bin b/.gradle/8.10.2/checksums/md5-checksums.bin deleted file mode 100644 index 27911fe84e4c3c717547f5fa31e66bd28dad4cbf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23197 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 X=eJ@VE*C8mQdEG(KfsvQjvN02>$zfx diff --git a/.gradle/8.10.2/checksums/sha1-checksums.bin b/.gradle/8.10.2/checksums/sha1-checksums.bin deleted file mode 100644 index 017772f2d476b8c5cfe8a51e979c858ba0e7585c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39989 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]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 diff --git a/.gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/classes/org/gradle/accessors/dm/LibrariesForLibs$AndroidPluginAccessors.class b/.gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/classes/org/gradle/accessors/dm/LibrariesForLibs$AndroidPluginAccessors.class deleted file mode 100644 index 6715f29f30539ca79fe4f89645482290fd6b2b30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmbVLO>5gg5Pj=>D0c0nNt*P#q2Pm)mh7eUqL3n-8VV*2xa7W;rece-D|V&O{HylT zLJ$1`{ZXZ($RS3_Arzs}?C8z#X5Q?dzrTJ1c!L)mw6G9hv5O@v3w*RLm8nxnMpETk zYEzIiDwDA)RAy5dO?}~1T)h8U|2U$YOhP8U7;)6Pi~dPgrrOL-0?P;5=;BZy9*i5s zb7#+WLQbB{oLN%X1m0kAM4wfe6{qC9wq{s!3wKXfup+RjOyaCg_Enx|nu#-{gAVQm z=yuV=s=&K>CUH#OTjynRCdYc}l+)x#*0JyVQC+KUD!PISbYn-VpgJz_b};^;&XvrR zN#&$)+N9xbvyB`5h60O2n~=cTSQ|Pn&!*%)scFWM)s%|px&eXy;7$eG6P+4Wl#Xj0 z-y!8-o@IWioh&`cy0dF}!$W4&=ys}b;MJ{Uu8m?`hc2Y4(H&5!%P zwo0H^6Pm3^fM)`O`Lb8i+@_+y_U$_2CGSOxZvxng>I$%3wtKG*w_CKZ& B4yXVC diff --git a/.gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/classes/org/gradle/accessors/dm/LibrariesForLibs$AndroidxEspressoLibraryAccessors.class b/.gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/classes/org/gradle/accessors/dm/LibrariesForLibs$AndroidxEspressoLibraryAccessors.class deleted file mode 100644 index 5219695510b0d1f7cd0252b955a55be8d5b43506..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 932 zcmbtT&2AGh5dIuOwh4jK(w6@MQVwY=#TUdSRi!92Ql%6j1@(+~*Q|^-b~N@@%`>_h(aYQICwlWo^L#!Z~Wuux9&n^yL>WQ|gw#jtBUPsf`sEGe?3e@(EHQ_*D&>sHx z9o?Oi6|4wsDVvfr=~+kn32EgLD_7Uz2^cK7SPZK4uaoJ2o zcqGtX%s!{-GHwN){*7HcM;T{Zie+sAf-m<@=kB?4&fJ;l&tKnu0C(|7}ED$Vfhpp zt}joy2bL+7{_@!17}p82Cov4y2@8(v&=xJX86+@I80k4yGJyrc=!t8;$%RIUmt2!s zj8!a0zGyaTQtgVG&7O2!2E{IOLN<2}QiNpHsyiZRD!$>(IUpNRr9uVPTW%3w-{DSZ z2)o-sJFeNZ<)4-*Y!(QUOtKV_PSD!kkV1m3XC0x#Y=zPLV_mgN3W0C7R z#&eR3K5RR-hS=so$!msxts~w(pU$rwf%4y>y~=+^@(5#JF#f3xT;z2W1HA4ra2Hd& z6K>%)12gPh;GKBa@)J{EarGmc#Bn>3fY->f9m5^=-t7mP>jScSKui5VH~N759#F0y z=w=_#`yS9T@=P+rbmw^wH4Sny#-oZpu$q;&rhB;0`y3}HhE+U>Cwa)N;Ss_)x5ocX F$=^0B-LL=v diff --git a/.gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/classes/org/gradle/accessors/dm/LibrariesForLibs$BundleAccessors.class b/.gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/classes/org/gradle/accessors/dm/LibrariesForLibs$BundleAccessors.class deleted file mode 100644 index c4caf0bb5478b76f9a0719b435c344001acb20dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 765 zcmbVKO>Yx15Pc45mWGrm>l47Nwk^GQ?ZEFWg68g$=>MhYIfS@39G=-`sB$e?%ZJ3 t>9glAcH6rfpJ6`zLUnbWp@8qoyrZ^-9=6o(sMo?>+*5@N_wfLmKLOUu@N@tG diff --git a/.gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/classes/org/gradle/accessors/dm/LibrariesForLibs$PluginAccessors.class b/.gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/classes/org/gradle/accessors/dm/LibrariesForLibs$PluginAccessors.class deleted file mode 100644 index 17b0402efd8cd25cbe4c1cd5d847001f1af6aa88..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1118 zcmbVLU279T6g`u)U3c9!TH9))QCp*=QQQ|nF`|UjfDp7$Dfl?qoh~EWnJ}{{_FpL| z1qFYAKS=siyxVLf*{ak&%-lOO_nvdV=Ew2Z?*Ja*o`(|34rYAJVvgaBHgOOe9wj2+ z0~tt_3Zr-uggoVmj)QjJriO><%MYW6O)(HE5-L3C(ycZJ^{r$WOO>A(=AKC<)8`Cf zqgMbQ7`-neVS=q($(>q7!&6agid{ZT(j8%})T%Rzt+lb^-~z*oNt!Se)@oyeXfNo= zzTrj++tr42TW_n#Xc>(nZjVh}c(~}m_c4zJh9_r+E8sA=;|wjsMlq@J+o|j`{!2bC zW09&CYPBn4hQ~$sGuFg|gK~zr>|+I28EOL_hE#w*=g!ccA{y7^Kg!o)nCa+9FjRU{ ziPyuuzA$fjKcO2h7HLk*&}mH9LbY+IWTx{{f_k5o-_^*@_rju}Mg>`V7 z(wyw-xdxqKernVm++k=;!u~5EhLyi{pi-D4tWo<)^j#SivmTOGBAxy#?bqn^l=L#m zYV-bsL$KyIIPaRD;nJ!c;>s5+eLC@8rG4SV@`!wYViiY(P{s8er$&;I%`7=Cef;f` h(E!IpdV^#MHQXdwC7=>+QE)De*gEPYJ(73f{sJumP5=M^ diff --git a/.gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/classes/org/gradle/accessors/dm/LibrariesForLibs$VersionAccessors.class b/.gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/classes/org/gradle/accessors/dm/LibrariesForLibs$VersionAccessors.class deleted file mode 100644 index f351234066a7c7fbf084aa1a0c01508029654a8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1449 zcmbW0OK%e~5Xb*c+w3L{ZD}cQD31c^gDx*2P^wB%+DJtKRVwP;*_f59jlJ@2D*9PC za|SLTIB?;H#F;Z^z5`-5*;GsFLxmza&I^rT9JQ9Sf~p72lyUcDVBhWp9Z>%qaMh=l40ViOggAk za0*ilPxG05U&OICvDfK(E!j5QND()+Av+$HUmpfBlmjtL#PGP<+UEz{3%Lrs-NZ;0 z)RsoeJ*KPXVuqo_qsZ6Yh$k*)8D@N~(#IrmAwSeT@}6NB_q7o&&N5U)9GSGzM&EOu zVPd~WPwC6TRDMX%cy<|S{3kg zRlF+$#gm>P_Q?s5_2ZATQKMqhv_tI-bF^)YXlHQx-ZaxRSz9^nq>Vh!QtgAozL{xf zn54t!N7~D~x@UaRl&RkN(e|#T&7*?0l@g{A@;DZ;gEfYFen9?f@ENB59eoG)8LIhv zhcjgxJer3LKN>w;ry(xTcM6n1-A9quE3{j{82tced1dtz*atEhuF{$Y0B>krz%@b# z!G*rpS)O%1qV#?w_$_4th2Ef`n>J|L0=>&Yi#F)A1^S$WZrPwY3-m1q-L^sV7U)L~ zx?_XRS)iXesA_{QSfF1yXvqd$vOvF&paPcrkH3Od`k$pX6mSN38agqC={eEU{N4_tRl9wNueQtrUJ!M(faIUGsNL+c5`NT5k83D zL(dU8r=H^n@I!gLlNT@~ka+wf+?|>GzQ4J5`1_wXe*u`oZUUEZIgTz1-H0({d{wlI ziWgjA^Rl$17YgNZ*LHZwUB75&@a))9L>_Xt$SzhLO>B{h6!w-2#!EACB2$h=I?nMuJ<49Pz z0*hh#WKJAM1c9$eN6B83dBv3!!K$z5J7DPcfA)l8$eIah#L#wGQgOUxl=nQ_lNqm| zd|BA9I(3k#Gbhl8ehrpu467H{_d>YT^7FQZcQD8>=5oiO_*t&{h;q=`+w@#)o)n}SvzU}%fMIQC5 zQ{_ooxP!Y4alg_Fs5p~myv=%ruFHK3Ha=vycHAFoy?|lSRMIHXG4pxNMC+fm@G<5X zhMg8IgW+jwGwn5<1g7vnL*ikxF5E0~)8hXP8&iLWiEAz1UP7v15$#Ag5kmR+AiPYw#&Vuy+y;(E2b{)X{7cULr;lRD9K%ht}IPqhO2AR z6B|(}FVsstS{X)OL|!OMVp|4M&sxu`jY_(ngB8>J^x)95+s;)8m8z#G!e`oJy1~sgF4e3XO6YDkKZxTehFquG_g8|l(vL_JHw@$T@LRE9g4)0(`bVG}1Nw1FUjzCb zR-rWCE0j8Bg;HB08V9uy#7OFMTKz)uF`^=Q=kC3cu95B|uw?QO@#LTAdzJhh@grP4 z!~iXa^m3SfH;yoVh}*O^rMG74+eGit@1rApa)^04PM?riIK<*_WQbvn{@x-tfN^qp z82uQ*7`?@2F^Vs60|g3dolaxKyHSyNj?J38V?-J4#ghZsKd|y^eC zur8Xco4AbcDxrSg$kh+D{*ivOl#D(q>udDVyRrwI=oHaB(KJzqXo2Vs(IQca-hTn4 Cm|`*j diff --git a/.gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/classes/org/gradle/accessors/dm/LibrariesForLibsInPluginsBlock$AndroidPluginAccessors.class b/.gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/classes/org/gradle/accessors/dm/LibrariesForLibsInPluginsBlock$AndroidPluginAccessors.class deleted file mode 100644 index b62b535886f1b8009fa6c3ef9870cfdc7a91c837..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 962 zcmbVL-)j>=5dJo;y(XruwpxE%#5|-b-4_ugrEsPO3b7U-!G?&+)K@2IeBnw{Zmv0&ktqWad?BNUB^* zZ42^N8JVa;8JEd;915?J;`OKc$1de$Q?kj)fTPZzbPi0JX*)RyENpA5iyeWaJDe$= zdv~l;^73HfOpAfmVaY#OBXZtm`-sa&V76sOnO}*3UmdbOZnK(mQXyIyv zb{k7r7I-twBuOX)=Yvd-yd8l~_fiF$ zBb`}Ql%8wsUm|6Dnq_{fq$~r;y0de!dppdwHFBj-XrL>GkN-Zpt!f}Vs6A`R_l*jH zLWDa4@w62GwQ&MVHNDCDM7YlqOqV?q>fZ_rtp8bKJmL*%@SOo$QC$|cD}36(96vzx zWSZKBGCkGmdeFuUft@td%NsBiS+BNMT)V+)kn>0qZ_6y6g6Zu~I8{n1OYr za^pSW_M#+|%DSCM`;X=-sNh8h)hb@X%M8~GF&<(Nh@KJThP-){V%}fZVJHkkEuR-l zVvqNwPRQ74tUu&^?nPXM-d1cV*5-5(fs?#%P=Y)ZONopEVe0w0M`tw0ah_puQ$_o3 zVnv>B21K4?2E<7K)bNUfi&eae35MqyB17e|jQ3hWU;2V!^Z8=Zte}S1sbU^mBm zcX$iC8Ph7bg0~#FRlJRN7`{CP(f&q-V`5^MOu^pnrDZHu6B&pt;isf!xY}5I79Ecm zy4iV1Ynu-03}2ryH0>u{q2jDwDwx81Ra`}b!BITiwrRzTHqt_#pjhnJJum*YHq^Ik>drxNFQv6zZw;NV41FIg z-#-u!azX0k8^L3u=8co6nTlf1=suxpygS2AlcBV%1KNLXomlZr((MRyk9Q)nIH8D_ zDHn$NUm19ur%KK<5ipduWT<$Yr2D`75BnF2b(@~RO)MXfGFxwh1h~tiT(~!MkVJyc z8p?O`CS`HyZlYr1_KviYqHigs5AKgJnkX>mC`8&+*&?O$MO&unPW}5`%%xOgsIDm` z%yPu771jYg3$5ba{;!9J;o`HN9tSOk`GWV;2`Fr_mJ}r}nX#Yd?bhKs|;J(=oLGneY+)11M!{7crVy z>ow;mlxyb(xbPIU0VdCn*WMW5@>5I=@a{})dVp)+A9_mvJOIDqGJeA+)B|qNcLbl} zGiuXw=BX{=^UT^Dt|`tf(98_QJc2K9t5hZ-U&Ip16#F8Ushy(sHnp=@!79ps0y}la AfdBvi diff --git a/.gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/classes/org/gradle/accessors/dm/LibrariesForLibsInPluginsBlock$AndroidxLibraryAccessors.class b/.gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/classes/org/gradle/accessors/dm/LibrariesForLibsInPluginsBlock$AndroidxLibraryAccessors.class deleted file mode 100644 index d42a79f30a1e02d6786223983c9d27048caeb610..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3248 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 diff --git a/.gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/classes/org/gradle/accessors/dm/LibrariesForLibsInPluginsBlock.class b/.gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/classes/org/gradle/accessors/dm/LibrariesForLibsInPluginsBlock.class deleted file mode 100644 index 11a86ad22ea3f6d692b4ecf656067375c3bd6251..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5251 zcmb_g`BxKH6#kw9fjCx8D@xs>(u%00TI=VIZ>kL%6fOyL|V1_uj|9|NZq3faCZzj&)ccL!E|tGzfIr zPCk`)^qeVEdeKN3mM0xcH&a>N(@i^{>dLsDqi4MfQ^AY#vM8;bw6fE^d}=$>0u7yp zWq4p|!7_*zoxn`7);iHK7qrF~l`&fF^LF8k1~Rx~}a|MO1HDzL}Yvsq$O%e=tVdB}urEsbr>h=|iRfxcDZRAzMrA4P-~4bNkTKvT$RSK#10 zx4G-WcMJHgH0;u_8+*9TvbHs0Tjpv`xxNUTjVh_6Z|>tK6)2_un1+{eTwr^)Mi~+~SKG|;3RxTna6-}L zM2vV@~IJy2v$BluR<@SeTXex&&zJ#FgdfdhIZ#{ z5Q;%=$jg>Fo%CH9#_K8|!Wc_HECs+YF2`_1!&O`psHWMPT@;8vFuc26xk)1{IVn6{ zOww@-9xRtw*JNFILFXn*ky6JBXDVruGv|?Agy40jbj`c4O!&a@hm+*%3)SuecQpY zMoe%Rz2|etkF$c@)nMSBnnxU|dnC(=rO2WV77Ka-6JrWA7O288bY9l=aF`d^G{~$C z`-O~juB!=Mpyirxc}(Y+;TmdWx2*ES&5pda1lAPKE$Rr6>Msda=f=GB29(Ea+Vg3( zxHIH`NFGT5nnsMgrF*_Z^LLi9zO#BWDhqn0r3~?KRM5@v{4`|ed{fd^`4p8tqk2hI z%IDnRiwz88sDhBX3x{EWk%(U_=ro~{=s;h#Se~p1@1@n-STLRuV)`F6IjSC5z3OPA z3^WJ*XKk7T9hI(0JmMp45?R@6C?@U?0IPLm>rlH?U`Lb;!?rc-n`T$hphB(R;;F93 z)LmE7+3mG*A+R|LAvZ@PbUul=9K+WFr&nDU*dr?htm={5YF4r>r8m`uB!(XZhN?W^ zpt0OTZ+I|^1jQXvhAHwQhMxs)tj*Tc1($;YPvz0wAdn1`Q|lA#WkFoW|E$y_p-%g} zN~ptYN%G)Rk{lOHl5-bj3@oN-;Hm=ee&hNEO4)ws@R63fmik8!?d>y&wf~Kcx7r^f z_6VD1kl<~zy4}v-&PPbjU_T!nP>&9Vk13Dvck~fnnZYT(?yOpIW(H^fpdkT^e|OUj zAW4_EV>4Q?hlkW-*ulYKCvptR=Gz8-TP&@38xHD9?w-SXJ_TA6J%8dt;?gXJ9%FbG zBbyr&H)e6`F~(=1w%a zI-h7~3e${3!GES4&%P(e^AL$>G`+OaSGE$O6-4n4-eoLG`z}g_Rz0(_e@=k{795BK z-oyJVb>!5Xo&eUHG;?cFM?S!Zv=MdW?3{wYkvnwZBRaGWA6N463GYAUZvajFA5SAb rqim-9obmwW7nGfpUs4X^D||zFoAO)Aamw!~zvufODSx8;1x^10h1Gw< diff --git a/.gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/metadata.bin b/.gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/metadata.bin deleted file mode 100644 index a2fbd1d..0000000 --- a/.gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/metadata.bin +++ /dev/null @@ -1 +0,0 @@ -›obb6ye2mprgjphhpsvy2ytelmq67Oø³Ï·¦ç[š'TŸˆclassesŒþJ˜Ú h*¥={ž•+ˆsources Pÿlý ím¹%Ò¶º;å \ No newline at end of file diff --git a/.gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/sources/org/gradle/accessors/dm/LibrariesForLibs.java b/.gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/sources/org/gradle/accessors/dm/LibrariesForLibs.java deleted file mode 100644 index 711b517..0000000 --- a/.gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/sources/org/gradle/accessors/dm/LibrariesForLibs.java +++ /dev/null @@ -1,273 +0,0 @@ -package org.gradle.accessors.dm; - -import org.gradle.api.NonNullApi; -import org.gradle.api.artifacts.MinimalExternalModuleDependency; -import org.gradle.plugin.use.PluginDependency; -import org.gradle.api.artifacts.ExternalModuleDependencyBundle; -import org.gradle.api.artifacts.MutableVersionConstraint; -import org.gradle.api.provider.Provider; -import org.gradle.api.model.ObjectFactory; -import org.gradle.api.provider.ProviderFactory; -import org.gradle.api.internal.catalog.AbstractExternalDependencyFactory; -import org.gradle.api.internal.catalog.DefaultVersionCatalog; -import java.util.Map; -import org.gradle.api.internal.attributes.ImmutableAttributesFactory; -import org.gradle.api.internal.artifacts.dsl.CapabilityNotationParser; -import javax.inject.Inject; - -/** - * A catalog of dependencies accessible via the {@code libs} extension. - */ -@NonNullApi -public class LibrariesForLibs extends AbstractExternalDependencyFactory { - - private final AbstractExternalDependencyFactory owner = this; - private final AndroidxLibraryAccessors laccForAndroidxLibraryAccessors = new AndroidxLibraryAccessors(owner); - private final VersionAccessors vaccForVersionAccessors = new VersionAccessors(providers, config); - private final BundleAccessors baccForBundleAccessors = new BundleAccessors(objects, providers, config, attributesFactory, capabilityNotationParser); - private final PluginAccessors paccForPluginAccessors = new PluginAccessors(providers, config); - - @Inject - public LibrariesForLibs(DefaultVersionCatalog config, ProviderFactory providers, ObjectFactory objects, ImmutableAttributesFactory attributesFactory, CapabilityNotationParser capabilityNotationParser) { - super(config, providers, objects, attributesFactory, capabilityNotationParser); - } - - /** - * Dependency provider for junit with junit:junit coordinates and - * with version reference junit - *

- * This dependency was declared in catalog libs.versions.toml - */ - public Provider getJunit() { - return create("junit"); - } - - /** - * Dependency provider for material with com.google.android.material:material coordinates and - * with version reference material - *

- * This dependency was declared in catalog libs.versions.toml - */ - public Provider getMaterial() { - return create("material"); - } - - /** - * Group of libraries at androidx - */ - public AndroidxLibraryAccessors getAndroidx() { - return laccForAndroidxLibraryAccessors; - } - - /** - * Group of versions at versions - */ - public VersionAccessors getVersions() { - return vaccForVersionAccessors; - } - - /** - * Group of bundles at bundles - */ - public BundleAccessors getBundles() { - return baccForBundleAccessors; - } - - /** - * Group of plugins at plugins - */ - public PluginAccessors getPlugins() { - return paccForPluginAccessors; - } - - public static class AndroidxLibraryAccessors extends SubDependencyFactory { - private final AndroidxEspressoLibraryAccessors laccForAndroidxEspressoLibraryAccessors = new AndroidxEspressoLibraryAccessors(owner); - - public AndroidxLibraryAccessors(AbstractExternalDependencyFactory owner) { super(owner); } - - /** - * Dependency provider for appcompat with androidx.appcompat:appcompat coordinates and - * with version reference appcompat - *

- * This dependency was declared in catalog libs.versions.toml - */ - public Provider getAppcompat() { - return create("androidx.appcompat"); - } - - /** - * Dependency provider for constraintlayout with androidx.constraintlayout:constraintlayout coordinates and - * with version reference constraintlayout - *

- * This dependency was declared in catalog libs.versions.toml - */ - public Provider getConstraintlayout() { - return create("androidx.constraintlayout"); - } - - /** - * Dependency provider for core with androidx.core:core coordinates and - * with version reference core - *

- * This dependency was declared in catalog libs.versions.toml - */ - public Provider getCore() { - return create("androidx.core"); - } - - /** - * Dependency provider for junit with androidx.test.ext:junit coordinates and - * with version reference junitVersion - *

- * This dependency was declared in catalog libs.versions.toml - */ - public Provider getJunit() { - return create("androidx.junit"); - } - - /** - * Group of libraries at androidx.espresso - */ - public AndroidxEspressoLibraryAccessors getEspresso() { - return laccForAndroidxEspressoLibraryAccessors; - } - - } - - public static class AndroidxEspressoLibraryAccessors extends SubDependencyFactory { - - public AndroidxEspressoLibraryAccessors(AbstractExternalDependencyFactory owner) { super(owner); } - - /** - * Dependency provider for core with androidx.test.espresso:espresso-core coordinates and - * with version reference espressoCore - *

- * This dependency was declared in catalog libs.versions.toml - */ - public Provider getCore() { - return create("androidx.espresso.core"); - } - - } - - public static class VersionAccessors extends VersionFactory { - - public VersionAccessors(ProviderFactory providers, DefaultVersionCatalog config) { super(providers, config); } - - /** - * Version alias agp with value 8.8.2 - *

- * If the version is a rich version and cannot be represented as a - * single version string, an empty string is returned. - *

- * This version was declared in catalog libs.versions.toml - */ - public Provider getAgp() { return getVersion("agp"); } - - /** - * Version alias appcompat with value 1.6.1 - *

- * If the version is a rich version and cannot be represented as a - * single version string, an empty string is returned. - *

- * This version was declared in catalog libs.versions.toml - */ - public Provider getAppcompat() { return getVersion("appcompat"); } - - /** - * Version alias constraintlayout with value 2.1.4 - *

- * If the version is a rich version and cannot be represented as a - * single version string, an empty string is returned. - *

- * This version was declared in catalog libs.versions.toml - */ - public Provider getConstraintlayout() { return getVersion("constraintlayout"); } - - /** - * Version alias core with value 1.12.0 - *

- * If the version is a rich version and cannot be represented as a - * single version string, an empty string is returned. - *

- * This version was declared in catalog libs.versions.toml - */ - public Provider getCore() { return getVersion("core"); } - - /** - * Version alias espressoCore with value 3.6.1 - *

- * If the version is a rich version and cannot be represented as a - * single version string, an empty string is returned. - *

- * This version was declared in catalog libs.versions.toml - */ - public Provider getEspressoCore() { return getVersion("espressoCore"); } - - /** - * Version alias junit with value 4.13.2 - *

- * If the version is a rich version and cannot be represented as a - * single version string, an empty string is returned. - *

- * This version was declared in catalog libs.versions.toml - */ - public Provider getJunit() { return getVersion("junit"); } - - /** - * Version alias junitVersion with value 1.2.1 - *

- * If the version is a rich version and cannot be represented as a - * single version string, an empty string is returned. - *

- * This version was declared in catalog libs.versions.toml - */ - public Provider getJunitVersion() { return getVersion("junitVersion"); } - - /** - * Version alias material with value 1.11.0 - *

- * If the version is a rich version and cannot be represented as a - * single version string, an empty string is returned. - *

- * This version was declared in catalog libs.versions.toml - */ - public Provider getMaterial() { return getVersion("material"); } - - } - - public static class BundleAccessors extends BundleFactory { - - public BundleAccessors(ObjectFactory objects, ProviderFactory providers, DefaultVersionCatalog config, ImmutableAttributesFactory attributesFactory, CapabilityNotationParser capabilityNotationParser) { super(objects, providers, config, attributesFactory, capabilityNotationParser); } - - } - - public static class PluginAccessors extends PluginFactory { - private final AndroidPluginAccessors paccForAndroidPluginAccessors = new AndroidPluginAccessors(providers, config); - - public PluginAccessors(ProviderFactory providers, DefaultVersionCatalog config) { super(providers, config); } - - /** - * Group of plugins at plugins.android - */ - public AndroidPluginAccessors getAndroid() { - return paccForAndroidPluginAccessors; - } - - } - - public static class AndroidPluginAccessors extends PluginFactory { - - public AndroidPluginAccessors(ProviderFactory providers, DefaultVersionCatalog config) { super(providers, config); } - - /** - * Plugin provider for android.application with plugin id com.android.application and - * with version reference agp - *

- * This plugin was declared in catalog libs.versions.toml - */ - public Provider getApplication() { return createPlugin("android.application"); } - - } - -} diff --git a/.gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/sources/org/gradle/accessors/dm/LibrariesForLibsInPluginsBlock.java b/.gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/sources/org/gradle/accessors/dm/LibrariesForLibsInPluginsBlock.java deleted file mode 100644 index 32ef50d..0000000 --- a/.gradle/8.10.2/dependencies-accessors/0fe5d5c85eb824cf9669a3c726c6414603295ffa/sources/org/gradle/accessors/dm/LibrariesForLibsInPluginsBlock.java +++ /dev/null @@ -1,325 +0,0 @@ -package org.gradle.accessors.dm; - -import org.gradle.api.NonNullApi; -import org.gradle.api.artifacts.MinimalExternalModuleDependency; -import org.gradle.plugin.use.PluginDependency; -import org.gradle.api.artifacts.ExternalModuleDependencyBundle; -import org.gradle.api.artifacts.MutableVersionConstraint; -import org.gradle.api.provider.Provider; -import org.gradle.api.model.ObjectFactory; -import org.gradle.api.provider.ProviderFactory; -import org.gradle.api.internal.catalog.AbstractExternalDependencyFactory; -import org.gradle.api.internal.catalog.DefaultVersionCatalog; -import java.util.Map; -import org.gradle.api.internal.attributes.ImmutableAttributesFactory; -import org.gradle.api.internal.artifacts.dsl.CapabilityNotationParser; -import javax.inject.Inject; - -/** - * A catalog of dependencies accessible via the {@code libs} extension. - */ -@NonNullApi -public class LibrariesForLibsInPluginsBlock extends AbstractExternalDependencyFactory { - - private final AbstractExternalDependencyFactory owner = this; - private final AndroidxLibraryAccessors laccForAndroidxLibraryAccessors = new AndroidxLibraryAccessors(owner); - private final VersionAccessors vaccForVersionAccessors = new VersionAccessors(providers, config); - private final BundleAccessors baccForBundleAccessors = new BundleAccessors(objects, providers, config, attributesFactory, capabilityNotationParser); - private final PluginAccessors paccForPluginAccessors = new PluginAccessors(providers, config); - - @Inject - public LibrariesForLibsInPluginsBlock(DefaultVersionCatalog config, ProviderFactory providers, ObjectFactory objects, ImmutableAttributesFactory attributesFactory, CapabilityNotationParser capabilityNotationParser) { - super(config, providers, objects, attributesFactory, capabilityNotationParser); - } - - /** - * Dependency provider for junit with junit:junit coordinates and - * with version reference junit - *

- * This dependency was declared in catalog libs.versions.toml - * - * @deprecated Will be removed in Gradle 9.0. - */ - @Deprecated - public Provider getJunit() { - org.gradle.internal.deprecation.DeprecationLogger.deprecateBehaviour("Accessing libraries or bundles from version catalogs in the plugins block.").withAdvice("Only use versions or plugins from catalogs in the plugins block.").willBeRemovedInGradle9().withUpgradeGuideSection(8, "kotlin_dsl_deprecated_catalogs_plugins_block").nagUser(); - return create("junit"); - } - - /** - * Dependency provider for material with com.google.android.material:material coordinates and - * with version reference material - *

- * This dependency was declared in catalog libs.versions.toml - * - * @deprecated Will be removed in Gradle 9.0. - */ - @Deprecated - public Provider getMaterial() { - org.gradle.internal.deprecation.DeprecationLogger.deprecateBehaviour("Accessing libraries or bundles from version catalogs in the plugins block.").withAdvice("Only use versions or plugins from catalogs in the plugins block.").willBeRemovedInGradle9().withUpgradeGuideSection(8, "kotlin_dsl_deprecated_catalogs_plugins_block").nagUser(); - return create("material"); - } - - /** - * Group of libraries at androidx - * - * @deprecated Will be removed in Gradle 9.0. - */ - @Deprecated - public AndroidxLibraryAccessors getAndroidx() { - org.gradle.internal.deprecation.DeprecationLogger.deprecateBehaviour("Accessing libraries or bundles from version catalogs in the plugins block.").withAdvice("Only use versions or plugins from catalogs in the plugins block.").willBeRemovedInGradle9().withUpgradeGuideSection(8, "kotlin_dsl_deprecated_catalogs_plugins_block").nagUser(); - return laccForAndroidxLibraryAccessors; - } - - /** - * Group of versions at versions - */ - public VersionAccessors getVersions() { - return vaccForVersionAccessors; - } - - /** - * Group of bundles at bundles - * - * @deprecated Will be removed in Gradle 9.0. - */ - @Deprecated - public BundleAccessors getBundles() { - org.gradle.internal.deprecation.DeprecationLogger.deprecateBehaviour("Accessing libraries or bundles from version catalogs in the plugins block.").withAdvice("Only use versions or plugins from catalogs in the plugins block.").willBeRemovedInGradle9().withUpgradeGuideSection(8, "kotlin_dsl_deprecated_catalogs_plugins_block").nagUser(); - return baccForBundleAccessors; - } - - /** - * Group of plugins at plugins - */ - public PluginAccessors getPlugins() { - return paccForPluginAccessors; - } - - /** - * @deprecated Will be removed in Gradle 9.0. - */ - @Deprecated - public static class AndroidxLibraryAccessors extends SubDependencyFactory { - private final AndroidxEspressoLibraryAccessors laccForAndroidxEspressoLibraryAccessors = new AndroidxEspressoLibraryAccessors(owner); - - public AndroidxLibraryAccessors(AbstractExternalDependencyFactory owner) { super(owner); } - - /** - * Dependency provider for appcompat with androidx.appcompat:appcompat coordinates and - * with version reference appcompat - *

- * This dependency was declared in catalog libs.versions.toml - * - * @deprecated Will be removed in Gradle 9.0. - */ - @Deprecated - public Provider getAppcompat() { - org.gradle.internal.deprecation.DeprecationLogger.deprecateBehaviour("Accessing libraries or bundles from version catalogs in the plugins block.").withAdvice("Only use versions or plugins from catalogs in the plugins block.").willBeRemovedInGradle9().withUpgradeGuideSection(8, "kotlin_dsl_deprecated_catalogs_plugins_block").nagUser(); - return create("androidx.appcompat"); - } - - /** - * Dependency provider for constraintlayout with androidx.constraintlayout:constraintlayout coordinates and - * with version reference constraintlayout - *

- * This dependency was declared in catalog libs.versions.toml - * - * @deprecated Will be removed in Gradle 9.0. - */ - @Deprecated - public Provider getConstraintlayout() { - org.gradle.internal.deprecation.DeprecationLogger.deprecateBehaviour("Accessing libraries or bundles from version catalogs in the plugins block.").withAdvice("Only use versions or plugins from catalogs in the plugins block.").willBeRemovedInGradle9().withUpgradeGuideSection(8, "kotlin_dsl_deprecated_catalogs_plugins_block").nagUser(); - return create("androidx.constraintlayout"); - } - - /** - * Dependency provider for core with androidx.core:core coordinates and - * with version reference core - *

- * This dependency was declared in catalog libs.versions.toml - * - * @deprecated Will be removed in Gradle 9.0. - */ - @Deprecated - public Provider getCore() { - org.gradle.internal.deprecation.DeprecationLogger.deprecateBehaviour("Accessing libraries or bundles from version catalogs in the plugins block.").withAdvice("Only use versions or plugins from catalogs in the plugins block.").willBeRemovedInGradle9().withUpgradeGuideSection(8, "kotlin_dsl_deprecated_catalogs_plugins_block").nagUser(); - return create("androidx.core"); - } - - /** - * Dependency provider for junit with androidx.test.ext:junit coordinates and - * with version reference junitVersion - *

- * This dependency was declared in catalog libs.versions.toml - * - * @deprecated Will be removed in Gradle 9.0. - */ - @Deprecated - public Provider getJunit() { - org.gradle.internal.deprecation.DeprecationLogger.deprecateBehaviour("Accessing libraries or bundles from version catalogs in the plugins block.").withAdvice("Only use versions or plugins from catalogs in the plugins block.").willBeRemovedInGradle9().withUpgradeGuideSection(8, "kotlin_dsl_deprecated_catalogs_plugins_block").nagUser(); - return create("androidx.junit"); - } - - /** - * Group of libraries at androidx.espresso - * - * @deprecated Will be removed in Gradle 9.0. - */ - @Deprecated - public AndroidxEspressoLibraryAccessors getEspresso() { - org.gradle.internal.deprecation.DeprecationLogger.deprecateBehaviour("Accessing libraries or bundles from version catalogs in the plugins block.").withAdvice("Only use versions or plugins from catalogs in the plugins block.").willBeRemovedInGradle9().withUpgradeGuideSection(8, "kotlin_dsl_deprecated_catalogs_plugins_block").nagUser(); - return laccForAndroidxEspressoLibraryAccessors; - } - - } - - /** - * @deprecated Will be removed in Gradle 9.0. - */ - @Deprecated - public static class AndroidxEspressoLibraryAccessors extends SubDependencyFactory { - - public AndroidxEspressoLibraryAccessors(AbstractExternalDependencyFactory owner) { super(owner); } - - /** - * Dependency provider for core with androidx.test.espresso:espresso-core coordinates and - * with version reference espressoCore - *

- * This dependency was declared in catalog libs.versions.toml - * - * @deprecated Will be removed in Gradle 9.0. - */ - @Deprecated - public Provider getCore() { - org.gradle.internal.deprecation.DeprecationLogger.deprecateBehaviour("Accessing libraries or bundles from version catalogs in the plugins block.").withAdvice("Only use versions or plugins from catalogs in the plugins block.").willBeRemovedInGradle9().withUpgradeGuideSection(8, "kotlin_dsl_deprecated_catalogs_plugins_block").nagUser(); - return create("androidx.espresso.core"); - } - - } - - public static class VersionAccessors extends VersionFactory { - - public VersionAccessors(ProviderFactory providers, DefaultVersionCatalog config) { super(providers, config); } - - /** - * Version alias agp with value 8.8.2 - *

- * If the version is a rich version and cannot be represented as a - * single version string, an empty string is returned. - *

- * This version was declared in catalog libs.versions.toml - */ - public Provider getAgp() { return getVersion("agp"); } - - /** - * Version alias appcompat with value 1.6.1 - *

- * If the version is a rich version and cannot be represented as a - * single version string, an empty string is returned. - *

- * This version was declared in catalog libs.versions.toml - */ - public Provider getAppcompat() { return getVersion("appcompat"); } - - /** - * Version alias constraintlayout with value 2.1.4 - *

- * If the version is a rich version and cannot be represented as a - * single version string, an empty string is returned. - *

- * This version was declared in catalog libs.versions.toml - */ - public Provider getConstraintlayout() { return getVersion("constraintlayout"); } - - /** - * Version alias core with value 1.12.0 - *

- * If the version is a rich version and cannot be represented as a - * single version string, an empty string is returned. - *

- * This version was declared in catalog libs.versions.toml - */ - public Provider getCore() { return getVersion("core"); } - - /** - * Version alias espressoCore with value 3.6.1 - *

- * If the version is a rich version and cannot be represented as a - * single version string, an empty string is returned. - *

- * This version was declared in catalog libs.versions.toml - */ - public Provider getEspressoCore() { return getVersion("espressoCore"); } - - /** - * Version alias junit with value 4.13.2 - *

- * If the version is a rich version and cannot be represented as a - * single version string, an empty string is returned. - *

- * This version was declared in catalog libs.versions.toml - */ - public Provider getJunit() { return getVersion("junit"); } - - /** - * Version alias junitVersion with value 1.2.1 - *

- * If the version is a rich version and cannot be represented as a - * single version string, an empty string is returned. - *

- * This version was declared in catalog libs.versions.toml - */ - public Provider getJunitVersion() { return getVersion("junitVersion"); } - - /** - * Version alias material with value 1.11.0 - *

- * If the version is a rich version and cannot be represented as a - * single version string, an empty string is returned. - *

- * This version was declared in catalog libs.versions.toml - */ - public Provider getMaterial() { return getVersion("material"); } - - } - - /** - * @deprecated Will be removed in Gradle 9.0. - */ - @Deprecated - public static class BundleAccessors extends BundleFactory { - - public BundleAccessors(ObjectFactory objects, ProviderFactory providers, DefaultVersionCatalog config, ImmutableAttributesFactory attributesFactory, CapabilityNotationParser capabilityNotationParser) { super(objects, providers, config, attributesFactory, capabilityNotationParser); } - - } - - public static class PluginAccessors extends PluginFactory { - private final AndroidPluginAccessors paccForAndroidPluginAccessors = new AndroidPluginAccessors(providers, config); - - public PluginAccessors(ProviderFactory providers, DefaultVersionCatalog config) { super(providers, config); } - - /** - * Group of plugins at plugins.android - */ - public AndroidPluginAccessors getAndroid() { - return paccForAndroidPluginAccessors; - } - - } - - public static class AndroidPluginAccessors extends PluginFactory { - - public AndroidPluginAccessors(ProviderFactory providers, DefaultVersionCatalog config) { super(providers, config); } - - /** - * Plugin provider for android.application with plugin id com.android.application and - * with version reference agp - *

- * This plugin was declared in catalog libs.versions.toml - */ - public Provider getApplication() { return createPlugin("android.application"); } - - } - -} diff --git a/.gradle/8.10.2/dependencies-accessors/gc.properties b/.gradle/8.10.2/dependencies-accessors/gc.properties deleted file mode 100644 index e69de29..0000000 diff --git a/.gradle/8.10.2/executionHistory/executionHistory.lock b/.gradle/8.10.2/executionHistory/executionHistory.lock deleted file mode 100644 index 33951f484dbf7ca6d32d1ee4c8c2a6faa70cb253..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17 UcmZR+@n{9Fjq|Er1_)3D05(PhN&o-= diff --git a/.gradle/8.10.2/fileChanges/last-build.bin b/.gradle/8.10.2/fileChanges/last-build.bin deleted file mode 100644 index f76dd238ade08917e6712764a16a22005a50573d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1 IcmZPo000310RR91 diff --git a/.gradle/8.10.2/fileHashes/fileHashes.bin b/.gradle/8.10.2/fileHashes/fileHashes.bin deleted file mode 100644 index 6d960d2c6fffd32233b09fd88e5f25fc83acea65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26347 zcmeI3c{EnvzsHXuWXO=rLn_IvBubLh{hbUu9UQ6-Nm8{i(- z5Ko=ISiMOlVi3khA)XfEc%=5Eb`juacM#uqda9>4#h2LyxcPp>b6-B)lf#{L8F2e1#0v^jqM3`I=L2rhhXmcaA~4YQ^uL zcPh8Sesr{<^QaYx!*&OULA>v5I?p)Xe(~~|Ucmi25wBTn!S|+rP!;B_LcH#3}WA%R{zF`a`}O@jG#kwNCZ&egfRw4e^#ZPA4VDszSg`C+WOSrC>p{ zA8k(I#ds~^t=+*Nbj@_$0B-dX@pitvT4R^5O@O=qK)fU3=)+3c0aL(T?<3whw>)g@ zq-8naKJ@!{oqQgx@yq)&;JzU!{yyJM$Ln`iCjoA)kNAUDEC04x@HUvI9pc^IK>{(t z_EjL>h70k>{3(*`J%&7h+ipa>=kv7)rP3-_z`f!Tf4ctBqd%PcVY^J|^?9M)edB}Q zwo(x9JrBjdR9Dbw@P6_TaO*ROztS^R{=4%o7vKRm5Pz-XlcJGS(F{4gUtV83oxXrO z6#C}*0mZ-D-0s^JyhRkm+iKGJ{+381I~xzc9g`6M7^e^syiC&@a4!qQKWBt#ac$bR z6mT0II)5O_?6pke0^sfk5&x#g$IIdr0gd*mrt^*EdEHY|9Uwl?fzC67lNLT1`Uh~| zV#L3jmPmvP^cDc_T14mP#Fam0TzUYw!xcIok7_pnD#F=_Ne6_!66A$n68*%o%=2cAE zk6HjXm#6cm@nRJd(r}#n=OE4*Iz8yrWVREjRmB05?-b@q7!PEqcwe z2Cj#J3lSHPVQP4mw&OI2cSu8guDEN5v7_4r;BEnQUgY=3Gqzg{aGMi|3;JF;ujKcq zA8=Q8#D(N}#wr6cdI0y_L+8Q%ttLa=6@dHE*I{9ar|Ig-JaFH4E<^ER{)1h-I+yo= zc;g7fB^u&q_0P71Ar7zKfv*0?}7NjhH1mszRhPqylXJxa(}VYe}xU;zHjpgaRpiD&f^&&a9=i= zjkuzq(_8g%^K@_@%UU|`e>MK&VZv{~z55YYiuP+resG5sa0~i4QL2y)RbjJG1l(f; z#V@T6t*j}S8w$9?XT;UZi(*vHZOj7PUJ>yXDmAP40!-mLU=vE`k*yno-taPkcz^o1 zU6Ff1B42Am5a4FxC|=WVm3gtE-Ce*Pr4iQ-4!rg?RvnHXQ~Eli)6>4yq9|Vv#CxQp zcwN=$@-&W>a6fXMOXs$ur;c6Vh3kMZeO|B0PHhsi4tWdi<7|lH_1=HGJjSPd1#k=c zdTaRd<5ki497(|4y->X2*lL{ziRrMOR_75njcIf@QkI(p@op1{o2jxI6*L^Z1h{oC z;?}0u%7P-J(7N{yahqS9zTXX-;C}5liMYM(;|He}E`#ST+q;N6to&FrG-nZ7-_a6bCe`^&kjX5UHQhEbTv21NU*KSBM9vbw2MnTze73+xa2BrQpUqi{+khKeb3fJe2qI zTE0eYxNiH<`!Q5*mWxr!yjS2pmR2Z!>({GIrEzTVdB@5G@rak_{r_J64E^+8k9g$I zEJ@WxTlK(wOgA7N!=kYNNqoRbz`eKA`GVM4`72c6d@-Z9H^#hXvRUCftY-kdA9q~5 zk2PI;4BP9&i|!L!GPG7o$^f22EQS%^`HpwOFjHX@$ZI8xc-)%R%j;FV;W^4>E8^%o zhRtaQ8tO_pKsi7;Ksi7;Ksi7;Ksi7;Ksi7;Ksi7;Ksi7;Ksi7;Ksi7;Ksi7;Ksi7; zKsi7;Ksi7;Ksi7;Ksi7;Ksi8r2}K_NqP@f>!{@(kWbS-%D)xtG8mJ+?tHbcJF-KEYOmw(+R+p$H}FWjXy3sv42sI*N&HPZ?t5Ou znN1sPn8e>^A{5sM0VYp-ON2qOXrR!PsmPYwO<`oa^DiCzJs6ro^%qdEm68?v%ED}v zSIR7lf17fPMULk@P^bw3g&^$>X@(qf^B0O(g%zqw%5zM3qz*N}9Djg(Nhh5x-iFFpy0r3$=HrrbGoOGH706@%j-q<>n_0G>7;q3CIA%N7sv{}y?mNC zST$Os*03mB3LS$zs0wSva+s|6WtGz(Tyyx|3Tc+pDjWM?530=rIaq0*J791(D_OTx zSHg86R=d$R?YQ&+Y&mpyRvB5Lw10!d*EoMOB^KHDtYKQXn?#?(cO+R(krk0;HpfDQ zL`v#cJl~#@?{XU|;M;X`EXj&GwKw^t8!xSX*LyVNeOiGu^a{E=>k(OT@R-O`C*Q24 z{DW)TQ%{xSqnvOTww&b_S+PxB*jyw|+`dAkl8e>tgcnpO;gPiBhkr46^*>io^Mjfn zaJ2uQn;-uh`^Vm8Ct@Trz4o3Sjj|OUOWZ*7YVHw3+O|h4v|WK=4#wvRabo@sXPKE)+ss*$hcwxrB7;05|OqJ8`tHkF60+w9|IunMVqK=5iuo?E+{LbDt z@#U+T%W0EBF~4 z&Rt|hc*leEeD6KIj)`3+x6dwL4i&&FCYL6%B4*v+D66#@E&4)o>_4lj@OsnSMP3=t z&>tgr91I&+bG>vnVSgjVQXHV-F=z)9?G0rHujX4+D#o@;^V=QOb&ONGIwiPP62nAaU2U)R<*Id`5_hyY)#`TWDqg&;H!U+FP zD+06e3q!52(e@2ep*p-T;sh(W;`lGa98U-VYc%cbz@V78`k{R9qvt`R?(aW)48G_D z3WIJ!fu(IED~yx0ngkpYwbxBG%Nt!}y9X65ghDv_J6Tbneb2sPy|6~Sn6YWjwhViy zfTP`dimWg)?{*34co3@?yu@L==hz5Tz)#`y(;Q%EN3Ew<>o5MYmla;#YJb*K@a{p zA7XyM(Jqxl&Y}L*{kKSS;X1am9YM=ZSS*JM+IYfO#L#xK;@ExZf4H}oE9IPCQ^)n; z4a{MLuh@7|VlpQy=5zem$qfn4o3AX5GM7JjNV9dz~+g>eTPCk_ZXf&ufO(-E)LO!WLig7!_M;^4?x3 z^*w%N{Ctj7iGv8tkwqvlHcqlaOF-Ab&-A=#E^CNXmuBTJsG!XYyp)9C7lxMmPgmdF zq&3oc>1VgrZ~N2udP}stnGj%qXBh2quWlwSv!0XH^J~2=hxtRaN5NUkwV0ga^4JJx z!ZQaon-48dxHbvKfE-3kh#Z_l56BAD#nG$P#dgbSIAPr8*ItZ6g#xJ6B77ZYY=?TT z%iT78>By!Pw?9=$#OwqLLm zH->d2Hmh+T8F&0vwbcwNJ`oDmeA)`Z(1Y4)(%!X2=~~smN>IEQOC%VqAfi3zw^r6*m5T%!7A!C$>ja*?k(=e;g{{ zxRSLZE8ed0NIrQcWLNFC(eDm=Rtuq`4UfdjhE)8*&<^cy_ZOM06I(J?zFu3PVrc8X zyuyyCk`=dDoZDJAyT*^)W^Odh+lQ|qL_6S`cyfkk&Lexrq8iw9c7}!&uNA-D3il7R zwg=3xikc5p|5_z3dL$}DfAj8DbE^N{@?3o0Gqxl7!HDD@nH^HY?Tv~Gs%Nr+!jM)Q z3}b1LBrDpQ%IwZR@eWGVD9YJV&HNSS019lFHtHF?5@>BSH7{UI`t;mOm`5=yA1ZQa zDKO?IGwkQ}>poXq80A^#S><>pFVX>@*Tnn~BNUj(3}?7k6UT;%U)R2Re8@B@X4P)A zQcD4a*bHl8s`8p3K8wo>RzJPpRWh%^7S;-m680HtH7jo5UAycs*IricbGtSj=7EZb zAP46REzf?gd)935@AJh;?Vs;)N}E8%eL}(R*oA**@M<(~bt=~j$-a^CGX0`U7r@^# z(EQ*kpW$R_^}xK~;rX*xxgiGc{p+kwLa+Eht!B?B=Xn0m=74gu%kIghknnjYza_(3 z;cE(BgtTxc7;DAJ>A+il_ls#q=Y@+Z;J}{f> z9=?ka3b6Xj3Z3D+o5>~kS3097_V6y<;XgSQ_zWTxc;C}X++F;_;8nra@wZX`%-WjV zJ$J5yy9PYT7#tx4Se+nQA(`=LGRm{)@z|K`Y5pzyqCpNL8A8G0qfS;7JrW=P5L)r+ ztEiQkWgLc|5C2=OmF&x-S9>wMJ39zJE6@~%aI`lXlNBq5 z^&)KpcEnCBT^P$BG<6*+meNw-6McsBm5^Ud+!;^#M;!C7TQ|oo$D?RDpjTM<6&x_s zN=I%Y+%bCJ5#>jzH%|3=xWRV79^5cPI}*+>E|dJ!afnGbeW|EMz(%M5^8=fQ|C=$# z7;~$2d77MJ&uzV?tU(y_hec`!qG^i%~rhZnqk%! zSBh;at-U0YTYu=N-*G9la{>kP`w?8m&~j6*){KPf+f72{+Qdap``N&DTq07iuk)b@(;%%1N&aw@wFZ!yt>PYH!$(sr_9<)?cRNkcA`iIWLQOr|CHJqblOp}^Lu zkrf?=3%Mni>oeEJ)_tq|de#;y;L4!%m8>vldc7kor*LZ2?fFP`|D|=X9r%ik7pCt) zWJTt77B`u9uRrFc%+bMESn%;gtCa!hbLLayWW~J?va`RW<&|9(-l-5iQo{smB|uAo zVLMOa7Y27v2@CZ9QCT&8I`Brv;d+4vsF+O%n7bB`6)P0s?09$e+D5ec(9XGd5j&1w7+NmhpB=CM?TUxi=iIt^k^3A$ z4g)wpIB703D2msL$~SYbHBOMVxvO!)>=jhNJ*x0CS#jB6Z#}0~=N9YCPe0?HEynj& z!YdOz62nB}Xa`@094{{NrP@v&9o6-yG1)$9sqn8_F|EHvR%l?8Q$n*hM&5W?UDa=u z9S9WYZvfo5+l)EhdlYxnWoRfp*dw6QKfS>jDrkL;7Y^EpWT@5fTb0dx;i-bJ-wkO_ zcHi}e?EvQzF4q9EVw;$xcbclKk@5QU3g4W-T$ls);Or){BE|NnsJNFyXot|`IaWE9 z(?DSWW-Vr2L{v}Wy9cQz2_z=?Bw=@jaiXV@}i{uRbak6T4R-1yzeYIoX{W~)C zW1)h!|KX)&2F2Ac>>TfOqw|LX6-q0*MwY=^!RK1#R9wd3)x<#NTvL~Qvv2RZU6hnj zjX#|dvlfmLtq!t6;fu8E1L<8^0j|2dM}F#k2MYM)#cKPGtQb0I7u$!lXlDv4B`aig+IBWwx#_W_TUtoY#|%H=6SZo^Bk^;h;tXfegxx;>od1%1^J7B5 zM@?2Ye3K#+!-N7m;g5f3X!!t3__eyyyj?1b6g~g(T9^nFhJ1uVaOoMcV&|4-&EDvE zc6-^WW?PYrv#=fVAO|;Xv@qnT9(4V)@ney>Fh}3mMn5JOsDP`F#Q<5+lj_ydz3kMc zwMqL04}O`{g6)_`*ZW|sa1SI&~G Date: Mon, 31 Mar 2025 22:35:16 +0200 Subject: [PATCH 09/83] Fix: Add dummy google-services.json for CI and suppress compileSdk warning --- .github/workflows/android.yml | 27 +++++++++++++++++++++++++++ gradle.properties | 3 ++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml index c842498..a1edae3 100644 --- a/.github/workflows/android.yml +++ b/.github/workflows/android.yml @@ -20,6 +20,33 @@ jobs: distribution: 'temurin' cache: gradle + - name: Create dummy google-services.json + run: | + echo '{ + "project_info": { + "project_number": "123456789", + "project_id": "dummy-project", + "storage_bucket": "dummy-project.appspot.com" + }, + "client": [{ + "client_info": { + "mobilesdk_app_id": "1:123456789:android:abcdef123456", + "android_client_info": { + "package_name": "com.pineapple.capture" + } + }, + "api_key": [{ + "current_key": "dummy_api_key" + }], + "oauth_client": [], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [] + } + } + }] + }' > app/google-services.json + - name: Grant execute permission for gradlew run: chmod +x gradlew diff --git a/gradle.properties b/gradle.properties index 4387edc..3bf6a7b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -18,4 +18,5 @@ android.useAndroidX=true # Enables namespacing of each library's R class so that its R class includes only the # resources declared in the library itself and none from the library's dependencies, # thereby reducing the size of the R class for that library -android.nonTransitiveRClass=true \ No newline at end of file +android.nonTransitiveRClass=true +android.suppressUnsupportedCompileSdk=35 \ No newline at end of file From 0a771eae5c2ce2885bbaa8cde3e297269f220b8f Mon Sep 17 00:00:00 2001 From: Debojyoti Mishra <105543436+DebojyotiMishra@users.noreply.github.com> Date: Mon, 31 Mar 2025 22:43:12 +0200 Subject: [PATCH 10/83] fix: minor fixes --- .gitignore | 6 +++++- .gradle/8.10.2/fileHashes/fileHashes.bin | Bin 27297 -> 27297 bytes .gradle/8.10.2/fileHashes/fileHashes.lock | Bin 17 -> 17 bytes .gradle/file-system.probe | Bin 8 -> 8 bytes 4 files changed, 5 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index ab485f9..ee9a13a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ *.iml .gradle +.vscode /local.properties /.idea .DS_Store @@ -20,7 +21,10 @@ out/ # Gradle files .gradle/ -build/ +.gradle/**/* + +# IDE files +.vscode/ # Local configuration file (sdk path, etc) local.properties diff --git a/.gradle/8.10.2/fileHashes/fileHashes.bin b/.gradle/8.10.2/fileHashes/fileHashes.bin index 4001f042e73e9317fff8ad8c65cb4d6cbea58eff..99dd783aa3de230bcb3fc4c299f4e7fc18a4a218 100644 GIT binary patch delta 167 zcmZ2@m2u%!#tqNCS>6a3IZqZ$*8?#eCja#SGn^*tdqPDLAq=OzX@RQrAi!+!Ed2*Yu5W+v2%*${@~ Date: Mon, 31 Mar 2025 22:53:18 +0200 Subject: [PATCH 11/83] Add missing layout files and resources --- .gradle/8.10.2/checksums/checksums.lock | Bin 17 -> 17 bytes .gradle/8.10.2/checksums/md5-checksums.bin | Bin 26297 -> 26397 bytes .gradle/8.10.2/checksums/sha1-checksums.bin | Bin 75029 -> 75245 bytes .../executionHistory/executionHistory.lock | Bin 17 -> 17 bytes .gradle/8.10.2/fileHashes/fileHashes.bin | Bin 27297 -> 75915 bytes .gradle/8.10.2/fileHashes/fileHashes.lock | Bin 17 -> 17 bytes .../buildOutputCleanup.lock | Bin 17 -> 17 bytes app/build.gradle | 1 + app/src/main/res/drawable/default_profile.xml | 10 ++++ app/src/main/res/layout/activity_friends.xml | 31 +++++++++++ .../main/res/layout/activity_main_feed.xml | 28 ++++++++++ app/src/main/res/layout/activity_profile.xml | 50 ++++++++++++++++++ 12 files changed, 120 insertions(+) create mode 100644 app/src/main/res/drawable/default_profile.xml create mode 100644 app/src/main/res/layout/activity_friends.xml create mode 100644 app/src/main/res/layout/activity_main_feed.xml create mode 100644 app/src/main/res/layout/activity_profile.xml diff --git a/.gradle/8.10.2/checksums/checksums.lock b/.gradle/8.10.2/checksums/checksums.lock index 7afeec11a137c71e8c5639c2c4fc0c69e50080dc..fbeb3a7e735a5124d951bff7c96ed818e260c5d5 100644 GIT binary patch literal 17 VcmZQRqC96!Pv}!G1~6b|1pqap1WNz_ literal 17 VcmZQRqC96!Pv}!G1~6dy4gfZj1v~%% diff --git a/.gradle/8.10.2/checksums/md5-checksums.bin b/.gradle/8.10.2/checksums/md5-checksums.bin index 2b7674fb88dae44b63a5fd86e98af925f514150c..51db01c5cb5f29a0ab3649f8d30fe906ddde9405 100644 GIT binary patch delta 175 zcmdmamT~Sm#tkMCjPo{|N<^>9m{O5&j1E#I~TXgatNf08_(MFcIGmu;Oot` zs>zIu4>v0Q5Z`EE!MWMdqe3pl7$~a=#EKv+kP}&TPvysr?qi2G?hYtnNMT@Loci`F qa~H%277rk;hpNMSM)BHX+=8lAuef`!=jgbCb^L1UgzA_J(g6Ttb}^*@ delta 41 zcmV+^0M`GV&H=g20kAX}0i3fn7+3|fr5*SOv$Z8#0RgeGA@~=uFlY(0K}dKWUHuRK diff --git a/.gradle/8.10.2/checksums/sha1-checksums.bin b/.gradle/8.10.2/checksums/sha1-checksums.bin index bc50c57adf933941252404deb68e3799a862ce13..91623b5416cc50c51fb3a065fcdf545218d7f4c8 100644 GIT binary patch delta 348 zcmbPwiskKTmJKEnj4GQ=C0+{hA1#fJWwzI600Bl-@6DoGjI8`Nv$|FJPUJ%cMK|;6 zC$lgXZeD2oc>|-~=BZBt8TkbxB>c4JJ%B1{+{!rK>$FqR0^8v~_vfmjuUMgCv@^E<^x;@)#*m-Ne-zhYvJ*Te!{GWG3O z<}R=~3@jc%+K3vuW=>HNdKnq#9&%pi+A8mjZ$od*Sj`Brj8z$InQep^re*gW%b3Yp%ejh5HLI*kpKVy diff --git a/.gradle/8.10.2/executionHistory/executionHistory.lock b/.gradle/8.10.2/executionHistory/executionHistory.lock index 33951f484dbf7ca6d32d1ee4c8c2a6faa70cb253..fe7b6699132fa6e8093c2729b99e23d682fabe20 100644 GIT binary patch literal 17 UcmZR+@n{9Fjq|Er1_&?#05(|!T>t<8 literal 17 UcmZR+@n{9Fjq|Er1_)3D05(PhN&o-= diff --git a/.gradle/8.10.2/fileHashes/fileHashes.bin b/.gradle/8.10.2/fileHashes/fileHashes.bin index 99dd783aa3de230bcb3fc4c299f4e7fc18a4a218..2dff672064cfb17e6c5f9a3d45d5a33b088772c0 100644 GIT binary patch literal 75915 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 diff --git a/.gradle/8.10.2/fileHashes/fileHashes.lock b/.gradle/8.10.2/fileHashes/fileHashes.lock index 0721c34adbcc420d6220e37863f52c0f0330b93b..cd37331892667a750edc49d3cdabbd475af63661 100644 GIT binary patch literal 17 UcmZP;WYX;aWzFNl00vCw036~2Bme*a literal 17 TcmZP;WYX;aWzFNl00CD49OVNk diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock index 1024ecc743d4646c4a7a7430538e24fbb88ad8b8..e1dea87413277e3b8703367033ad7518a3c1de88 100644 GIT binary patch literal 17 UcmZRcuhL|{$!2B}0|aaY04t~jA^-pY literal 17 UcmZRcuhL|{$!2B}0|bNu04q!b#sB~S diff --git a/app/build.gradle b/app/build.gradle index ce5eb55..b210b04 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -46,6 +46,7 @@ dependencies { implementation 'androidx.lifecycle:lifecycle-runtime:2.7.0' implementation 'androidx.navigation:navigation-fragment:2.7.7' implementation 'androidx.navigation:navigation-ui:2.7.7' + implementation 'de.hdodenhof:circleimageview:3.1.0' testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.5' androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' diff --git a/app/src/main/res/drawable/default_profile.xml b/app/src/main/res/drawable/default_profile.xml new file mode 100644 index 0000000..27d1d4f --- /dev/null +++ b/app/src/main/res/drawable/default_profile.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_friends.xml b/app/src/main/res/layout/activity_friends.xml new file mode 100644 index 0000000..e51c96d --- /dev/null +++ b/app/src/main/res/layout/activity_friends.xml @@ -0,0 +1,31 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main_feed.xml b/app/src/main/res/layout/activity_main_feed.xml new file mode 100644 index 0000000..096044e --- /dev/null +++ b/app/src/main/res/layout/activity_main_feed.xml @@ -0,0 +1,28 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_profile.xml b/app/src/main/res/layout/activity_profile.xml new file mode 100644 index 0000000..e68c9d2 --- /dev/null +++ b/app/src/main/res/layout/activity_profile.xml @@ -0,0 +1,50 @@ + + + + + + + + + + \ No newline at end of file From d4759d92fb655fc76092e04f940200be583cf330 Mon Sep 17 00:00:00 2001 From: Debojyoti Mishra <105543436+DebojyotiMishra@users.noreply.github.com> Date: Tue, 1 Apr 2025 10:38:02 +0200 Subject: [PATCH 12/83] feat(auth): implement Firebase Authentication and user management - Add email/password authentication - Implement user data storage in Firestore - Add profile picture storage in Firebase Storage - Create login and signup UI - Add password reset and email verification features --- app/src/main/AndroidManifest.xml | 14 +- .../capture/activities/LoginActivity.java | 82 +++++++++++ .../capture/activities/SignupActivity.java | 1 + .../pineapple/capture/auth/AuthManager.java | 136 ++++++++++++++++++ .../com/pineapple/capture/models/User.java | 51 +++++++ app/src/main/res/layout/activity_login.xml | 75 ++++++++++ app/src/main/res/layout/activity_signup.xml | 92 ++++++++++++ 7 files changed, 448 insertions(+), 3 deletions(-) create mode 100644 app/src/main/java/com/pineapple/capture/activities/LoginActivity.java create mode 100644 app/src/main/java/com/pineapple/capture/activities/SignupActivity.java create mode 100644 app/src/main/java/com/pineapple/capture/auth/AuthManager.java create mode 100644 app/src/main/java/com/pineapple/capture/models/User.java create mode 100644 app/src/main/res/layout/activity_login.xml create mode 100644 app/src/main/res/layout/activity_signup.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 091386d..3efa0b4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -12,17 +12,25 @@ android:supportsRtl="true" android:theme="@style/Theme.Capture" tools:targetApi="31"> + - + + + + \ No newline at end of file diff --git a/app/src/main/java/com/pineapple/capture/activities/LoginActivity.java b/app/src/main/java/com/pineapple/capture/activities/LoginActivity.java new file mode 100644 index 0000000..4c8e784 --- /dev/null +++ b/app/src/main/java/com/pineapple/capture/activities/LoginActivity.java @@ -0,0 +1,82 @@ +package com.pineapple.capture.activities; + +import android.content.Intent; +import android.os.Bundle; +import android.view.View; +import android.widget.Toast; +import androidx.appcompat.app.AppCompatActivity; +import com.pineapple.capture.R; +import com.pineapple.capture.auth.AuthManager; +import com.pineapple.capture.databinding.ActivityLoginBinding; + +public class LoginActivity extends AppCompatActivity { + private ActivityLoginBinding binding; + private AuthManager authManager; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + binding = ActivityLoginBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + + authManager = AuthManager.getInstance(); + + // Check if user is already logged in + if (authManager.getCurrentUser() != null) { + startMainActivity(); + finish(); + return; + } + + setupClickListeners(); + } + + private void setupClickListeners() { + binding.loginButton.setOnClickListener(v -> handleLogin()); + binding.signupButton.setOnClickListener(v -> startSignupActivity()); + } + + private void handleLogin() { + String email = binding.emailEditText.getText().toString().trim(); + String password = binding.passwordEditText.getText().toString().trim(); + + if (email.isEmpty() || password.isEmpty()) { + Toast.makeText(this, "Please fill in all fields", Toast.LENGTH_SHORT).show(); + return; + } + + showLoading(true); + authManager.login(email, password) + .addOnCompleteListener(task -> { + showLoading(false); + if (task.isSuccessful()) { + startMainActivity(); + finish(); + } else { + String error = task.getException() != null ? + task.getException().getMessage() : + "Authentication failed"; + Toast.makeText(LoginActivity.this, error, Toast.LENGTH_LONG).show(); + } + }); + } + + private void startSignupActivity() { + Intent intent = new Intent(this, SignupActivity.class); + startActivity(intent); + } + + private void startMainActivity() { + Intent intent = new Intent(this, MainActivity.class); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); + startActivity(intent); + } + + private void showLoading(boolean show) { + binding.progressBar.setVisibility(show ? View.VISIBLE : View.GONE); + binding.loginButton.setEnabled(!show); + binding.signupButton.setEnabled(!show); + binding.emailEditText.setEnabled(!show); + binding.passwordEditText.setEnabled(!show); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/pineapple/capture/activities/SignupActivity.java b/app/src/main/java/com/pineapple/capture/activities/SignupActivity.java new file mode 100644 index 0000000..0519ecb --- /dev/null +++ b/app/src/main/java/com/pineapple/capture/activities/SignupActivity.java @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/src/main/java/com/pineapple/capture/auth/AuthManager.java b/app/src/main/java/com/pineapple/capture/auth/AuthManager.java new file mode 100644 index 0000000..e5d2c4b --- /dev/null +++ b/app/src/main/java/com/pineapple/capture/auth/AuthManager.java @@ -0,0 +1,136 @@ +package com.pineapple.capture.auth; + +import android.net.Uri; +import androidx.annotation.NonNull; +import com.google.android.gms.tasks.Task; +import com.google.firebase.auth.AuthResult; +import com.google.firebase.auth.FirebaseAuth; +import com.google.firebase.auth.FirebaseUser; +import com.google.firebase.auth.UserProfileChangeRequest; +import com.google.firebase.firestore.FirebaseFirestore; +import com.google.firebase.storage.FirebaseStorage; +import com.google.firebase.storage.StorageReference; +import com.pineapple.capture.models.User; +import java.util.Objects; + +public class AuthManager { + private static AuthManager instance; + private final FirebaseAuth auth; + private final FirebaseFirestore db; + private final FirebaseStorage storage; + private static final String USERS_COLLECTION = "users"; + private static final String PROFILE_PICTURES = "profile_pictures"; + + private AuthManager() { + auth = FirebaseAuth.getInstance(); + db = FirebaseFirestore.getInstance(); + storage = FirebaseStorage.getInstance(); + } + + public static synchronized AuthManager getInstance() { + if (instance == null) { + instance = new AuthManager(); + } + return instance; + } + + public Task signUp(String email, String password, String displayName) { + return auth.createUserWithEmailAndPassword(email, password) + .addOnSuccessListener(authResult -> { + FirebaseUser firebaseUser = authResult.getUser(); + if (firebaseUser != null) { + // Update display name + UserProfileChangeRequest profileUpdates = new UserProfileChangeRequest.Builder() + .setDisplayName(displayName) + .build(); + firebaseUser.updateProfile(profileUpdates); + + // Create user document in Firestore + User user = new User( + firebaseUser.getUid(), + email, + displayName, + null // No profile picture initially + ); + db.collection(USERS_COLLECTION) + .document(firebaseUser.getUid()) + .set(user); + } + }); + } + + public Task login(String email, String password) { + return auth.signInWithEmailAndPassword(email, password); + } + + public void logout() { + auth.signOut(); + } + + public FirebaseUser getCurrentUser() { + return auth.getCurrentUser(); + } + + public Task updateProfilePicture(Uri imageUri) { + FirebaseUser user = getCurrentUser(); + if (user == null) { + return null; + } + + StorageReference storageRef = storage.getReference() + .child(PROFILE_PICTURES) + .child(user.getUid() + ".jpg"); + + return storageRef.putFile(imageUri) + .continueWithTask(task -> { + if (!task.isSuccessful()) { + throw Objects.requireNonNull(task.getException()); + } + return storageRef.getDownloadUrl(); + }) + .continueWithTask(task -> { + String downloadUrl = task.getResult().toString(); + + // Update Firebase User profile + UserProfileChangeRequest profileUpdates = new UserProfileChangeRequest.Builder() + .setPhotoUri(Uri.parse(downloadUrl)) + .build(); + + // Update Firestore document + db.collection(USERS_COLLECTION) + .document(user.getUid()) + .update("profilePictureUrl", downloadUrl); + + return user.updateProfile(profileUpdates); + }); + } + + public Task getUserData(@NonNull String uid) { + return db.collection(USERS_COLLECTION) + .document(uid) + .get() + .continueWith(task -> { + if (task.isSuccessful() && task.getResult() != null) { + return task.getResult().toObject(User.class); + } + return null; + }); + } + + public Task sendPasswordResetEmail(String email) { + return auth.sendPasswordResetEmail(email); + } + + public Task sendEmailVerification() { + FirebaseUser user = getCurrentUser(); + if (user != null) { + return user.sendEmailVerification(); + } + return null; + } + + public boolean isEmailVerified() { + FirebaseUser user = getCurrentUser(); + return user != null && user.isEmailVerified(); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/pineapple/capture/models/User.java b/app/src/main/java/com/pineapple/capture/models/User.java new file mode 100644 index 0000000..e88911a --- /dev/null +++ b/app/src/main/java/com/pineapple/capture/models/User.java @@ -0,0 +1,51 @@ +package com.pineapple.capture.models; + +public class User { + private String uid; + private String email; + private String displayName; + private String profilePictureUrl; + + // Empty constructor for Firestore + public User() {} + + public User(String uid, String email, String displayName, String profilePictureUrl) { + this.uid = uid; + this.email = email; + this.displayName = displayName; + this.profilePictureUrl = profilePictureUrl; + } + + // Getters and setters + public String getUid() { + return uid; + } + + public void setUid(String uid) { + this.uid = uid; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + public String getProfilePictureUrl() { + return profilePictureUrl; + } + + public void setProfilePictureUrl(String profilePictureUrl) { + this.profilePictureUrl = profilePictureUrl; + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml new file mode 100644 index 0000000..c5e4d81 --- /dev/null +++ b/app/src/main/res/layout/activity_login.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + +