88 Commits

Author SHA1 Message Date
github-actions[bot]
504da80c09 chore(master): release 0.11.0 2026-05-12 12:00:27 +03:00
0c575eaa26 fix: preserve subpath for Nextcloud instances hosted on sub-paths 2026-05-12 11:56:59 +03:00
38b5d8b464 build: update makefile targets 2026-05-12 11:37:15 +03:00
ef2bc851de feat: add setting to require checkbox tap to complete checklist items 2026-05-12 11:37:15 +03:00
github-actions[bot]
448d85834b chore(master): release 0.10.1 2026-04-26 23:42:06 +03:00
7b5f9c1518 fix: make markdown links clickable 2026-04-26 22:43:52 +03:00
67581d04f0 build: update fastlane 2026-04-21 11:29:39 +03:00
be83067fb7 build: disable preview html for fastlane deliver 2026-04-21 11:18:18 +03:00
ea4590f0ed build: fix makefile syntax 2026-04-21 11:11:41 +03:00
github-actions[bot]
721f32e1ea chore(master): release 0.10.0 2026-04-21 10:08:29 +03:00
36a74b39e1 feat: update notes view & edit ui 2026-04-21 09:52:38 +03:00
08159faec2 fix: bug where note grid would not clip correctly 2026-04-21 09:38:41 +03:00
346bfb9d92 docs: add apple app store link 2026-04-20 09:57:20 +03:00
github-actions[bot]
0b9cda92ca chore(master): release 0.9.10 2026-04-19 17:25:15 +03:00
9f45b2344e build: fix signing
Release-As: 0.9.10
2026-04-19 17:14:18 +03:00
github-actions[bot]
4ae96c37d1 chore(master): release 0.9.9 2026-04-19 15:31:34 +03:00
852e9c47f3 build: re-sign with stripping
Release-As: 0.9.9
2026-04-19 15:28:18 +03:00
github-actions[bot]
769bf74400 chore(master): release 0.9.8 2026-04-19 14:12:40 +03:00
132d9e33a6 build: strip deps metadata from build
Release-As: 0.9.8
2026-04-19 14:10:06 +03:00
github-actions[bot]
7ff161f1c5 chore(master): release 0.9.7 2026-04-19 13:26:45 +03:00
7ea2901867 build: disable deps metadata in apk
Release-As: 0.9.7
2026-04-19 13:22:59 +03:00
github-actions[bot]
7a849d5d36 chore(master): release 0.9.6 2026-04-19 12:47:04 +03:00
b1d7eccd82 build: remove zipalign
Release-As: 0.9.6
2026-04-19 12:44:20 +03:00
github-actions[bot]
0f999750f1 chore(master): release 0.9.5 2026-04-19 12:25:07 +03:00
6d2173f08d build: zipalign
Release-As: 0.9.5
2026-04-19 12:15:46 +03:00
github-actions[bot]
768e78ace9 chore(master): release 0.9.4 2026-04-19 11:56:13 +03:00
d41d2b81be build: remove apk obfuscation
Release-As: 0.9.4
2026-04-19 11:39:31 +03:00
1f09e9d5aa build: use .flutter-version file for github actions 2026-04-19 11:30:24 +03:00
github-actions[bot]
1bb5b85b3e chore(master): release 0.9.3 2026-04-19 11:21:13 +03:00
3e4051a846 build: upgrade flutter version
Release-As: 0.9.3
2026-04-19 11:19:17 +03:00
github-actions[bot]
24baeda80f chore(master): release 0.9.2 2026-04-19 11:07:27 +03:00
9d4c8327b0 build: reproducible build
Release-As: 0.9.2
2026-04-19 11:05:35 +03:00
github-actions[bot]
42125f89eb chore(master): release 0.9.1 2026-04-18 23:34:25 +03:00
7d0c7932ea build: add abi split
Release-As: 0.9.1
2026-04-18 23:31:14 +03:00
6f9f40a061 build: auto send to review 2026-04-18 22:42:26 +03:00
41bec3b656 build: add ios encryption compliance 2026-04-18 22:40:48 +03:00
8ba765e3be build: update ios release changes meta 2026-04-18 11:44:41 +03:00
github-actions[bot]
6cdb74a391 chore(master): release 0.9.0 2026-04-18 11:40:09 +03:00
eb797dd0e8 feat: add search in lists 2026-04-18 11:03:51 +03:00
7243e43bbb feat: allow uploading list item image 2026-04-18 10:37:47 +03:00
82966695b4 build: add debug build variance 2026-04-17 17:21:05 +03:00
322b3e29fa chore: update gitignore 2026-04-16 18:18:22 +03:00
634ac0be6b chore: fix ios release task 2026-04-16 18:16:10 +03:00
github-actions[bot]
2852e3ecf5 chore(master): release 0.8.0 2026-04-16 18:07:46 +03:00
179c6d781c feat: add more icons to categories 2026-04-16 12:03:02 +03:00
daac6f56fd chore: cleanups 2026-04-16 11:44:56 +03:00
a447fe1c8a feat: allow adding one-off list items 2026-04-16 11:42:47 +03:00
d73fa03a25 chore: update store metadata 2026-04-15 23:49:18 +03:00
github-actions[bot]
cb7133fcd7 chore(master): release 0.7.1 2026-04-14 14:29:30 +03:00
64af382f10 fix: about urls not opening 2026-04-14 13:47:39 +03:00
a535c6b49a chore: update icons 2026-04-14 13:39:32 +03:00
c15ad85d67 chore: fix android store icon size 2026-04-14 13:15:55 +03:00
d474663d44 build: ios metadata 2026-04-14 12:37:28 +03:00
github-actions[bot]
b984aaf187 chore(master): release 0.7.0 2026-04-14 10:08:10 +03:00
fc8aa17c61 build: add ios metadata, ipa fix 2026-04-14 10:05:18 +03:00
633a1979ce build: fix ipa provision 2026-04-14 09:42:32 +03:00
0cb6c06d9d feat: add about page 2026-04-14 02:02:23 +03:00
ff593aee6d chore: update app icons 2026-04-14 02:02:14 +03:00
bd11f814d7 build: prepare ios build 2026-04-14 02:01:29 +03:00
github-actions[bot]
96059f219c chore(master): release 0.6.0 2026-04-13 14:16:37 +03:00
e7ff39a232 feat: show next due date for list items 2026-04-13 10:37:14 +03:00
11972542da fix: appbar icon spacings 2026-04-13 01:13:55 +03:00
5dcd1f25b1 build: use lefthook for hooks 2026-04-13 00:55:16 +03:00
1e85d0c2a6 fix: improve i18n recurrence string rules 2026-04-13 00:55:16 +03:00
9555eaf636 build: use remote workflow file 2026-04-12 23:06:53 +03:00
69f3a4fef9 build: amend release commit with fastlane changelog 2026-04-12 22:58:51 +03:00
github-actions[bot]
466f5a04b2 chore: update fastlane changelog for 0.5.0 2026-04-12 22:56:05 +03:00
github-actions[bot]
d44909c79f chore(master): release 0.5.0 2026-04-12 22:56:05 +03:00
9d474a62fe fix: improve rtl layout spacings 2026-04-12 22:49:07 +03:00
c72a655f6a build: update pr changelog workflow 2026-04-12 22:41:15 +03:00
32326beb8d fix: allow arbitrary text in quantity 2026-04-12 17:58:35 +03:00
ce158ad4f8 build: fix changelog pr workflow 2026-04-12 17:48:49 +03:00
7ec952620d feat: add de, es, fr locales 2026-04-12 17:45:55 +03:00
b0fcd93792 fix: rtl layout + switching 2026-04-12 17:38:33 +03:00
d7e9b62730 docs: add fastlane changelog 2026-04-12 17:21:28 +03:00
github-actions[bot]
f54f69cd3c chore(master): release 0.4.0 2026-04-12 16:32:55 +03:00
4d99694109 fix: description field in items saving+displaying 2026-04-12 14:00:04 +03:00
7c572a6e64 feat: add hebrew language translation 2026-04-12 13:45:45 +03:00
9740997709 build: set fastlane meta changes on release pr 2026-04-12 12:21:01 +03:00
da170001f0 docs: update fastlane meta 2026-04-12 11:45:08 +03:00
github-actions[bot]
4d0a75882d chore(master): release 0.3.0 2026-04-12 11:35:13 +03:00
7c57b7bcbb build: consolidate fastlane 2026-04-12 11:27:49 +03:00
c5595c0d1a feat: move items between lists 2026-04-12 11:15:39 +03:00
ea8ff9aabd feat: improve main page navigations 2026-04-12 00:42:25 +03:00
e6284b9577 fix: support back button when in photos foldeer 2026-04-12 00:37:53 +03:00
github-actions[bot]
2545e421de chore(master): release 0.2.1 2026-04-12 00:22:54 +03:00
a5c8e5b479 fix: sorting prefs persistence & error wrapping 2026-04-12 00:21:11 +03:00
e69625e8af build: only upload changed graphics, fix changelog slicing 2026-04-12 00:01:30 +03:00
234 changed files with 11017 additions and 1131 deletions

1
.flutter-version Normal file
View File

@@ -0,0 +1 @@
3.41.7

View File

@@ -11,7 +11,20 @@ permissions:
pull-requests: write
jobs:
setup:
runs-on: ubuntu-latest
outputs:
flutter-version: ${{ steps.read.outputs.version }}
steps:
- uses: actions/checkout@v4
with:
sparse-checkout: .flutter-version
sparse-checkout-cone-mode: false
- id: read
run: echo "version=$(cat .flutter-version | tr -d '[:space:]')" >> "$GITHUB_OUTPUT"
lint:
needs: setup
runs-on: ubuntu-latest
steps:
@@ -21,7 +34,7 @@ jobs:
- name: Setup Flutter
uses: subosito/flutter-action@v2
with:
channel: 'stable'
flutter-version: ${{ needs.setup.outputs.flutter-version }}
cache: true
- name: Cache pub dependencies
@@ -35,9 +48,6 @@ jobs:
- name: Install dependencies
run: flutter pub get
- name: Stub .env
run: cp .env.example .env
- name: Verify formatting
run: dart format --output=none --set-exit-if-changed .
@@ -45,6 +55,7 @@ jobs:
run: flutter analyze --no-fatal-infos
test:
needs: setup
runs-on: ubuntu-latest
steps:
@@ -54,7 +65,7 @@ jobs:
- name: Setup Flutter
uses: subosito/flutter-action@v2
with:
channel: 'stable'
flutter-version: ${{ needs.setup.outputs.flutter-version }}
cache: true
- name: Cache pub dependencies
@@ -68,12 +79,8 @@ jobs:
- name: Install dependencies
run: flutter pub get
- name: Stub .env
run: cp .env.example .env
- name: Run tests
run: flutter test --coverage --dart-define-from-file=.env
run: flutter test --coverage
- name: Upload coverage
uses: codecov/codecov-action@v4
with:
@@ -83,21 +90,15 @@ jobs:
release-please:
needs: [lint, test]
if: github.event_name == 'push' && github.ref == 'refs/heads/master'
runs-on: ubuntu-latest
outputs:
release_created: ${{ steps.release.outputs.release_created }}
tag_name: ${{ steps.release.outputs.tag_name }}
version: ${{ steps.release.outputs.version }}
steps:
- name: Release Please
id: release
uses: googleapis/release-please-action@v4
with:
release-type: dart
uses: chenasraf/workflows/.github/workflows/release-please-fastlane-changelog.yml@master
with:
release-type: dart
fastlane-changelog-dirs: |
fastlane/metadata/android/en-US/changelogs
fastlane/metadata/ios/en-US/changelogs
build-android:
needs: release-please
needs: [setup, release-please]
if: ${{ needs.release-please.outputs.release_created }}
runs-on: ubuntu-latest
@@ -115,7 +116,7 @@ jobs:
- name: Setup Flutter
uses: subosito/flutter-action@v2
with:
channel: 'stable'
flutter-version: ${{ needs.setup.outputs.flutter-version }}
cache: true
- name: Cache pub dependencies
@@ -129,8 +130,8 @@ jobs:
- name: Install dependencies
run: flutter pub get
- name: Create .env
run: cp .env.example .env
- name: Remove JNI build-id for reproducible builds
run: sed -i -e 's/-Wl,/-Wl,--build-id=none,/' $PUB_CACHE/hosted/pub.dev/jni-*/src/CMakeLists.txt
- name: Decode keystore
run: echo ${{ secrets.ANDROID_KEYSTORE_BASE64 }} | base64 -d > android/app/upload-keystore.jks
@@ -144,23 +145,35 @@ jobs:
storeFile=upload-keystore.jks
EOF
- name: Build APK
run: flutter build apk --release --obfuscate --split-debug-info=build/debug-info-apk --dart-define-from-file=.env
- name: Print signing key SHA-256
run: |
keytool -list -v -keystore android/app/upload-keystore.jks \
-alias ${{ secrets.ANDROID_KEY_ALIAS }} \
-storepass ${{ secrets.ANDROID_STORE_PASSWORD }} \
2>/dev/null | grep "SHA256:" | awk '{print $2}'
- name: Build split APKs
run: flutter build apk --release --split-per-abi
- name: Build App Bundle
run: flutter build appbundle --release --obfuscate --split-debug-info=build/debug-info-aab --dart-define-from-file=.env
run: flutter build appbundle --release --obfuscate --split-debug-info=build/debug-info-aab
- name: Rename artifacts
run: |
mv build/app/outputs/flutter-apk/app-release.apk build/app/outputs/flutter-apk/pantry-${{ needs.release-please.outputs.version }}.apk
mv build/app/outputs/bundle/release/app-release.aab build/app/outputs/bundle/release/pantry-${{ needs.release-please.outputs.version }}.aab
VERSION=${{ needs.release-please.outputs.version }}
APK_DIR=build/app/outputs/flutter-apk
mv ${APK_DIR}/app-armeabi-v7a-release.apk ${APK_DIR}/pantry-${VERSION}-armeabi-v7a.apk
mv ${APK_DIR}/app-arm64-v8a-release.apk ${APK_DIR}/pantry-${VERSION}-arm64-v8a.apk
mv ${APK_DIR}/app-x86_64-release.apk ${APK_DIR}/pantry-${VERSION}-x86_64.apk
mv build/app/outputs/bundle/release/app-release.aab build/app/outputs/bundle/release/pantry-${VERSION}.aab
- name: Upload APK to release
- name: Upload APKs to release
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ needs.release-please.outputs.tag_name }}
files: |
build/app/outputs/flutter-apk/pantry-${{ needs.release-please.outputs.version }}.apk
build/app/outputs/flutter-apk/pantry-${{ needs.release-please.outputs.version }}-armeabi-v7a.apk
build/app/outputs/flutter-apk/pantry-${{ needs.release-please.outputs.version }}-arm64-v8a.apk
build/app/outputs/flutter-apk/pantry-${{ needs.release-please.outputs.version }}-x86_64.apk
- name: Upload App Bundle to release
uses: softprops/action-gh-release@v2
@@ -170,7 +183,7 @@ jobs:
build/app/outputs/bundle/release/pantry-${{ needs.release-please.outputs.version }}.aab
build-ios:
needs: release-please
needs: [setup, release-please]
if: false # TEMPORARILY DISABLED — was: ${{ needs.release-please.outputs.release_created }}
runs-on: macos-latest
@@ -181,7 +194,7 @@ jobs:
- name: Setup Flutter
uses: subosito/flutter-action@v2
with:
channel: 'stable'
flutter-version: ${{ needs.setup.outputs.flutter-version }}
cache: true
- name: Cache pub dependencies
@@ -204,12 +217,8 @@ jobs:
- name: Install dependencies
run: flutter pub get
- name: Create .env
run: cp .env.example .env
- name: Build iOS (no codesign)
run: flutter build ios --release --no-codesign --obfuscate --split-debug-info=build/debug-info-ios --dart-define-from-file=.env
run: flutter build ios --release --no-codesign --obfuscate --split-debug-info=build/debug-info-ios
- name: Create unsigned IPA
run: |
mkdir -p build/ios/ipa

11
.gitignore vendored
View File

@@ -47,6 +47,8 @@ app.*.map.json
# Environment
.env
.envrc
/.flutter-flags.yml
# Android signing
android/key.properties
@@ -54,7 +56,8 @@ android/app/*.jks
android/app/*.keystore
# Fastlane
android/fastlane/play-store-key.json
ios/fastlane/report.xml
android/fastlane/report.xml
/.envrc
fastlane/play-store-key.json
fastlane/.image_hashes.json
fastlane/report.xml
fastlane/Preview.html
fastlane/metadata/ios/en-US/release_notes.txt

View File

@@ -1,5 +1,195 @@
# Changelog
## [0.11.0](https://github.com/chenasraf/pantry-flutter/compare/v0.10.1...v0.11.0) (2026-05-12)
### Features
* add setting to require checkbox tap to complete checklist items ([ef2bc85](https://github.com/chenasraf/pantry-flutter/commit/ef2bc851deedc180dda51fbfb7378aef7145cf5f))
### Bug Fixes
* preserve subpath for Nextcloud instances hosted on sub-paths ([0c575ea](https://github.com/chenasraf/pantry-flutter/commit/0c575eaa2601dc8c83c6b874f2d81b54a0f6bf01))
## [0.10.1](https://github.com/chenasraf/pantry-flutter/compare/v0.10.0...v0.10.1) (2026-04-26)
### Bug Fixes
* make markdown links clickable ([7b5f9c1](https://github.com/chenasraf/pantry-flutter/commit/7b5f9c151845dde90275a8289b3114483d2b214d))
## [0.10.0](https://github.com/chenasraf/pantry-flutter/compare/v0.9.10...v0.10.0) (2026-04-21)
### Features
* update notes view & edit ui ([36a74b3](https://github.com/chenasraf/pantry-flutter/commit/36a74b39e1beb37fc2f1446f8d45945a22289c6b))
### Bug Fixes
* bug where note grid would not clip correctly ([08159fa](https://github.com/chenasraf/pantry-flutter/commit/08159faec22422da983f23685c53b45088d74b2a))
## [0.9.10](https://github.com/chenasraf/pantry-flutter/compare/v0.9.9...v0.9.10) (2026-04-19)
### Build System
* fix signing ([9f45b23](https://github.com/chenasraf/pantry-flutter/commit/9f45b2344ef87708d55889e8fb80f465808fb0c7))
## [0.9.9](https://github.com/chenasraf/pantry-flutter/compare/v0.9.8...v0.9.9) (2026-04-19)
### Build System
* re-sign with stripping ([852e9c4](https://github.com/chenasraf/pantry-flutter/commit/852e9c47f3cf11145a72ed78b6415ecd0da2b111))
## [0.9.8](https://github.com/chenasraf/pantry-flutter/compare/v0.9.7...v0.9.8) (2026-04-19)
### Build System
* strip deps metadata from build ([132d9e3](https://github.com/chenasraf/pantry-flutter/commit/132d9e33a6662554149a7941053594c6c7ab9043))
## [0.9.7](https://github.com/chenasraf/pantry-flutter/compare/v0.9.6...v0.9.7) (2026-04-19)
### Build System
* disable deps metadata in apk ([7ea2901](https://github.com/chenasraf/pantry-flutter/commit/7ea2901867b25e2c4bcd46cd744af7b12656b6dd))
## [0.9.6](https://github.com/chenasraf/pantry-flutter/compare/v0.9.5...v0.9.6) (2026-04-19)
### Build System
* remove zipalign ([b1d7ecc](https://github.com/chenasraf/pantry-flutter/commit/b1d7eccd822fcbac56683a4085a329784c71ca7f))
## [0.9.5](https://github.com/chenasraf/pantry-flutter/compare/v0.9.4...v0.9.5) (2026-04-19)
### Build System
* zipalign ([6d2173f](https://github.com/chenasraf/pantry-flutter/commit/6d2173f08d72d8e188c9a4aabe044ff922d4b32f))
## [0.9.4](https://github.com/chenasraf/pantry-flutter/compare/v0.9.3...v0.9.4) (2026-04-19)
### Build System
* remove apk obfuscation ([d41d2b8](https://github.com/chenasraf/pantry-flutter/commit/d41d2b81beb512384cb3c2978bebd201c3bf53a0))
## [0.9.3](https://github.com/chenasraf/pantry-flutter/compare/v0.9.2...v0.9.3) (2026-04-19)
### Build System
* upgrade flutter version ([3e4051a](https://github.com/chenasraf/pantry-flutter/commit/3e4051a8462271543381496a9d60a22239b8d8da))
## [0.9.2](https://github.com/chenasraf/pantry-flutter/compare/v0.9.1...v0.9.2) (2026-04-19)
### Build System
* reproducible build ([9d4c832](https://github.com/chenasraf/pantry-flutter/commit/9d4c8327b035eb0433d6d0a571af406ffca84f83))
## [0.9.1](https://github.com/chenasraf/pantry-flutter/compare/v0.9.0...v0.9.1) (2026-04-18)
### Build System
* add abi split ([7d0c793](https://github.com/chenasraf/pantry-flutter/commit/7d0c7932ea9bf18d5ff391351f0058889abba5d8))
## [0.9.0](https://github.com/chenasraf/pantry-flutter/compare/v0.8.0...v0.9.0) (2026-04-18)
### Features
* add search in lists ([eb797dd](https://github.com/chenasraf/pantry-flutter/commit/eb797dd0e87f7eb14576a3bdf7e77f9fe1c0cb09))
* allow uploading list item image ([7243e43](https://github.com/chenasraf/pantry-flutter/commit/7243e43bbbfe8072327fc921ed2a4ffba228bd3f))
## [0.8.0](https://github.com/chenasraf/pantry-flutter/compare/v0.7.1...v0.8.0) (2026-04-16)
### Features
* add more icons to categories ([179c6d7](https://github.com/chenasraf/pantry-flutter/commit/179c6d781c1342434608b9af88daa807795c9a46))
* allow adding one-off list items ([a447fe1](https://github.com/chenasraf/pantry-flutter/commit/a447fe1c8a1d9de655c081015f287afeba75bee1))
## [0.7.1](https://github.com/chenasraf/pantry-flutter/compare/v0.7.0...v0.7.1) (2026-04-14)
### Bug Fixes
* about urls not opening ([64af382](https://github.com/chenasraf/pantry-flutter/commit/64af382f10bd696f05a23d31ee8e04d746fc4b46))
## [0.7.0](https://github.com/chenasraf/pantry-flutter/compare/v0.6.0...v0.7.0) (2026-04-14)
### Features
* add about page ([0cb6c06](https://github.com/chenasraf/pantry-flutter/commit/0cb6c06d9d418b61d5fd1c4852ec244366aa6af8))
## [0.6.0](https://github.com/chenasraf/pantry-flutter/compare/v0.5.0...v0.6.0) (2026-04-13)
### Features
* show next due date for list items ([e7ff39a](https://github.com/chenasraf/pantry-flutter/commit/e7ff39a2328ecd9967a3b162dc389bac8a645f38))
### Bug Fixes
* appbar icon spacings ([1197254](https://github.com/chenasraf/pantry-flutter/commit/11972542da777a5922aec564684b7f37b3330aa0))
* improve i18n recurrence string rules ([1e85d0c](https://github.com/chenasraf/pantry-flutter/commit/1e85d0c2a6d46d7561105f02683bbed97c907792))
## [0.5.0](https://github.com/chenasraf/pantry-flutter/compare/v0.4.0...v0.5.0) (2026-04-12)
### Features
* add de, es, fr locales ([7ec9526](https://github.com/chenasraf/pantry-flutter/commit/7ec952620db2d957278d58c3798e5b03ab8c59fc))
### Bug Fixes
* allow arbitrary text in quantity ([32326be](https://github.com/chenasraf/pantry-flutter/commit/32326beb8d39d4713c9f65d01dfb243c44a5dbda))
* improve rtl layout spacings ([9d474a6](https://github.com/chenasraf/pantry-flutter/commit/9d474a62fe6ae19f3c08cdb634eac725ffb403c4))
* rtl layout + switching ([b0fcd93](https://github.com/chenasraf/pantry-flutter/commit/b0fcd937922badb59467f1bf164e3668c658e531))
## [0.4.0](https://github.com/chenasraf/pantry-flutter/compare/v0.3.0...v0.4.0) (2026-04-12)
### Features
* add hebrew language translation ([7c572a6](https://github.com/chenasraf/pantry-flutter/commit/7c572a6e64eafcf3433a2e6599b698312ffa9cbe))
### Bug Fixes
* description field in items saving+displaying ([4d99694](https://github.com/chenasraf/pantry-flutter/commit/4d9969410935d0b8d64fcfbc3e11d317a17979a6))
## [0.3.0](https://github.com/chenasraf/pantry-flutter/compare/v0.2.1...v0.3.0) (2026-04-12)
### Features
* improve main page navigations ([ea8ff9a](https://github.com/chenasraf/pantry-flutter/commit/ea8ff9aabd0924f8273927c907b800576c7cd697))
* move items between lists ([c5595c0](https://github.com/chenasraf/pantry-flutter/commit/c5595c0d1ae07c3c2dbf35fba5a70a957fc9af17))
### Bug Fixes
* support back button when in photos foldeer ([e6284b9](https://github.com/chenasraf/pantry-flutter/commit/e6284b95774a5bd967af95626acb6ec3562ae9a5))
## [0.2.1](https://github.com/chenasraf/pantry-flutter/compare/v0.2.0...v0.2.1) (2026-04-11)
### Bug Fixes
* sorting prefs persistence & error wrapping ([a5c8e5b](https://github.com/chenasraf/pantry-flutter/commit/a5c8e5b479e92f87ea910b5af19ca24711ce7b16))
## [0.2.0](https://github.com/chenasraf/pantry-flutter/compare/v0.1.0...v0.2.0) (2026-04-11)

View File

@@ -8,8 +8,8 @@ GEM
artifactory (3.0.17)
atomos (0.1.3)
aws-eventstream (1.4.0)
aws-partitions (1.1237.0)
aws-sdk-core (3.244.0)
aws-partitions (1.1240.0)
aws-sdk-core (3.245.0)
aws-eventstream (~> 1, >= 1.3.0)
aws-partitions (~> 1, >= 1.992.0)
aws-sigv4 (~> 1.9)
@@ -29,7 +29,7 @@ GEM
babosa (1.0.4)
base64 (0.2.0)
benchmark (0.5.0)
bigdecimal (4.1.1)
bigdecimal (4.1.2)
claide (1.1.0)
colored (1.2)
colored2 (3.1.2)
@@ -72,7 +72,7 @@ GEM
faraday_middleware (1.2.1)
faraday (~> 1.0)
fastimage (2.4.1)
fastlane (2.232.2)
fastlane (2.233.0)
CFPropertyList (>= 2.3, < 4.0.0)
abbrev (~> 0.1.2)
addressable (>= 2.8, < 3.0.0)
@@ -92,7 +92,7 @@ GEM
faraday-cookie_jar (~> 0.0.6)
faraday_middleware (~> 1.0)
fastimage (>= 2.1.0, < 3.0.0)
fastlane-sirp (>= 1.0.0)
fastlane-sirp (>= 1.1.0)
gh_inspector (>= 1.1.2, < 2.0.0)
google-apis-androidpublisher_v3 (~> 0.3)
google-apis-playcustomapp_v1 (~> 0.1)
@@ -122,10 +122,9 @@ GEM
xcodeproj (>= 1.13.0, < 2.0.0)
xcpretty (~> 0.4.1)
xcpretty-travis-formatter (>= 0.0.3, < 2.0.0)
fastlane-sirp (1.0.0)
sysrandom (~> 1.0)
fastlane-sirp (1.1.0)
gh_inspector (1.1.3)
google-apis-androidpublisher_v3 (0.98.0)
google-apis-androidpublisher_v3 (0.99.0)
google-apis-core (>= 0.15.0, < 2.a)
google-apis-core (0.18.0)
addressable (~> 2.5, >= 2.5.1)
@@ -169,13 +168,13 @@ GEM
httpclient (2.9.0)
mutex_m
jmespath (1.6.2)
json (2.19.3)
json (2.19.4)
jwt (2.10.2)
base64
logger (1.7.0)
mini_magick (4.13.2)
mini_mime (1.1.5)
multi_json (1.19.1)
multi_json (1.20.1)
multipart-post (2.4.1)
mutex_m (0.3.0)
nanaimo (0.4.0)
@@ -186,7 +185,7 @@ GEM
ostruct (0.6.3)
plist (3.7.2)
public_suffix (7.0.5)
rake (13.3.1)
rake (13.4.2)
representable (3.2.0)
declarative (< 0.1.0)
trailblazer-option (>= 0.1.1, < 0.2.0)
@@ -205,7 +204,6 @@ GEM
simctl (1.6.10)
CFPropertyList
naturally
sysrandom (1.0.5)
terminal-notifier (2.0.0)
terminal-table (3.0.2)
unicode-display_width (>= 1.1.1, < 3)
@@ -243,15 +241,15 @@ CHECKSUMS
artifactory (3.0.17) sha256=3023d5c964c31674090d655a516f38ca75665c15084140c08b7f2841131af263
atomos (0.1.3) sha256=7d43b22f2454a36bace5532d30785b06de3711399cb1c6bf932573eda536789f
aws-eventstream (1.4.0) sha256=116bf85c436200d1060811e6f5d2d40c88f65448f2125bc77ffce5121e6e183b
aws-partitions (1.1237.0) sha256=9b82f529b69ad83a8e4c5e123038924ed5e8f59bd6064a293ef20efc63364841
aws-sdk-core (3.244.0) sha256=3e458c078b0c5bdee95bc370c3a483374b3224cf730c1f9f0faf849a5d9a18ea
aws-partitions (1.1240.0) sha256=b885b21712fdad699c56a28434756ed27f1389b07231320796dda9e7551de4a7
aws-sdk-core (3.245.0) sha256=94f43b40508c346f1625b3d31f811c5841b667c92de14d5fb3c473b1284cb4ad
aws-sdk-kms (1.123.0) sha256=d405f37e82f8fa32045ca8980be266c0b45b37aaf2012afe0254321a1e811f20
aws-sdk-s3 (1.219.0) sha256=6a755d7377978525758b3c29185ca6a10128ce2b07555ca37c4549de10c2f1c7
aws-sigv4 (1.12.1) sha256=6973ff95cb0fd0dc58ba26e90e9510a2219525d07620c8babeb70ef831826c00
babosa (1.0.4) sha256=18dea450f595462ed7cb80595abd76b2e535db8c91b350f6c4b3d73986c5bc99
base64 (0.2.0) sha256=0f25e9b21a02a0cc0cea8ef92b2041035d39350946e8789c562b2d1a3da01507
benchmark (0.5.0) sha256=465df122341aedcb81a2a24b4d3bd19b6c67c1530713fd533f3ff034e419236c
bigdecimal (4.1.1) sha256=1c09efab961da45203c8316b0cdaec0ff391dfadb952dd459584b63ebf8054ca
bigdecimal (4.1.2) sha256=53d217666027eab4280346fba98e7d5b66baaae1b9c3c1c0ffe89d48188a3fbd
claide (1.1.0) sha256=6d3c5c089dde904d96aa30e73306d0d4bd444b1accb9b3125ce14a3c0183f82e
colored (1.2) sha256=9d82b47ac589ce7f6cab64b1f194a2009e9fd00c326a5357321f44afab2c1d2c
colored2 (3.1.2) sha256=b13c2bd7eeae2cf7356a62501d398e72fde78780bd26aec6a979578293c28b4a
@@ -277,10 +275,10 @@ CHECKSUMS
faraday-retry (1.0.4) sha256=dc659233777fabf96c69c2ffe56c0a5d2c102af90321a42cc6c90157bcd716aa
faraday_middleware (1.2.1) sha256=d45b78c8ee864c4783fbc276f845243d4a7918a67301c052647bacabec0529e9
fastimage (2.4.1) sha256=c64bebd46b6fd8943ab70c1e6e85ff728f970f2e48f92ecd249b6bc3a540ad20
fastlane (2.232.2) sha256=978689f60f0fc3d54699de86ef12be4eda9f5b52217c1798965257c390d2b112
fastlane-sirp (1.0.0) sha256=66478f25bcd039ec02ccf65625373fca29646fa73d655eb533c915f106c5e641
fastlane (2.233.0) sha256=b07087aaf13e7a4bcb07f853d91780193262b9f048861a24aa5e0f24069b8092
fastlane-sirp (1.1.0) sha256=10bc94f9682efd8e1badfb31452a76dd8981f1f3a33717c765fde6d75b54d847
gh_inspector (1.1.3) sha256=04cca7171b87164e053aa43147971d3b7f500fcb58177698886b48a9fc4a1939
google-apis-androidpublisher_v3 (0.98.0) sha256=094fb952419c1131c16c4dfa66e0c96e6a2fa33adbe266f614b84b22cbc8c5cb
google-apis-androidpublisher_v3 (0.99.0) sha256=a0452fdd99cb7672cc95cac07429305f8aaee54c22e4875224cf675b1ab59729
google-apis-core (0.18.0) sha256=96b057816feeeab448139ed5b5c78eab7fc2a9d8958f0fbc8217dedffad054ee
google-apis-iamcredentials_v1 (0.26.0) sha256=3ff70a10a1d6cddf2554e95b7c5df2c26afdeaeb64100048a355194da19e48a3
google-apis-playcustomapp_v1 (0.17.0) sha256=d5bc90b705f3f862bab4998086449b0abe704ee1685a84821daa90ca7fa95a78
@@ -294,12 +292,12 @@ CHECKSUMS
http-cookie (1.0.8) sha256=b14fe0445cf24bf9ae098633e9b8d42e4c07c3c1f700672b09fbfe32ffd41aa6
httpclient (2.9.0) sha256=4b645958e494b2f86c2f8a2f304c959baa273a310e77a2931ddb986d83e498c8
jmespath (1.6.2) sha256=238d774a58723d6c090494c8879b5e9918c19485f7e840f2c1c7532cf84ebcb1
json (2.19.3) sha256=289b0bb53052a1fa8c34ab33cc750b659ba14a5c45f3fcf4b18762dc67c78646
json (2.19.4) sha256=670a7d333fb3b18ca5b29cb255eb7bef099e40d88c02c80bd42a3f30fe5239ac
jwt (2.10.2) sha256=31e1ee46f7359883d5e622446969fe9c118c3da87a0b1dca765ce269c3a0c4f4
logger (1.7.0) sha256=196edec7cc44b66cfb40f9755ce11b392f21f7967696af15d274dde7edff0203
mini_magick (4.13.2) sha256=71d6258e0e8a3d04a9a0a09784d5d857b403a198a51dd4f882510435eb95ddd9
mini_mime (1.1.5) sha256=8681b7e2e4215f2a159f9400b5816d85e9d8c6c6b491e96a12797e798f8bccef
multi_json (1.19.1) sha256=7aefeff8f2c854bf739931a238e4aea64592845e0c0395c8a7d2eea7fdd631b7
multi_json (1.20.1) sha256=2f3934e805cc45ef91b551a1f89d0e9191abd06a5e04a2ef09a6a036c452ca6d
multipart-post (2.4.1) sha256=9872d03a8e552020ca096adadbf5e3cb1cd1cdd6acd3c161136b8a5737cdb4a8
mutex_m (0.3.0) sha256=cfcb04ac16b69c4813777022fdceda24e9f798e48092a2b817eb4c0a782b0751
nanaimo (0.4.0) sha256=faf069551bab17f15169c1f74a1c73c220657e71b6e900919897a10d991d0723
@@ -310,7 +308,7 @@ CHECKSUMS
ostruct (0.6.3) sha256=95a2ed4a4bd1d190784e666b47b2d3f078e4a9efda2fccf18f84ddc6538ed912
plist (3.7.2) sha256=d37a4527cc1116064393df4b40e1dbbc94c65fa9ca2eec52edf9a13616718a42
public_suffix (7.0.5) sha256=1a8bb08f1bbea19228d3bed6e5ed908d1cb4f7c2726d18bd9cadf60bc676f623
rake (13.3.1) sha256=8c9e89d09f66a26a01264e7e3480ec0607f0c497a861ef16063604b1b08eb19c
rake (13.4.2) sha256=cb825b2bd5f1f8e91ca37bddb4b9aaf345551b4731da62949be002fa89283701
representable (3.2.0) sha256=cc29bf7eebc31653586849371a43ffe36c60b54b0a6365b5f7d95ec34d1ebace
retriable (3.4.1) sha256=fb3f114b7d492121c158c01f3d5152b5a615c5b70d5877d0bc08c7ec3725c3bc
rexml (3.4.4) sha256=19e0a2c3425dfbf2d4fc1189747bdb2f849b6c5e74180401b15734bc97b5d142
@@ -320,7 +318,6 @@ CHECKSUMS
security (0.1.5) sha256=3a977a0eca7706e804c96db0dd9619e0a94969fe3aac9680fcfc2bf9b8a833b7
signet (0.21.0) sha256=d617e9fbf24928280d39dcfefba9a0372d1c38187ffffd0a9283957a10a8cd5b
simctl (1.6.10) sha256=b99077f4d13ad81eace9f86bf5ba4df1b0b893a4d1b368bd3ed59b5b27f9236b
sysrandom (1.0.5) sha256=5ac1ac3c2ec64ef76ac91018059f541b7e8f437fbda1ccddb4f2c56a9ccf1e75
terminal-notifier (2.0.0) sha256=7a0d2b2212ab9835c07f4b2e22a94cff64149dba1eed203c04835f7991078cea
terminal-table (3.0.2) sha256=f951b6af5f3e00203fb290a669e0a85c5dd5b051b3b023392ccfd67ba5abae91
trailblazer-option (0.1.2) sha256=20e4f12ea4e1f718c8007e7944ca21a329eee4eed9e0fa5dde6e8ad8ac4344a3

142
Makefile
View File

@@ -1,9 +1,6 @@
# Version from pubspec.yaml (without build number)
VERSION := $(shell grep '^version:' pubspec.yaml | sed 's/version: *//;s/+.*//')
# Get staged Dart files
STAGED_DART_FILES := $(shell git diff --cached --name-only --diff-filter=ACM | grep '\.dart$$' 2>/dev/null)
# Default target
.PHONY: help
help:
@@ -12,7 +9,7 @@ help:
@echo " Setup:"
@echo " get Install dependencies"
@echo " clean Clean build artifacts"
@echo " install-precommit Install git pre-commit hook"
@echo " install-hooks Install git hooks via lefthook"
@echo " pods Update CocoaPods repo and install pods"
@echo ""
@echo " i18n:"
@@ -21,14 +18,9 @@ help:
@echo ""
@echo " Development:"
@echo " run Run the app in debug mode"
@echo " webapp-run Run the web app in default browser"
@echo " format Format staged Dart files"
@echo " analyze Analyze staged Dart files"
@echo " check Check staged files (format + analyze, no changes)"
@echo " precommit Run pre-commit checks on staged files"
@echo " format-all Format all Dart files"
@echo " analyze-all Analyze all Dart files"
@echo " check-all Check all files (format + analyze, no changes)"
@echo " format Format all Dart files"
@echo " analyze Analyze all Dart files"
@echo " check Check all files (format + analyze, no changes)"
@echo ""
@echo " Testing:"
@echo " test Run all tests"
@@ -44,23 +36,24 @@ help:
@echo " Building:"
@echo " android-install Build APK and install on connected device"
@echo " android-build-apk Build Android APK"
@echo " android-build-apk-split Build Android split-per-ABI APKs"
@echo " android-build-aab Build Android App Bundle"
@echo " android-push Build APK and push to device via adb"
@echo " ios-build Build iOS (no codesign)"
@echo " web-build Build web app"
@echo " build-all Build all platforms"
@echo ""
@echo " Release:"
@echo " android-release-apk Build APK and copy to build/release/"
@echo " android-release-aab Build AAB and copy to build/release/"
@echo " ios-release Build iOS and create unsigned IPA in build/release/"
@echo " web-release Build web and create zip in build/release/"
@echo " release-all Build and release all platforms"
@echo ""
@echo " Deploying:"
@echo " android-deploy Build AAB and upload to Google Play (TRACK=internal|beta|production, STATUS=draft|completed)"
@echo " android-promote Promote release between tracks (FROM=internal, TO=production, STATUS=draft|completed)"
@echo " ios-deploy Build IPA and upload (DEST=testflight|appstore, default: testflight)"
@echo " release-production Build and deploy to production (Google Play + App Store)"
@echo " release-beta Build and deploy to beta (Google Play beta + TestFlight)"
# Setup
.PHONY: get
@@ -79,6 +72,7 @@ build-clean:
# i18n
.PHONY: i18n
i18n:
dart run tool/fix_i18n_escapes.dart
dart run build_runner build --delete-conflicting-outputs
.PHONY: i18n-watch
@@ -88,58 +82,17 @@ i18n-watch:
# Development
.PHONY: run
run:
flutter run --dart-define-from-file=.env
.PHONY: webapp-run
webapp-run:
open http://localhost:5111 & flutter run -d web-server --web-port=5111 --dart-define-from-file=.env
flutter run
.PHONY: format
format:
@if [ -n "$(STAGED_DART_FILES)" ]; then \
echo "Formatting staged files..."; \
dart format $(STAGED_DART_FILES); \
else \
echo "No staged Dart files to format."; \
fi
dart format .
.PHONY: analyze
analyze:
@if [ -n "$(STAGED_DART_FILES)" ]; then \
echo "Analyzing staged files..."; \
dart analyze $(STAGED_DART_FILES); \
else \
echo "No staged Dart files to analyze."; \
fi
flutter analyze --no-fatal-infos
.PHONY: check
check:
@if [ -n "$(STAGED_DART_FILES)" ]; then \
echo "Checking staged files..."; \
dart format --output=none --set-exit-if-changed $(STAGED_DART_FILES); \
dart analyze $(STAGED_DART_FILES); \
else \
echo "No staged Dart files to check."; \
fi
.PHONY: precommit
precommit: format analyze
@if [ -n "$(STAGED_DART_FILES)" ]; then \
echo "Re-staging formatted files..."; \
git add $(STAGED_DART_FILES); \
fi
# Full project commands
.PHONY: format-all
format-all:
dart format .
.PHONY: analyze-all
analyze-all:
flutter analyze --no-fatal-infos
.PHONY: check-all
check-all:
dart format --output=none --set-exit-if-changed .
flutter analyze --no-fatal-infos
@@ -147,21 +100,23 @@ check-all:
.PHONY: test
test:
ifdef FILES
flutter test $(FILES) --dart-define-from-file=.env
flutter test $(FILES)
else
flutter test --dart-define-from-file=.env
flutter test
endif
.PHONY: test-coverage
test-coverage:
flutter test --coverage --dart-define-from-file=.env
flutter test --coverage
@echo "Coverage report generated at coverage/lcov.info"
# Building
.PHONY: android-build-apk
android-build-apk:
flutter build apk --release --obfuscate --split-debug-info=build/debug-info-apk --dart-define-from-file=.env
flutter build apk --release --obfuscate --split-debug-info=build/debug-info-apk
.PHONY: android-build-apk-split
android-build-apk-split:
flutter build apk --release --split-per-abi --obfuscate --split-debug-info=build/debug-info-apk
.PHONY: android-install
android-install: android-build-apk
flutter install
@@ -173,18 +128,16 @@ android-push: android-build-apk
.PHONY: android-build-aab
android-build-aab:
flutter build appbundle --release --obfuscate --split-debug-info=build/debug-info-aab --dart-define-from-file=.env
flutter build appbundle --release --obfuscate --split-debug-info=build/debug-info-aab
.PHONY: ios-build
ios-build:
flutter build ios --release --no-codesign --obfuscate --split-debug-info=build/debug-info-ios
.PHONY: ios-build-ipa
ios-build-ipa:
flutter build ipa --release --obfuscate --split-debug-info=build/debug-info-ios --dart-define-from-file=.env --export-options-plist=ios/ExportOptions.plist
.PHONY: web-build
web-build:
flutter build web --release --dart-define-from-file=.env
.PHONY: build-all
build-all: android-build-apk android-build-aab web-build
build-all: android-build-apk android-build-aab
# Release (build + copy renamed artifacts to build/release/)
.PHONY: android-release-apk
@@ -210,7 +163,7 @@ android-upload:
@echo "$(or $(TRACK),beta)" | grep -qE '^(internal|alpha|beta|production)$$' || (echo "Error: Invalid TRACK '$(TRACK)'. Must be: internal, alpha, beta, production"; exit 1)
@echo "$(or $(STATUS),draft)" | grep -qE '^(draft|completed|halted|inProgress)$$' || (echo "Error: Invalid STATUS '$(STATUS)'. Must be: draft, completed, halted, inProgress"; exit 1)
@echo "Track: $(or $(TRACK),internal) | Status: $(or $(STATUS),draft)"
cd android && bundle exec fastlane deploy track:$(or $(TRACK),internal) status:$(or $(STATUS),draft)
bundle exec fastlane deploy track:$(or $(TRACK),internal) status:$(or $(STATUS),draft)
.PHONY: android-deploy
android-deploy: android-build-aab android-upload
@@ -221,29 +174,33 @@ android-promote:
@echo "$(or $(TO),production)" | grep -qE '^(internal|alpha|beta|production)$$' || (echo "Error: Invalid TO '$(TO)'. Must be: internal, alpha, beta, production"; exit 1)
@echo "$(or $(STATUS),draft)" | grep -qE '^(draft|completed|halted|inProgress)$$' || (echo "Error: Invalid STATUS '$(STATUS)'. Must be: draft, completed, halted, inProgress"; exit 1)
@echo "Promote: $(or $(FROM),internal) -> $(or $(TO),production) | Status: $(or $(STATUS),draft)"
cd android && bundle exec fastlane promote from:$(or $(FROM),internal) to:$(or $(TO),production) status:$(or $(STATUS),draft)
bundle exec fastlane promote from:$(or $(FROM),internal) to:$(or $(TO),production) status:$(or $(STATUS),draft)
.PHONY: ios-upload
ios-upload:
@echo "$(or $(DEST),testflight)" | grep -qE '^(testflight|appstore)$$' || (echo "Error: Invalid DEST '$(DEST)'. Must be: testflight, appstore"; exit 1)
@echo "Destination: $(or $(DEST),testflight)"
@if [ "$(or $(DEST),testflight)" = "appstore" ]; then \
cd ios && bundle exec fastlane release; \
bundle exec fastlane ios release; \
else \
cd ios && bundle exec fastlane beta; \
bundle exec fastlane ios beta; \
fi
.PHONY: ios-deploy
ios-deploy: ios-build ios-upload
.PHONY: web-release
web-release: web-build
mkdir -p build/release
cd build/web && zip -r ../release/pantry-$(VERSION)-web.zip .
@echo "-> build/release/pantry-$(VERSION)-web.zip"
ios-deploy: ios-build-ipa ios-upload
.PHONY: release-all
release-all: build-clean android-release-apk android-release-aab web-release
release-all: android-release-apk android-release-aab
.PHONY: release-production
release-production:
$(MAKE) android-deploy TRACK=production STATUS=completed
$(MAKE) ios-deploy DEST=appstore
.PHONY: release-beta
release-beta:
$(MAKE) android-deploy TRACK=beta STATUS=completed
$(MAKE) ios-deploy DEST=testflight
# CocoaPods
.PHONY: pods
@@ -252,17 +209,9 @@ pods:
cd macos && pod install --repo-update
# Git hooks
.PHONY: install-precommit
install-precommit:
@if [ ! -f .git/hooks/pre-commit ]; then \
echo "Installing pre-commit hook..."; \
echo '#!/bin/sh' > .git/hooks/pre-commit; \
echo 'make precommit' >> .git/hooks/pre-commit; \
chmod +x .git/hooks/pre-commit; \
echo "Pre-commit hook installed."; \
else \
echo "Pre-commit hook already exists, skipping."; \
fi
.PHONY: install-hooks
install-hooks:
lefthook install
# API
.PHONY: fetch-openapi
@@ -287,11 +236,14 @@ endif
.PHONY: icons
icons:
mkdir -p assets/icon
rsvg-convert -h 1024 assets/logo_icon.svg > assets/icon/icon.png
rsvg-convert -w 1024 -h 1024 assets/logo_icon_squircle.svg > assets/icon/icon.png
rsvg-convert -w 1024 -h 1024 assets/logo_icon_square.svg > assets/icon/icon_ios.png
rsvg-convert -w 1024 -h 1024 assets/logo_icon_foreground.svg > assets/icon/icon_foreground.png
dart run flutter_launcher_icons
rsvg-convert -w 512 -h 512 assets/logo_icon_squircle.svg > fastlane/metadata/android/en-US/images/icon.png
.PHONY: splash
splash:
mkdir -p assets/icon
rsvg-convert -h 512 --page-width 1024 --page-height 1024 --top 256 --left 256 assets/logo_icon.svg > assets/icon/splash.png
rsvg-convert -h 1152 --page-width 1920 --page-height 1920 --top 384 --left 384 assets/logo_icon.svg > assets/icon/splash.png
dart run flutter_native_splash:create

View File

@@ -43,9 +43,9 @@ It may take a few minutes for your tester status to propagate.
Download the latest APK from the
[releases page](https://github.com/chenasraf/pantry-flutter/releases) and sideload onto your device.
### iOS
### App Store (iOS)
[Coming soon — TestFlight]
[Install from the App Store](https://apps.apple.com/us/app/pantry-for-nextcloud/id6762161619)
## Development

View File

@@ -5,6 +5,7 @@ plugins {
id("dev.flutter.flutter-gradle-plugin")
}
import com.android.build.gradle.internal.api.ApkVariantOutputImpl
import java.io.FileInputStream
import java.util.Properties
@@ -48,7 +49,16 @@ android {
}
}
dependenciesInfo {
includeInApk = false
includeInBundle = false
}
buildTypes {
debug {
applicationIdSuffix = ".debug"
versionNameSuffix = "-dev"
}
release {
signingConfig = if (signingConfigs.names.contains("release"))
signingConfigs.getByName("release")
@@ -58,6 +68,17 @@ android {
}
}
val abiCodes = mapOf("armeabi-v7a" to 1, "arm64-v8a" to 2, "x86_64" to 3)
android.applicationVariants.configureEach {
val variant = this
variant.outputs.forEach { output ->
val abiVersionCode = abiCodes[output.filters.find { it.filterType == "ABI" }?.identifier]
if (abiVersionCode != null) {
(output as ApkVariantOutputImpl).versionCodeOverride = variant.versionCode * 10 + abiVersionCode
}
}
}
flutter {
source = "../.."
}

View File

@@ -1,7 +1,10 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<!-- The INTERNET permission is required for development. Specifically,
the Flutter tool needs it to communicate with the running application
to allow setting breakpoints, to provide hot reload, etc.
-->
<uses-permission android:name="android.permission.INTERNET"/>
<application android:label="Pantry Dev" tools:replace="android:label" />
</manifest>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.8 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.1 KiB

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.8 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.4 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.4 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.8 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.4 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.3 KiB

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.9 KiB

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.3 KiB

After

Width:  |  Height:  |  Size: 5.8 KiB

View File

@@ -1,2 +0,0 @@
json_key_file(ENV["GOOGLE_PLAY_KEY_FILE"])
package_name("dev.casraf.pantry")

View File

@@ -1,82 +0,0 @@
default_platform(:android)
platform :android do
def version_info
pubspec = File.read(File.expand_path("../../pubspec.yaml", __dir__))
version = pubspec.match(/^version:\s*(.+)$/)[1].strip
name, build = version.split("+")
{ name: name, build: build }
end
def version_name
v = version_info
"#{v[:build]} (#{v[:name]})"
end
def changelog_notes
version = version_info[:name]
changelog_path = File.expand_path("../../CHANGELOG.md", __dir__)
return "Release #{version}" unless File.exist?(changelog_path)
changelog = File.read(changelog_path)
pattern = /^## \[#{Regexp.escape(version)}\].*?\n(.*?)(?=^## \[|\z)/m
match = changelog.match(pattern)
return "Release #{version}" unless match
match[1].strip
.gsub(/\s*\(\[[\da-f]+\]\([^)]+\)\)/, "")
.gsub(/^\*\s+\*\*[^*]+:\*\*\s*/m, "- ")
.gsub(/^\*\s+/, "- ")
.gsub(/^### /, "")
.gsub(/\n{3,}/, "\n\n")
.strip
.then { |n| n.empty? ? "Release #{version}" : n }
end
desc "Upload AAB to Google Play"
lane :deploy do |options|
# Write release notes to the metadata tree so `supply` picks it up
# keyed by the current versionCode.
version_code = version_info[:build]
changelog_dir = File.expand_path("metadata/android/en-US/changelogs", __dir__)
FileUtils.mkdir_p(changelog_dir)
File.write(File.join(changelog_dir, "#{version_code}.txt"), changelog_notes)
upload_to_play_store(
aab: File.expand_path("../../build/app/outputs/bundle/release/app-release.aab", __dir__),
track: options[:track] || "internal",
release_status: options[:status] || "draft",
version_name: version_name,
metadata_path: File.expand_path("metadata/android", __dir__),
)
end
desc "Sync metadata and screenshots only (no AAB upload)"
lane :metadata do
upload_to_play_store(
skip_upload_aab: true,
skip_upload_apk: true,
metadata_path: File.expand_path("metadata/android", __dir__),
)
end
desc "Promote a release from one track to another"
lane :promote do |options|
from = options[:from] || "internal"
to = options[:to] || "production"
status = options[:status] || "draft"
upload_to_play_store(
track: from,
track_promote_to: to,
release_status: status,
version_name: version_name,
skip_upload_aab: true,
skip_upload_apk: true,
skip_upload_metadata: true,
skip_upload_changelogs: true,
skip_upload_images: true,
skip_upload_screenshots: true,
)
end
end

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

View File

@@ -1 +0,0 @@
Manage your household with your Nextcloud — lists, photos & notes.

View File

@@ -1 +0,0 @@
Nextcloud Pantry

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

BIN
assets/icon/icon_ios.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 53 KiB

View File

@@ -0,0 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 108 108">
<g transform="translate(22, 22) scale(2.667)">
<path fill="#FFFFFF" d="M12,3L2,12H5V20H19V12H22L12,3M12,8.75A2.25,2.25 0 0,1 14.25,11A2.25,2.25 0 0,1 12,13.25A2.25,2.25 0 0,1 9.75,11A2.25,2.25 0 0,1 12,8.75M12,15C13.5,15 16.5,15.75 16.5,17.25V18H7.5V17.25C7.5,15.75 10.5,15 12,15Z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 367 B

View File

@@ -0,0 +1,6 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
<rect width="512" height="512" fill="#0082C9"/>
<g transform="translate(106, 106) scale(12.5)">
<path fill="#FFFFFF" d="M12,3L2,12H5V20H19V12H22L12,3M12,8.75A2.25,2.25 0 0,1 14.25,11A2.25,2.25 0 0,1 12,13.25A2.25,2.25 0 0,1 9.75,11A2.25,2.25 0 0,1 12,8.75M12,15C13.5,15 16.5,15.75 16.5,17.25V18H7.5V17.25C7.5,15.75 10.5,15 12,15Z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 418 B

View File

@@ -0,0 +1,25 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
<defs>
<clipPath id="squircle">
<path d="
M256,0
C353,0 406,0 443,18
C468,30 482,44 494,69
C512,106 512,159 512,256
C512,353 512,406 494,443
C482,468 468,482 443,494
C406,512 353,512 256,512
C159,512 106,512 69,494
C44,482 30,468 18,443
C0,406 0,353 0,256
C0,159 0,106 18,69
C30,44 44,30 69,18
C106,0 159,0 256,0
Z"/>
</clipPath>
</defs>
<rect width="512" height="512" fill="#0082C9" clip-path="url(#squircle)"/>
<g transform="translate(106, 106) scale(12.5)">
<path fill="#FFFFFF" d="M12,3L2,12H5V20H19V12H22L12,3M12,8.75A2.25,2.25 0 0,1 14.25,11A2.25,2.25 0 0,1 12,13.25A2.25,2.25 0 0,1 9.75,11A2.25,2.25 0 0,1 12,8.75M12,15C13.5,15 16.5,15.75 16.5,17.25V18H7.5V17.25C7.5,15.75 10.5,15 12,15Z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 913 B

View File

@@ -1,5 +1,9 @@
# Android
json_key_file(ENV["GOOGLE_PLAY_KEY_FILE"])
package_name("dev.casraf.pantry")
# iOS
app_identifier("dev.casraf.pantry")
apple_id(ENV["APPLE_ID"])
itc_team_id(ENV["ITC_TEAM_ID"])
team_id(ENV["APPLE_TEAM_ID"])

2
fastlane/Deliverfile Normal file
View File

@@ -0,0 +1,2 @@
metadata_path("./fastlane/metadata/ios")
screenshots_path("./fastlane/metadata/ios/screenshots")

222
fastlane/Fastfile Normal file
View File

@@ -0,0 +1,222 @@
require "digest"
require "json"
# -- Shared helpers --
def version_info
pubspec = File.read(File.expand_path("../pubspec.yaml", __dir__))
version = pubspec.match(/^version:\s*(.+)$/)[1].strip
name, build = version.split("+")
{ name: name, build: build }
end
def version_name
v = version_info
"#{v[:build]} (#{v[:name]})"
end
def changelog_notes
version = version_info[:name]
changelog_path = File.expand_path("../CHANGELOG.md", __dir__)
return "Release #{version}" unless File.exist?(changelog_path)
changelog = File.read(changelog_path)
escaped = Regexp.escape(version)
pattern = /^## (?:\[#{escaped}\]|#{escaped}[\s(]).*?\n(.*?)(?=^## |\z)/m
match = changelog.match(pattern)
return "Release #{version}" unless match
match[1].strip
.gsub(/\s*\(\[[\da-f]+\]\([^)]+\)\)/, "")
.gsub(/^\*\s+\*\*[^*]+:\*\*\s*/m, "- ")
.gsub(/^\*\s+/, "- ")
.gsub(/^### /, "")
.gsub(/\n{3,}/, "\n\n")
.strip
.then { |n| n.empty? ? "Release #{version}" : n }
end
# -- Android --
default_platform(:android)
platform :android do
# Google Play enforces a 500-char limit on release notes per language.
PLAY_NOTES_MAX = 500
PLAY_NOTES_TRAILER = "\n\n… see full notes on GitHub."
def play_changelog
notes = changelog_notes
return notes if notes.length <= PLAY_NOTES_MAX
budget = PLAY_NOTES_MAX - PLAY_NOTES_TRAILER.length
truncated = notes[0, budget]
last_newline = truncated.rindex("\n")
truncated = truncated[0, last_newline] if last_newline && last_newline > budget / 2
truncated.rstrip + PLAY_NOTES_TRAILER
end
# -- Image change detection --
IMAGE_HASH_CACHE = File.expand_path(".image_hashes.json", __dir__)
def current_image_hashes
root = File.expand_path("metadata/android", __dir__)
return {} unless Dir.exist?(root)
files = Dir.glob(File.join(root, "**/images/**/*")).select { |f| File.file?(f) }
files.sort.each_with_object({}) do |path, acc|
rel = path.sub("#{root}/", "")
acc[rel] = Digest::SHA256.file(path).hexdigest
end
end
def cached_image_hashes
return {} unless File.exist?(IMAGE_HASH_CACHE)
JSON.parse(File.read(IMAGE_HASH_CACHE))
rescue StandardError
{}
end
def images_changed?
current_image_hashes != cached_image_hashes
end
def save_image_hashes
File.write(IMAGE_HASH_CACHE, JSON.pretty_generate(current_image_hashes))
end
desc "Upload AAB to Google Play"
lane :deploy do |options|
# Write changelog if not already present (CI generates it during the
# release PR, but this covers manual deploys).
version_code = version_info[:build]
changelog_dir = File.expand_path("metadata/android/en-US/changelogs", __dir__)
changelog_file = File.join(changelog_dir, "#{version_code}.txt")
unless File.exist?(changelog_file)
FileUtils.mkdir_p(changelog_dir)
File.write(changelog_file, play_changelog)
end
changed = images_changed?
UI.message(changed ? "Images changed — uploading." : "Images unchanged — skipping.")
upload_to_play_store(
aab: File.expand_path("../build/app/outputs/bundle/release/app-release.aab", __dir__),
track: options[:track] || "internal",
release_status: options[:status] || "draft",
version_name: version_name,
metadata_path: File.expand_path("metadata/android", __dir__),
skip_upload_images: !changed,
skip_upload_screenshots: !changed,
)
save_image_hashes if changed
end
desc "Sync metadata and screenshots only (no AAB upload)"
lane :metadata do
changed = images_changed?
UI.message(changed ? "Images changed — uploading." : "Images unchanged — skipping.")
upload_to_play_store(
skip_upload_aab: true,
skip_upload_apk: true,
skip_upload_changelogs: true,
metadata_path: File.expand_path("metadata/android", __dir__),
skip_upload_images: !changed,
skip_upload_screenshots: !changed,
)
save_image_hashes if changed
end
desc "Promote a release from one track to another"
lane :promote do |options|
from = options[:from] || "internal"
to = options[:to] || "production"
status = options[:status] || "draft"
upload_to_play_store(
track: from,
track_promote_to: to,
release_status: status,
version_name: version_name,
skip_upload_aab: true,
skip_upload_apk: true,
skip_upload_metadata: true,
skip_upload_changelogs: true,
skip_upload_images: true,
skip_upload_screenshots: true,
)
end
end
# -- iOS --
platform :ios do
def api_key
key_id = ENV.fetch("APP_STORE_API_KEY")
app_store_connect_api_key(
key_id: key_id,
issuer_id: ENV.fetch("APP_STORE_ISSUER_ID"),
key_filepath: File.join(ENV.fetch("APP_STORE_KEY_PATH"), "AuthKey_#{key_id}.p8"),
)
end
def find_ipa
ipa_path = Dir[File.expand_path("../build/ios/ipa/*.ipa", __dir__)].first
UI.user_error!("No IPA found in build/ios/ipa/. Run 'make ios-build' first.") unless ipa_path
ipa_path
end
def sync_release_notes
version_code = version_info[:build]
changelog_file = File.expand_path("metadata/ios/en-US/changelogs/#{version_code}.txt", __dir__)
notes = File.exist?(changelog_file) ? File.read(changelog_file).strip : changelog_notes
release_notes_path = File.expand_path("metadata/ios/en-US/release_notes.txt", __dir__)
File.write(release_notes_path, notes)
UI.message("Synced release notes from build #{version_code} (#{notes.length} chars)")
notes
end
desc "Upload to TestFlight"
lane :beta do
notes = sync_release_notes
upload_to_testflight(
api_key: api_key,
ipa: find_ipa,
changelog: notes,
skip_waiting_for_build_processing: true,
)
end
desc "Upload to App Store"
lane :release do
sync_release_notes
deliver(
api_key: api_key,
ipa: find_ipa,
metadata_path: File.expand_path("metadata/ios", __dir__),
screenshots_path: File.expand_path("metadata/ios/en-US/screenshots", __dir__),
skip_screenshots: true,
submit_for_review: true,
precheck_include_in_app_purchases: false,
force: true,
)
end
desc "Sync iOS metadata only (no IPA upload)"
lane :metadata do
deliver(
api_key: api_key,
metadata_path: File.expand_path("metadata/ios", __dir__),
screenshots_path: File.expand_path("metadata/ios/en-US/screenshots", __dir__),
skip_binary_upload: true,
skip_screenshots: true,
submit_for_review: false,
precheck_include_in_app_purchases: false,
force: true,
)
end
end

View File

@@ -41,6 +41,35 @@ Promote a release from one track to another
----
## iOS
### ios beta
```sh
[bundle exec] fastlane ios beta
```
Upload to TestFlight
### ios release
```sh
[bundle exec] fastlane ios release
```
Upload to App Store
### ios metadata
```sh
[bundle exec] fastlane ios metadata
```
Sync iOS metadata only (no IPA upload)
----
This README.md is auto-generated and will be re-generated every time [_fastlane_](https://fastlane.tools) is run.
More information about _fastlane_ can be found on [fastlane.tools](https://fastlane.tools).

View File

@@ -0,0 +1,2 @@
Bug Fixes
- about urls not opening

View File

@@ -0,0 +1,3 @@
Features
- add more icons to categories
- allow adding one-off list items

View File

@@ -0,0 +1,3 @@
Features
- add search in lists
- allow uploading list item image

View File

@@ -0,0 +1,2 @@
Build System
- add abi split

View File

@@ -0,0 +1,2 @@
Build System
- reproducible build

View File

@@ -0,0 +1,2 @@
Build System
- upgrade flutter version

View File

@@ -0,0 +1,2 @@
Build System
- remove apk obfuscation

View File

@@ -0,0 +1,2 @@
Build System
- zipalign

View File

@@ -0,0 +1,2 @@
Build System
- remove zipalign

View File

@@ -0,0 +1,2 @@
Build System
- disable deps metadata in apk

View File

@@ -0,0 +1,2 @@
Build System
- strip deps metadata from build

View File

@@ -0,0 +1,2 @@
Build System
- re-sign with stripping

View File

@@ -0,0 +1,2 @@
Build System
- fix signing

View File

@@ -0,0 +1,4 @@
Features
- update notes view & edit ui
Bug Fixes
- bug where note grid would not clip correctly

View File

@@ -0,0 +1,2 @@
Bug Fixes
- make markdown links clickable

View File

@@ -0,0 +1,4 @@
Features
- add setting to require checkbox tap to complete checklist items
Bug Fixes
- preserve subpath for Nextcloud instances hosted on sub-paths

View File

@@ -0,0 +1,8 @@
Features
- add sorting by category for checklist
- notifications support
Bug Fixes
- add bottom padding to accomodate fab

View File

@@ -0,0 +1,3 @@
Bug Fixes
- sorting prefs persistence & error wrapping

View File

@@ -0,0 +1,8 @@
Features
- improve main page navigations
- move items between lists
Bug Fixes
- support back button when in photos foldeer

View File

@@ -0,0 +1,7 @@
Features
- add hebrew language translation
Bug Fixes
- description field in items saving+displaying

View File

@@ -0,0 +1,6 @@
Features
- add de, es, fr locales
Bug Fixes
- allow arbitrary text in quantity
- improve rtl layout spacings
- rtl layout + switching

View File

@@ -0,0 +1,5 @@
Features
- show next due date for list items
Bug Fixes
- appbar icon spacings
- improve i18n recurrence string rules

View File

@@ -0,0 +1,2 @@
Features
- add about page

View File

@@ -10,7 +10,7 @@ Upload and organize photos into folders. Add captions, drag to reorder, and brow
Keep shared notes with your household. Color-code them, write in markdown, and pin the important stuff where everyone can see it.
* Your data, your server
Pantry connects directly to your self-hosted Nextcloud instance. No accounts to create, no cloud services in between. Your data never leaves your server.
Pantry connects directly to your Nextcloud instance. No accounts to create, no cloud services in between. Your data never leaves your server.
* Features
- Shared checklists with categories, quantities, and recurrence
@@ -20,6 +20,6 @@ Pantry connects directly to your self-hosted Nextcloud instance. No accounts to
- Multi-select for bulk actions
- Offline caching for fast loading
- Material Design 3 with dark mode support
- Nextcloud Login Flow v2 authentication
- Secure login flow authentication
* Pantry requires a Nextcloud server with the Pantry app installed. Visit the project page for setup instructions.
* Requires a Nextcloud server with the Pantry app installed. Visit the project page for setup instructions.

View File

Before

Width:  |  Height:  |  Size: 60 KiB

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

View File

@@ -0,0 +1 @@
Manage your household — shared lists, photos & notes on your own server.

View File

@@ -0,0 +1 @@
Pantry for Nextcloud

View File

@@ -0,0 +1 @@
2026 Chen Asraf

View File

@@ -0,0 +1 @@

View File

@@ -0,0 +1,2 @@
Bug Fixes
- about urls not opening

View File

@@ -0,0 +1,3 @@
Features
- add more icons to categories
- allow adding one-off list items

View File

@@ -0,0 +1,3 @@
Features
- add search in lists
- allow uploading list item image

View File

@@ -0,0 +1,2 @@
Build System
- add abi split

View File

@@ -0,0 +1,2 @@
Build System
- reproducible build

View File

@@ -0,0 +1,2 @@
Build System
- upgrade flutter version

View File

@@ -0,0 +1,2 @@
Build System
- remove apk obfuscation

View File

@@ -0,0 +1,2 @@
Build System
- zipalign

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