diff --git a/.github/ISSUE_TEMPLATE/1_bug.md b/.github/ISSUE_TEMPLATE/1_bug.md
deleted file mode 100644
index e12f7506..00000000
--- a/.github/ISSUE_TEMPLATE/1_bug.md
+++ /dev/null
@@ -1,34 +0,0 @@
----
-name: I found a problem with wger
-about: While using wger the application crashes or throws an exception, a
- widget is buggy, or something looks wrong.
-title: ''
-labels: ''
-assignees: ''
-
----
-
-## Steps to Reproduce
-
-
-
-1. ...
-2. ...
-3. ...
-
-**Expected results:**
-
-**Actual results:**
-
-
- Logs
-
-
-
-```
-```
-
-
-
diff --git a/.github/ISSUE_TEMPLATE/1_bug.yml b/.github/ISSUE_TEMPLATE/1_bug.yml
new file mode 100644
index 00000000..385e5cc8
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/1_bug.yml
@@ -0,0 +1,53 @@
+# https://docs.github.com/en/communities/using-templates-to-encourage-useful-issues-and-pull-requests/syntax-for-issue-forms
+# https://docs.github.com/en/communities/using-templates-to-encourage-useful-issues-and-pull-requests/syntax-for-githubs-form-schema
+
+name: Bug report
+description: Report an error or unexpected behavior
+type: bug
+body:
+ - type: dropdown
+ id: priority
+ attributes:
+ label: Priority/Impact
+ description: How severe is the issue?
+ options:
+ - Low (minor inconvenience)
+ - Medium (affects some functionality)
+ - High (critical issue, blocks workflow)
+
+ - type: textarea
+ id: description
+ attributes:
+ label: Description
+ description: |
+ A clear and concise description of the bug.
+ placeholder: |
+ Please include any information you think is relevant to the issue you are experiencing.
+ This could include any steps to reproduce it (if it happens consistently), expected vs.
+ actual behavior, logs, screenshots, links to related issues, etc.
+ validations:
+ required: true
+
+ - type: input
+ id: server-version
+ attributes:
+ label: Server version
+ description: |
+ What version of wger are you using and how did you install it (you use our server,
+ docker compose, manual installation, etc)?
+ placeholder: |
+ Check https:///software/about-us or the git sha1 of the last commit you pulled
+ validations:
+ required: false
+
+ - type: input
+ id: app-version
+ attributes:
+ label: Mobile app version
+ description: |
+ What version of the mobile app are you using and how did you install it
+ (Play Store, App Store, Flathub, self compiled, etc.)?
+ placeholder: |
+ Check the "about wger" dialog
+ validations:
+ required: false
diff --git a/.github/ISSUE_TEMPLATE/2_feature_request.md b/.github/ISSUE_TEMPLATE/2_feature_request.md
deleted file mode 100644
index 924b1e42..00000000
--- a/.github/ISSUE_TEMPLATE/2_feature_request.md
+++ /dev/null
@@ -1,26 +0,0 @@
----
-name: Feature request
-about: Suggest a new idea for wger.
-title: ''
-labels: ''
-assignees: ''
-
----
-
-## Use case
-
-
-
-## Proposal
-
-
diff --git a/.github/ISSUE_TEMPLATE/2_feature_request.yml b/.github/ISSUE_TEMPLATE/2_feature_request.yml
new file mode 100644
index 00000000..5ea0dff8
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/2_feature_request.yml
@@ -0,0 +1,33 @@
+name: Feature request
+description: Suggest a new idea for wger
+type: enhancement
+body:
+ - type: textarea
+ id: description
+ attributes:
+ label: Use case
+ description: |
+ A description of what new feature or behavior you would like to see.
+ validations:
+ required: true
+
+ - type: textarea
+ id: proposal
+ attributes:
+ label: Proposal
+ description: |
+ Why is this feature needed? What problems does it solve?
+ validations:
+ required: false
+
+ - type: textarea
+ id: additional-context
+ attributes:
+ label: Additional Context
+ description: |
+ Any extra details, related issues, or mockups
+ placeholder: |
+ Screenshots or mockups, links to similar features in other applications, or other relevant
+ information.
+ validations:
+ required: false
diff --git a/.github/actions/flutter-common/action.yml b/.github/actions/flutter-common/action.yml
new file mode 100644
index 00000000..181454e5
--- /dev/null
+++ b/.github/actions/flutter-common/action.yml
@@ -0,0 +1,23 @@
+name: 'Flutter common setup'
+description: 'Common steps needed to setup the application'
+
+runs:
+ using: "composite"
+ steps:
+
+ - name: Setup Flutter
+ uses: subosito/flutter-action@v2
+ with:
+ channel: stable
+ flutter-version: 3.29.2
+ cache: true
+
+ - name: Install Flutter dependencies
+ run: flutter pub get
+ shell: bash
+
+ - name: Install Flutter dependencies
+ run: |
+ dart --version
+ flutter --version
+ shell: bash
\ No newline at end of file
diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md
index 4cf8375a..073681dc 100644
--- a/.github/pull_request_template.md
+++ b/.github/pull_request_template.md
@@ -1,25 +1,17 @@
-## Description (Proposed Changes)
-(Please try to mention in bullet points.)
+# Proposed Changes
-
-
-## Link to the issue :
+## Related Issue(s)
-(Add link of the issue you have proposed changes to)
+If applicable, please link to any related issues (`Closes #123`,
+`Closes wger-project/other-repo#123`, `See also #123`, etc.)
-- Link :
+## Please check that the PR fulfills these requirements
-## Tests
-
-Please make sure to add tests when implementing new features.
-
-## Checklist
-
-Please check that the PR fulfills all requirements listed below by checking the relevant checkboxes (`[x]`). This will ensure a smooth and quick review process.
-
-- [ ] Set a 100 character limit in your editor/IDE to avoid white space diffs in the PR
- [ ] Tests for the changes have been added (for bug fixes / features)
-- [ ] Added yourself to AUTHORS.md
+- [ ] Set a 100 character limit in your editor/IDE to avoid white space diffs in the PR
+ (run `dart format --line-length=100 .`)
- [ ] Updated/added relevant documentation (doc comments with `///`).
- [ ] Added relevant reviewers.
diff --git a/.github/workflows/build-android.yml b/.github/workflows/build-android.yml
new file mode 100644
index 00000000..ff044875
--- /dev/null
+++ b/.github/workflows/build-android.yml
@@ -0,0 +1,73 @@
+name: Build Android
+on:
+ workflow_call:
+ inputs:
+ ref:
+ required: true
+ type: string
+ secrets:
+ DECRYPTKEY_PLAYSTORE_SIGNING_KEY:
+ required: true
+ DECRYPTKEY_PROPERTIES:
+ required: true
+jobs:
+ build_android_apk:
+ name: APK file
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout application
+ uses: actions/checkout@v4
+ with:
+ ref: ${{ inputs.ref }}
+
+ - name: Common flutter setup
+ uses: ./.github/actions/flutter-common
+
+ - name: Decrypt config files
+ run: |
+ cd ./fastlane/metadata/envfiles
+ chmod +x ./decrypt_secrets.sh
+ ./decrypt_secrets.sh
+ shell: bash
+ env:
+ DECRYPTKEY_PLAYSTORE_SIGNING_KEY: ${{ secrets.DECRYPTKEY_PLAYSTORE_SIGNING_KEY }}
+ DECRYPTKEY_PROPERTIES: ${{ secrets.DECRYPTKEY_PROPERTIES }}
+
+ - name: Build APK
+ run: flutter build apk --release
+
+ - uses: actions/upload-artifact@v4
+ with:
+ name: builds-apk
+ path: build/app/outputs/flutter-apk/app-release.apk
+
+ build_android_aab:
+ name: AAB file
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout application
+ uses: actions/checkout@v4
+ with:
+ ref: ${{ inputs.ref }}
+
+ - name: Common setup
+ uses: ./.github/actions/flutter-common
+
+ - name: Decrypt config files
+ run: |
+ cd ./fastlane/metadata/envfiles
+ chmod +x ./decrypt_secrets.sh
+ ./decrypt_secrets.sh
+ shell: bash
+ env:
+ DECRYPTKEY_PLAYSTORE: ${{ secrets.DECRYPTKEY_PLAYSTORE }}
+ DECRYPTKEY_PLAYSTORE_SIGNING_KEY: ${{ secrets.DECRYPTKEY_PLAYSTORE_SIGNING_KEY }}
+ DECRYPTKEY_PROPERTIES: ${{ secrets.DECRYPTKEY_PROPERTIES }}
+
+ - name: Build AAB
+ run: flutter build appbundle --release
+
+ - uses: actions/upload-artifact@v4
+ with:
+ name: builds-aab
+ path: build/app/outputs/bundle/release/app-release.aab
\ No newline at end of file
diff --git a/.github/workflows/build-apple.yml b/.github/workflows/build-apple.yml
new file mode 100644
index 00000000..3ee33c9b
--- /dev/null
+++ b/.github/workflows/build-apple.yml
@@ -0,0 +1,47 @@
+name: Build Apple
+on:
+ workflow_call:
+ inputs:
+ ref:
+ required: true
+ type: string
+jobs:
+ build_ios:
+ name: iOS
+ runs-on: macos-latest
+ steps:
+ - name: Checkout application
+ uses: actions/checkout@v4
+ with:
+ ref: ${{ inputs.ref }}
+
+ - name: Common flutter setup
+ uses: ./.github/actions/flutter-common
+
+ - name: Build .app
+ run: flutter build ios --release --no-codesign
+
+ - uses: actions/upload-artifact@v4
+ with:
+ name: builds-ios
+ path: build/ios/iphoneos/Runner.app
+
+ build_macos:
+ name: macOS
+ runs-on: macos-latest
+ steps:
+ - name: Checkout application
+ uses: actions/checkout@v4
+ with:
+ ref: ${{ inputs.ref }}
+
+ - name: Common flutter setup
+ uses: ./.github/actions/flutter-common
+
+ - name: Build .app
+ run: flutter build macos --release
+
+ - uses: actions/upload-artifact@v4
+ with:
+ name: builds-macos
+ path: build/macos/Build/Products/Release/wger.app
\ No newline at end of file
diff --git a/.github/workflows/build-linux.yml b/.github/workflows/build-linux.yml
new file mode 100644
index 00000000..56491a45
--- /dev/null
+++ b/.github/workflows/build-linux.yml
@@ -0,0 +1,38 @@
+name: Build Linux
+on:
+ workflow_call:
+ inputs:
+ ref:
+ required: true
+ type: string
+jobs:
+ build_linux:
+ name: Flathub
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout application
+ uses: actions/checkout@v4
+ with:
+ ref: ${{ inputs.ref }}
+
+ - name: Common setup
+ uses: ./.github/actions/flutter-common
+
+ # Compare with list of available packages on the runner:
+ # https://github.com/actions/runner-images/blob/main/images/ubuntu/Ubuntu2404-Readme.md
+ - name: Build application for linux
+ run: |
+ # ninja-build
+ sudo apt update
+ sudo apt install -y pkg-config libgtk-3-dev liblzma-dev libstdc++-12-dev --no-install-recommends
+ flutter build linux --release
+ cd flatpak/scripts
+ dart pub get
+ dart flatpak_packager.dart --meta ../flatpak_meta.json --addTodaysVersion ${{inputs.ref}}
+
+ - uses: actions/upload-artifact@v4
+ with:
+ name: builds-linux
+ path: |
+ flatpak/scripts/flatpak_generator_exports/wger-linux-x86_64.tar.gz
+ flatpak/scripts/flatpak_generator_exports/wger-linux-x86_64.sha256
\ No newline at end of file
diff --git a/.github/workflows/build-release.yml b/.github/workflows/build-release.yml
deleted file mode 100644
index d5826690..00000000
--- a/.github/workflows/build-release.yml
+++ /dev/null
@@ -1,127 +0,0 @@
-name: Build release artefacts
-on:
- push:
- tags:
- - 'v[0-9]+.[0-9]+.[0-9]+'
-
-jobs:
- deploy_android:
- runs-on: ubuntu-latest
- steps:
- - name: Checkout application code
- uses: actions/checkout@v4
-
- - name: Setup Java
- uses: actions/setup-java@v4
- with:
- java-version: '17'
- distribution: 'oracle'
-
- - name: Setup Ruby
- uses: ruby/setup-ruby@v1
- with:
- ruby-version: '3.2'
-
- - name: Setup Flutter
- uses: subosito/flutter-action@v2
- with:
- channel: stable
- flutter-version: 3.29.2
-
- - name: Flutter info
- run: |
- dart --version
- flutter --version
-
- - name: Install Flutter dependencies
- run: flutter pub get
-
- - name: Decrypt config files
- run: |
- cd ./fastlane/metadata/envfiles
- chmod +x ./decrypt_secrets.sh
- ./decrypt_secrets.sh
- env:
- DECRYPTKEY_PLAYSTORE: ${{ secrets.DECRYPTKEY_PLAYSTORE }}
- DECRYPTKEY_PLAYSTORE_SIGNING_KEY: ${{ secrets.DECRYPTKEY_PLAYSTORE_SIGNING_KEY }}
- DECRYPTKEY_PROPERTIES: ${{ secrets.DECRYPTKEY_PROPERTIES }}
-
- - name: Extract version information
- run: |
- echo "VERSION_V=$(echo $GITHUB_REF | cut -d / -f 3)" >> $GITHUB_ENV
- echo "VERSION=$(echo $GITHUB_REF | cut -d / -f 3 | cut -c 2-)" >> $GITHUB_ENV
- echo "BUILD=$(flutter pub run cider version | cut -d '+' -f 2)" >> $GITHUB_ENV
-
- - name: Bump pubspec version
- run: |
- flutter pub run cider version ${{ env.VERSION }}+${{ env.BUILD }}
- flutter pub run cider bump build
-
- - name: Build application for linux
- run: |
- sudo apt update
- sudo apt install -y clang cmake ninja-build pkg-config libgtk-3-dev liblzma-dev libstdc++-12-dev
- flutter build linux --release
- cd flatpak/scripts
- dart pub get
- dart flatpak_packager.dart --meta ../flatpak_meta.json --github --addTodaysVersion ${{ env.VERSION }}
-
- - name: Build AAB
- run: flutter build appbundle --release
-
- - name: Build APK
- run: flutter build apk --release
-
- - name: Upload build to Play Store
- run: |
- bundle install
- bundle exec fastlane android production
-
- - name: Make Github release
- uses: softprops/action-gh-release@v2
- with:
- tag_name: ${{ env.VERSION }}
- files: |
- build/app/outputs/bundle/release/app-release.aab
- build/app/outputs/flutter-apk/app-release.apk
- flatpak/scripts/flatpak_generator_exports/wger-linux-x86_64.tar.gz
- flatpak/scripts/flatpak_generator_exports/wger-linux-x86_64.sha256
-
- - name: Generate flathub manifest
- run: |
- cd flatpak/scripts
- dart pub get
- dart manifest_generator.dart --meta ../flatpak_meta.json --github
- mkdir ../../flathub
- cp flatpak_generator_exports/de.wger.flutter.json ../../flathub
- cp flatpak_generator_exports/flathub.json ../../flathub
-
- - name: Push updated config to flathub repository
- uses: cpina/github-action-push-to-another-repository@main
- env:
- SSH_DEPLOY_KEY: ${{ secrets.SSH_DEPLOY_KEY }}
- with:
- source-directory: flathub
- destination-github-username: wger-project
- destination-repository-name: de.wger.flutter
- user-email: github-actions@github.com
- target-branch: release-${{ env.VERSION }}
- create-target-branch-if-needed: true
- commit-message: Update to ${{ env.VERSION }}
-
- # Note: the original tag that triggered the workflow is in the form vX.Y.Z
- # but the pubspec.yaml is committed in the commit after that one.
- # Since we need the tag to point to the correct commit for other workflows
- # such as f-droid we need a way to correct it. Only moving the tag
- # would not work, as it would trigger this workflow again. So as
- # a workaround, we use the v-tag to trigger this workflow, add a new
- # one without the v and push it.
- - name: Commit pubspec version and delete tag
- run: |
- git config user.name Github-Actions
- git config user.email github-actions@github.com
- git checkout -b release-${{ env.VERSION }}
- git add pubspec.yaml
- git commit -m "Bump version to $( flutter pub run cider version )"
- git push origin --delete ${{ env.VERSION_V }}
- git push --set-upstream origin release-${{ env.VERSION }}
\ No newline at end of file
diff --git a/.github/workflows/build-windows.yml b/.github/workflows/build-windows.yml
new file mode 100644
index 00000000..503c8c1d
--- /dev/null
+++ b/.github/workflows/build-windows.yml
@@ -0,0 +1,27 @@
+name: Build Windows
+on:
+ workflow_call:
+ inputs:
+ ref:
+ required: true
+ type: string
+jobs:
+ build_windows:
+ name: Windows
+ runs-on: windows-latest
+ steps:
+ - name: Checkout application
+ uses: actions/checkout@v4
+ with:
+ ref: ${{ inputs.ref }}
+
+ - name: Common flutter setup
+ uses: ./.github/actions/flutter-common
+
+ - name: Build .exe
+ run: flutter build windows --release
+
+ - uses: actions/upload-artifact@v4
+ with:
+ name: builds-windows
+ path: build\windows\x64\runner\Release\wger.exe
\ No newline at end of file
diff --git a/.github/workflows/bump-version.yml b/.github/workflows/bump-version.yml
new file mode 100644
index 00000000..81b1e3fd
--- /dev/null
+++ b/.github/workflows/bump-version.yml
@@ -0,0 +1,49 @@
+name: Bump version
+on:
+ workflow_call:
+ inputs:
+ app_version:
+ required: true
+ type: string
+
+jobs:
+ determine_version:
+ name: Create tag
+ runs-on: ubuntu-latest
+ steps:
+
+ - name: Checkout application
+ uses: actions/checkout@v4
+ with:
+ fetch-depth: 0 # needed to push changes
+ token: ${{ secrets.GITHUB_TOKEN }}
+
+ - name: Common flutter setup
+ uses: ./.github/actions/flutter-common
+
+ - name: Validate version
+ run: |
+ RELEASE_VERSION="${{ inputs.app_version }}"
+ if [[ ! "${{ inputs.app_version }}" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
+ echo "Error: Input version '${{ inputs.app_version }}' is not in X.Y.Z format."
+ exit 1
+ fi
+
+ # In order to make sure the build number is the same across all platforms,
+ # increase to the next multiple of 10. This is needed because the iOS process
+ # is a bit more brittle and might need to be repeated if the App needs
+ # to be re-submitted.
+ - name: Bump pubspec version
+ run: |
+ CURRENT_BUILD=$(flutter pub run cider version | cut -d '+' -f 2)
+ NEXT_BUILD=$(( (CURRENT_BUILD / 10 + 1) * 10 ))
+ flutter pub run cider version ${{ inputs.app_version }}+${NEXT_BUILD}
+
+ - name: Tag release and commit pubspec
+ run: |
+ git config user.name Github-Actions
+ git config user.email github-actions@github.com
+ git add pubspec.yaml
+ git commit -m "Bump version to $( flutter pub run cider version )"
+ git tag ${{ inputs.app_version }}
+ git push origin HEAD:master --tags
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 8eb14605..9bc20e31 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -9,32 +9,32 @@ on:
paths:
- '**.dart'
- 'pubspec.yaml'
+ workflow_call:
+ workflow_dispatch:
+
jobs:
test:
+ name: Run tests
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- - name: Install Flutter
- uses: subosito/flutter-action@v2
- with:
- cache: true
- channel: 'stable'
- flutter-version: '3.29.x'
+ - name: Common flutter setup
+ uses: ./.github/actions/flutter-common
- - run: dart --version
- - run: flutter --version
-
- - name: Install sqlite3-dev
- run: sudo apt install libsqlite3-dev
-
- - name: Install app dependencies
- run: flutter pub get
+ - name: Install dependencies
+ run: |
+ sudo apt install libsqlite3-dev lcov --no-install-recommends
+ flutter pub get
+ # Removing some folders from the coverage since these files are not really
+ # part of the app code and just get in the way of the report
- name: Test app
- run: flutter test --coverage
+ run: |
+ flutter test --coverage
+ lcov --remove coverage/lcov.info 'lib/l10n/generated/*' 'lib/theme/*' -o coverage/lcov.info
- name: Coveralls
- uses: coverallsapp/github-action@master
+ uses: coverallsapp/github-action@v2
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.github/workflows/make-release.yml b/.github/workflows/make-release.yml
new file mode 100644
index 00000000..83480f8a
--- /dev/null
+++ b/.github/workflows/make-release.yml
@@ -0,0 +1,184 @@
+name: Build release artefacts
+on:
+ workflow_dispatch:
+ inputs:
+ version:
+ description: Version to tag and release (X.Y.Z)
+ required: true
+ type: string
+
+jobs:
+
+ ci:
+ name: CI
+ uses: ./.github/workflows/ci.yml
+
+ determine_version:
+ needs: ci
+ name: Prepare
+ uses: ./.github/workflows/bump-version.yml
+ with:
+ app_version: ${{ github.event.inputs.version }}
+
+ build_linux:
+ name: Linux
+ needs: determine_version
+ uses: ./.github/workflows/build-linux.yml
+ with:
+ ref: ${{ github.event.inputs.version }}
+
+ build_android:
+ name: Android
+ needs: determine_version
+ uses: ./.github/workflows/build-android.yml
+ with:
+ ref: ${{ github.event.inputs.version }}
+ secrets:
+ DECRYPTKEY_PLAYSTORE_SIGNING_KEY: ${{ secrets.DECRYPTKEY_PLAYSTORE_SIGNING_KEY }}
+ DECRYPTKEY_PROPERTIES: ${{ secrets.DECRYPTKEY_PROPERTIES }}
+
+ build_apple:
+ name: Apple
+ needs: determine_version
+ uses: ./.github/workflows/build-apple.yml
+ with:
+ ref: ${{ github.event.inputs.version }}
+
+ build_windows:
+ name: Microsoft
+ needs: determine_version
+ uses: ./.github/workflows/build-windows.yml
+ with:
+ ref: ${{ github.event.inputs.version }}
+
+ upload_play_store:
+ name: Upload to Play Store
+ runs-on: ubuntu-latest
+ needs:
+ - build_android
+ - build_linux
+ steps:
+ - name: Checkout application
+ uses: actions/checkout@v4
+ with:
+ ref: ${{ github.event.inputs.version }}
+
+ - name: Download builds
+ uses: actions/download-artifact@v4
+ with:
+ path: /tmp/
+
+ - name: Setup Ruby
+ uses: ruby/setup-ruby@v1
+ with:
+ ruby-version: 3.4
+
+ - name: Decrypt config files
+ run: |
+ cd ./fastlane/metadata/envfiles
+ chmod +x ./decrypt_secrets.sh
+ ./decrypt_secrets.sh
+ shell: bash
+ env:
+ DECRYPTKEY_PLAYSTORE: ${{ secrets.DECRYPTKEY_PLAYSTORE }}
+
+ - name: Upload build to Play Store
+ run: |
+ mkdir -p ./build/app/outputs/bundle/release/
+ cp /tmp/builds-aab/app-release.aab ./build/app/outputs/bundle/release/app-release.aab
+ bundle install
+ bundle exec fastlane android production
+
+ #
+ # This is currently commented out since the iOS upload are currently being handled
+ # by the fastlane script in the ios folder. We use the account of pthaler for this
+ # and he runs the script manually.
+ #
+
+ # upload_app_store:
+ # name: Upload to App Store (placeholder)
+ # runs-on: ubuntu-latest
+ # needs:
+ # - build_android
+ # - build_apple
+ # steps:
+ # - name: Checkout application
+ # uses: actions/checkout@v4
+ # with:
+ # ref: feature/build-process
+ # # ref: ${{ github.event.inputs.version }}
+ #
+ # - name: Common flutter setup
+ # uses: ./.github/actions/flutter-common
+ #
+ # - name: Download builds
+ # uses: actions/download-artifact@v4
+ # with:
+ # path: /tmp/
+ #
+ # - name: Upload build to App Store
+ # run: |
+ # # bundle exec fastlane todo
+
+ make_gh_release:
+ name: Make Github Release
+ runs-on: ubuntu-latest
+ needs:
+ - upload_play_store
+ - build_linux
+ - build_windows
+ - build_apple
+
+ steps:
+ - name: Download builds
+ uses: actions/download-artifact@v4
+
+ - name: Make Github release
+ uses: softprops/action-gh-release@v2
+ with:
+ tag_name: ${{ inputs.version }}
+ files: |
+ builds-aab/app-release.aab
+ builds-apk/app-release.apk
+ builds-linux/wger-linux-x86_64.tar.gz
+ builds-linux/wger-linux-x86_64.sha256
+ builds-ios/Runner.app
+ builds-macos/wger.app
+ builds-windows/wger.exe
+
+ generate_flathub_manifest:
+ runs-on: ubuntu-latest
+ name: Upload flathub manifest
+ needs:
+ - make_gh_release
+ steps:
+ - name: Checkout application
+ uses: actions/checkout@v4
+ with:
+ ref: ${{ github.event.inputs.version }}
+
+ - name: Common flutter setup
+ uses: ./.github/actions/flutter-common
+
+ - name: Generate manifest
+ run: |
+ cd flatpak/scripts
+ dart pub get
+ dart manifest_generator.dart --meta ../flatpak_meta.json --github
+ mkdir ../../flathub
+ cp flatpak_generator_exports/de.wger.flutter.json ../../flathub
+ cp flatpak_generator_exports/flathub.json ../../flathub
+
+ - name: Push updated config to flathub repository
+ uses: cpina/github-action-push-to-another-repository@main
+ env:
+ SSH_DEPLOY_KEY: ${{ secrets.SSH_DEPLOY_KEY }}
+ with:
+ source-directory: flathub
+ destination-github-username: wger-project
+ destination-repository-name: de.wger.flutter
+ user-email: github-actions@github.com
+ target-branch: release-${{ github.event.inputs.version }}
+ create-target-branch-if-needed: true
+ commit-message: Update to ${{ github.event.inputs.version }}
+
diff --git a/.gitignore b/.gitignore
index 19df0622..edc2c5c0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -33,9 +33,6 @@
**/failures/*.png
-# Web related
-lib/generated_plugin_registrant.dart
-
# Symbolication related
app.*.symbols
@@ -54,3 +51,14 @@ app.*.map.json
/vendor/bundle/ruby/
/coverage/
/lib/l10n/generated/
+
+# ios build and fastlane
+ios/fastlane/.env
+ios/fastlane/*.p8
+ios/fastlane/test_output
+ios/fastlane/screenshots
+ios/fastlane/report.xml
+ios/fastlane/Preview.html
+ios/fastlane/output
+ios/Runner.ipa
+ios/Runner.app.dSYM.zip
diff --git a/AUTHORS.md b/AUTHORS.md
index f4bf87d3..f39c304f 100644
--- a/AUTHORS.md
+++ b/AUTHORS.md
@@ -1,85 +1,350 @@
-# Authors
+# Contributors and translators to this repository
-## Developers
+Thank you all for contributing to the project, you are true heroes! 🫶
-- Jigar Prajapati -
-- Roland Geider –
-- Dylan Aird -
-- Jannik Norden -
-- Arun Muralidharan -
-- Khushbu Bora -
-- Patrick Witter -
-- Tomer Ben-Rachel -
-- Thilina Herath -
-- Marko Milosevic -
-- Karthik Reddy (Axel) -
-- Ogundoyin Toluwani -
-- Nenza Nurfirmansyah -
-- Florian Schmitz -
-- Adam Bujdoš -
-- Aman Negi -
-- Sandi Milohanic -
-- Miroslav Mazel -
-- artchiee -
-- Tejas Bir Singh -
-- Abhishek Saini -
-- Hanaa Allohibi -
-- Shey Alnasrawi -
-- Costas Korai -
-- Bassam Mutairi -
-- Dieter Plaetinck -
-- Dennis van Peer -
-- sizzlesloth -
-- Arya Singh -
-- Xianglin Zeng -
-- Sangharsh Sulke -
-- Yashas H Majmudar -
+## Contributors
+
+- thisisyoussef - [https://github.com/thisisyoussef](https://github.com/thisisyoussef)
+- Roland Geider - [https://github.com/rolandgeider](https://github.com/rolandgeider)
+- Yashas H Majmudar - [https://github.com/yashas-hm](https://github.com/yashas-hm)
+- Github-actions - [https://github.com/invalid-email-address](https://github.com/invalid-email-address)
+- Christijan - [https://github.com/ChrispyM](https://github.com/ChrispyM)
+- Jackpkn - [https://github.com/Jackpkn](https://github.com/Jackpkn)
+- sangharshdeveloper - [https://github.com/Sangharshdeveloper](https://github.com/Sangharshdeveloper)
+- ImgBotApp - [https://github.com/ImgBotApp](https://github.com/ImgBotApp)
+- தமிழ்நேரம் - [https://github.com/TamilNeram](https://github.com/TamilNeram)
+- Xianglin Zeng - [https://github.com/FutureYL3](https://github.com/FutureYL3)
+- Arya Pratap Singh - [https://github.com/ARYPROGRAMMER](https://github.com/ARYPROGRAMMER)
+- ARYPROGRAMMER - [https://github.com/ARYPROGRAMMER](https://github.com/ARYPROGRAMMER)
+- Dieter Plaetinck - [https://github.com/Dieterbe](https://github.com/Dieterbe)
+- szalas - [https://github.com/szalas](https://github.com/szalas)
+- dan - [https://github.com/sizzlesloth](https://github.com/sizzlesloth)
+- DVPeer - [https://github.com/Denpeer](https://github.com/Denpeer)
+- Marco Rimoldi - [https://github.com/marcor](https://github.com/marcor)
+- Licaon_Kter - [https://github.com/licaon-kter](https://github.com/licaon-kter)
+- Bassam A - [https://github.com/mutairibassam](https://github.com/mutairibassam)
+- Costas Korai
+- null - [https://github.com/hn-n](https://github.com/hn-n)
+- Miroslav Mazel
+- Milksheyke - [https://github.com/sheyaln](https://github.com/sheyaln)
+- Abhishek Saini - [https://github.com/Abhisheksainii](https://github.com/Abhisheksainii)
+- dimii27 - [https://github.com/dimii27](https://github.com/dimii27)
+- Antonis-geo - [https://github.com/Antonis-geo](https://github.com/Antonis-geo)
+- artchiee - [https://github.com/artchiee](https://github.com/artchiee)
+- artchiee - [https://github.com/artchiee](https://github.com/artchiee)
+- Jigar Prajapati - [https://github.com/Jiggy9](https://github.com/Jiggy9)
+- Dalton Scavassa
+- Jigar - [https://github.com/Jiggy9](https://github.com/Jiggy9)
+- Deepanshu - [https://github.com/Deepanshu-Sharma-18](https://github.com/Deepanshu-Sharma-18)
+- tejasbirsingh - [https://github.com/tejasbirsingh](https://github.com/tejasbirsingh)
+- Freddy Cunningham - [https://github.com/freddy-c](https://github.com/freddy-c)
+- Freddy Cunningham - [https://github.com/freddy-c](https://github.com/freddy-c)
+- Malay Pandit - [https://github.com/DeveloperMalay](https://github.com/DeveloperMalay)
+- Mirek Mazel - [https://github.com/12people](https://github.com/12people)
+- Miroslav Mazel
+- Roman Kalivoda - [https://github.com/RKCZ](https://github.com/RKCZ)
+- Tiisetso Dinoko - [https://github.com/Dinokojt7](https://github.com/Dinokojt7)
+- Harshit - [https://github.com/Harshit933](https://github.com/Harshit933)
+- Harshit - [https://github.com/Harshit933](https://github.com/Harshit933)
+- Raman Tank - [https://github.com/raman04-byte](https://github.com/raman04-byte)
+- Mohammad Rafigh - [https://github.com/mohammadrafigh](https://github.com/mohammadrafigh)
+- Edmundo Meyer - [https://github.com/e-meyer](https://github.com/e-meyer)
+- Bujdy - [https://github.com/bujdy](https://github.com/bujdy)
+- amannegi - [https://github.com/AmanNegi](https://github.com/AmanNegi)
+- Aman Negi - [https://github.com/AmanNegi](https://github.com/AmanNegi)
+- Aaliya Ali - [https://github.com/Aaliya-Ali](https://github.com/Aaliya-Ali)
+- Aaliya Ali - [https://github.com/Aaliya-Ali](https://github.com/Aaliya-Ali)
+- Sandi Milohanic
+- Hissabat Manager - [https://github.com/Chinguetti-Quizz](https://github.com/Chinguetti-Quizz)
+- Nenza Nurfirmansyah - [https://github.com/nenzan](https://github.com/nenzan)
+- Vinod - [https://github.com/skdotv](https://github.com/skdotv)
+- Aditya - [https://github.com/adeeteya](https://github.com/adeeteya)
+- JustinBenito - [https://github.com/JustinBenito](https://github.com/JustinBenito)
+- Florian Schmitz - [https://github.com/floodoo](https://github.com/floodoo)
+- avinash - [https://github.com/HeyAvi](https://github.com/HeyAvi)
+- Tolu ogundoyin - [https://github.com/Tolu007](https://github.com/Tolu007)
+- Daniil Kovalev - [https://github.com/kovdan01](https://github.com/kovdan01)
+- Saint Gabriel - [https://github.com/saintgabriel0](https://github.com/saintgabriel0)
+- Artem - [https://github.com/defaultpage](https://github.com/defaultpage)
+- WMs784 - [https://github.com/WMs784](https://github.com/WMs784)
+- KenXRan - [https://github.com/kenxran](https://github.com/kenxran)
+- João Goulart - [https://github.com/usehalter](https://github.com/usehalter)
+- yaseenagwan - [https://github.com/agwanyaseen](https://github.com/agwanyaseen)
+- G. Buendía - [https://github.com/gbuendia](https://github.com/gbuendia)
+- Sylvia van Os - [https://github.com/TheLastProject](https://github.com/TheLastProject)
+- Debayan Sutradhar - [https://github.com/rnayabed](https://github.com/rnayabed)
+- Poussinou - [https://github.com/Poussinou](https://github.com/Poussinou)
+- Nikita Epifanov
+- Ady - [https://github.com/adyhnat](https://github.com/adyhnat)
+- Adrian Halko
+- Tomáš Konkoľ - [https://github.com/TomasKonkol](https://github.com/TomasKonkol)
+- Marko Milosevic - [https://github.com/TaarnStar](https://github.com/TaarnStar)
+- Sandi Milohanić - [https://github.com/sandimilohanic](https://github.com/sandimilohanic)
+- AxelBlaz3 - [https://github.com/AxelBlaz3](https://github.com/AxelBlaz3)
+- Marvin M - [https://github.com/M123-dev](https://github.com/M123-dev)
+- himikat89 - [https://github.com/himikat89](https://github.com/himikat89)
+- infiniteoverflow - [https://github.com/infiniteoverflow](https://github.com/infiniteoverflow)
+- Tomer Ben Rachel - [https://github.com/TomerPacific](https://github.com/TomerPacific)
+- Thilina TCH - [https://github.com/ThilinaTCH](https://github.com/ThilinaTCH)
+- Thilina Herath - [https://github.com/thilinatnt](https://github.com/thilinatnt)
+- ToldYouThat
+- Yair Chen - [https://github.com/chenyair](https://github.com/chenyair)
+- henok3878 - [https://github.com/henok3878](https://github.com/henok3878)
+- Patrick Witter - [https://github.com/patrickwitter](https://github.com/patrickwitter)
+- ton-An - [https://github.com/ton-An](https://github.com/ton-An)
+- Prakash Shekhar - [https://github.com/prakash-shekhar](https://github.com/prakash-shekhar)
+- Khushbu Bora - [https://github.com/KhushbuBora](https://github.com/KhushbuBora)
+- Arun Muralidharan - [https://github.com/arun-muralidharan](https://github.com/arun-muralidharan)
+- yiter
+- Henio Szewczyk - [https://github.com/hszewczyk](https://github.com/hszewczyk)
+- Jannik Norden
+- Allan Nordhøy - [https://github.com/comradekingu](https://github.com/comradekingu)
+- Stefano Rossi - [https://github.com/stefanorossiti](https://github.com/stefanorossiti)
+- Dylan Aird - [https://github.com/Dolaned](https://github.com/Dolaned)
## Translators
-- Saudi Arabian
- - Hanaa Allohibi
-- German
+### Chinese (Traditional Han script)
- - mondstern (2)
- - J. Lavoie (19)
- - Roland Geider (142)
+- Peter Dave Hello - [https://github.com/PeterDaveHello](https://github.com/PeterDaveHello)
-- English
+### Polish
- - Roland Geider (3)
- - Allan Nordhøy (8)
+- Karol Solecki - [https://github.com/karolsol](https://github.com/karolsol)
+- Piotr Strebski - [https://github.com/strebski](https://github.com/strebski)
+- Dawid Panyło
+- Anonymous - [https://github.com/weblate](https://github.com/weblate)
+- Marcin Schoenknecht
+- Patryk - [https://github.com/byakurau](https://github.com/byakurau)
+- Michał Homza - [https://github.com/HagiaHaya](https://github.com/HagiaHaya)
+- Jacob - [https://github.com/devzom](https://github.com/devzom)
-- Italian
+### Serbian
- - mondstern (2)
- - DT (4)
- - J. Lavoie (24)
- - Stefano Rossi (120)
+- Mladen Trišić - [https://github.com/mtrisic](https://github.com/mtrisic)
-- Spanish
+### Dutch
- - Roland Geider (1)
- - martingetzel (119)
+- Joey Haalboom - [https://github.com/JoeyHaalboom](https://github.com/JoeyHaalboom)
-- French
+### Russian
- - J. Lavoie (92)
- - Stefano Rossi (94)
+- Алексей Курышко - [https://github.com/alexkuryshko](https://github.com/alexkuryshko)
+- lightningcpu - [https://github.com/lightningcpu](https://github.com/lightningcpu)
+- Кирилл Александрович Злобин - [https://github.com/gungstarbeiter](https://github.com/gungstarbeiter)
+- Ivan Katkov - [https://github.com/Porphyrion](https://github.com/Porphyrion)
+- Nikita Epifanov
-- Norwegian Bokmål
+### Croatian
- - Allan Nordhøy (98)
+- Milo Ivir - [https://github.com/milotype](https://github.com/milotype)
+- Roland Geider - [https://github.com/rolandgeider](https://github.com/rolandgeider)
+- SMilohanic - [https://github.com/sandimilohanic](https://github.com/sandimilohanic)
-- Japanese
+### Portuguese
- - Kosei TANAKA (97)
+- Edson Wolf - [https://github.com/edsonblwolf](https://github.com/edsonblwolf)
+- Anonymous - [https://github.com/weblate](https://github.com/weblate)
+- Wilton Rodrigues
+- Guilherme Salomão - [https://github.com/salomaoparkour](https://github.com/salomaoparkour)
+- Bruno de Moura - [https://github.com/bruunomooura](https://github.com/bruunomooura)
+- Dalton Scavassa
+- Stefan Taiguara - [https://github.com/Teitei011](https://github.com/Teitei011)
+- Eduardo Menges Mattje - [https://github.com/EduMenges](https://github.com/EduMenges)
+- Edu Cavalheiro - [https://github.com/EduCavalheiro](https://github.com/EduCavalheiro)
+- João Goulart - [https://github.com/usehalter](https://github.com/usehalter)
-- Bahasa Indonesia
+### Italian
- - Nenza Nurfirmansyah (73)
+- Antenore Gatta - [https://github.com/antenore](https://github.com/antenore)
+- Gab Gat
+- Anonymous - [https://github.com/weblate](https://github.com/weblate)
+- Federico Pierantoni - [https://github.com/F3FFO](https://github.com/F3FFO)
+- oarion - [https://github.com/oarion](https://github.com/oarion)
+- Alessandro Faucci - [https://github.com/Dhy19971](https://github.com/Dhy19971)
+- Sfizio Purea
+- Mirko Ferrati - [https://github.com/MirkoFerrati](https://github.com/MirkoFerrati)
+- Stefano Camillo - [https://github.com/djste](https://github.com/djste)
+- MARCO ACORTE - [https://github.com/marco-acorte](https://github.com/marco-acorte)
+- J. Lavoie
+- DT
+- mondstern
+- Stefano Rossi - [https://github.com/stefanorossiti](https://github.com/stefanorossiti)
-- Croatian
+### French
- - Sandi Milohaic
+- William - [https://github.com/WilliamR312](https://github.com/WilliamR312)
+- florent4014 - [https://github.com/florent4014](https://github.com/florent4014)
+- Anonymous - [https://github.com/weblate](https://github.com/weblate)
+- Xav Basco
+- David Olewski - [https://github.com/Arigowin](https://github.com/Arigowin)
+- yoyomax80400 - [https://github.com/yoyomax80400](https://github.com/yoyomax80400)
+- loued - [https://github.com/Loued](https://github.com/Loued)
+- Célian
+- MrSniikyz - [https://github.com/BabyGeek](https://github.com/BabyGeek)
+- Roland Geider - [https://github.com/rolandgeider](https://github.com/rolandgeider)
+- J. Lavoie
+- Antoine Vibien - [https://github.com/r1llettes](https://github.com/r1llettes)
+- Stefano Rossi - [https://github.com/stefanorossiti](https://github.com/stefanorossiti)
+
+### Ukrainian
+
+- Максим Горпиніч - [https://github.com/Maksim2005UA](https://github.com/Maksim2005UA)
+- Roland Geider - [https://github.com/rolandgeider](https://github.com/rolandgeider)
+- Максим Горпиніч
+- Anonymous - [https://github.com/weblate](https://github.com/weblate)
+- Dan - [https://github.com/Kefir2105](https://github.com/Kefir2105)
+- Dan
+- Tymofii Lytvynenko
+- Artem - [https://github.com/defaultpage](https://github.com/defaultpage)
+
+### Portuguese (Brazil)
+
+- Ricardo Lima - [https://github.com/rhrlima](https://github.com/rhrlima)
+- Clerton Araujo - [https://github.com/clertonraf](https://github.com/clertonraf)
+- Anonymous - [https://github.com/weblate](https://github.com/weblate)
+- Wilton Rodrigues
+- Nao interessa
+- Lucas Mezêncio - [https://github.com/lucasmezencio](https://github.com/lucasmezencio)
+- Felipe Antônio Rodrigues Cardoso
+- Luigi Henrick Feitoza Silva - [https://github.com/luigihenrick](https://github.com/luigihenrick)
+- João Hortêncio Moraes - [https://github.com/joaohortencio](https://github.com/joaohortencio)
+
+### Tamil
+
+- தமிழ்நேரம் - [https://github.com/TamilNeram](https://github.com/TamilNeram)
+
+### Chinese (Simplified Han script)
+
+- Herb Huang
+
+### Hindi
+
+- pavan arun bagwe - [https://github.com/pavanb0](https://github.com/pavanb0)
+- Anonymous - [https://github.com/weblate](https://github.com/weblate)
+- Debayan Sutradhar - [https://github.com/rnayabed](https://github.com/rnayabed)
+
+### Turkish
+
+- Oğuz Ersen - [https://github.com/oersen](https://github.com/oersen)
+- Roland Geider - [https://github.com/rolandgeider](https://github.com/rolandgeider)
+- Cem Avcı - [https://github.com/cem256](https://github.com/cem256)
+- Oğuz Ersen
+- Cenk Cidecio - [https://github.com/ccidecio](https://github.com/ccidecio)
+- ToldYouThat
+
+### German
+
+- kvnrmnn - [https://github.com/rmnn92](https://github.com/rmnn92)
+- Anonymous - [https://github.com/weblate](https://github.com/weblate)
+- Roland Geider - [https://github.com/rolandgeider](https://github.com/rolandgeider)
+- Victor Jouhoff - [https://github.com/jouhoffv](https://github.com/jouhoffv)
+- m4skedbyte
+- Axel Steinbrecher
+- Christoph Suesser - [https://github.com/TheFitzZZ](https://github.com/TheFitzZZ)
+- Luis Lüscher - [https://github.com/lslschr](https://github.com/lslschr)
+- mondstern
+- J. Lavoie
+- Marvin M - [https://github.com/M123-dev](https://github.com/M123-dev)
+- Lydia
+- Allan Nordhøy - [https://github.com/comradekingu](https://github.com/comradekingu)
+
+### Indonesian
+
+- aryakdaniswara - [https://github.com/aryakdaniswara](https://github.com/aryakdaniswara)
+- Anonymous - [https://github.com/weblate](https://github.com/weblate)
+- Debi Maulana Ahsan Halla
+- Roland Geider - [https://github.com/rolandgeider](https://github.com/rolandgeider)
+
+### Catalan
+
+- Zixu Sun - [https://github.com/ziixu](https://github.com/ziixu)
+- Anonymous - [https://github.com/weblate](https://github.com/weblate)
+- guillem - [https://github.com/gbuendia](https://github.com/gbuendia)
+
+### Chinese (Simplified)
+
+- 纪颖志 - [https://github.com/jiyingzhi](https://github.com/jiyingzhi)
+- Yi-Han Hsiung - [https://github.com/AaronHsiung](https://github.com/AaronHsiung)
+- Tsz Hong CHAN - [https://github.com/tomyan112](https://github.com/tomyan112)
+- Eddie Tang - [https://github.com/EDED2314](https://github.com/EDED2314)
+- Jing - [https://github.com/jingcheng16](https://github.com/jingcheng16)
+- sr-c - [https://github.com/sr-c](https://github.com/sr-c)
+- tony - [https://github.com/tonyxxliu](https://github.com/tonyxxliu)
+- yiter
+
+### Greek
+
+- Dimitrys Meliates
+- Antonis-geo - [https://github.com/Antonis-geo](https://github.com/Antonis-geo)
+
+### Czech
+
+- Fjuro - [https://github.com/Fjuro](https://github.com/Fjuro)
+- Fjuro
+- CaptainDolphy - [https://github.com/CaptainDolphy](https://github.com/CaptainDolphy)
+- Roman Kalivoda - [https://github.com/RKCZ](https://github.com/RKCZ)
+
+### Arabic
+
+- Anonymous - [https://github.com/weblate](https://github.com/weblate)
+- Hanaa - [https://github.com/hn-n](https://github.com/hn-n)
+- Ahmed zein - [https://github.com/Ahmed-Zein](https://github.com/Ahmed-Zein)
+
+### Hebrew
+
+- Anonymous - [https://github.com/weblate](https://github.com/weblate)
+- n,rdo
+- Tomer Ben Rachel - [https://github.com/TomerPacific](https://github.com/TomerPacific)
+
+### Japanese
+
+- Anonymous - [https://github.com/weblate](https://github.com/weblate)
+- Tsz Hong CHAN - [https://github.com/tomyan112](https://github.com/tomyan112)
+- sasukeiscool - [https://github.com/sasukeiscool](https://github.com/sasukeiscool)
+- yiter
+
+### Spanish
+
+- Anonymous - [https://github.com/weblate](https://github.com/weblate)
+- Roberto Iglesias - [https://github.com/iglesiasroberto14](https://github.com/iglesiasroberto14)
+- c06c3abb8f
+- Javier - [https://github.com/dysk0zero](https://github.com/dysk0zero)
+- facu-d - [https://github.com/facu-d](https://github.com/facu-d)
+- Biologia Libros - [https://github.com/bio201922](https://github.com/bio201922)
+- guillem - [https://github.com/gbuendia](https://github.com/gbuendia)
+- Chris Klempau - [https://github.com/yoinkers1337](https://github.com/yoinkers1337)
+- Roland Geider - [https://github.com/rolandgeider](https://github.com/rolandgeider)
+- martingetzel - [https://github.com/martingetzel](https://github.com/martingetzel)
+
+### Chinese (Traditional)
+
+- hugoalh
+- Tsz Hong CHAN - [https://github.com/tomyan112](https://github.com/tomyan112)
+- Chung-Wei Chung - [https://github.com/webb790709](https://github.com/webb790709)
+- HY Cheng
+
+### Portuguese (Portugal)
+
+- Anonymous - [https://github.com/weblate](https://github.com/weblate)
+
+### Romanian
+
+- Bogdan Bujor - [https://github.com/qSharpy](https://github.com/qSharpy)
+- dimii27 - [https://github.com/dimii27](https://github.com/dimii27)
+
+### English
+
+- guillem - [https://github.com/gbuendia](https://github.com/gbuendia)
+- Allan Nordhøy - [https://github.com/comradekingu](https://github.com/comradekingu)
+- Roland Geider - [https://github.com/rolandgeider](https://github.com/rolandgeider)
+
+### Norwegian Bokmål
+
+- Roland Geider - [https://github.com/rolandgeider](https://github.com/rolandgeider)
+- Allan Nordhøy - [https://github.com/comradekingu](https://github.com/comradekingu)
+
+### Amharic
+
+- henok3878 - [https://github.com/henok3878](https://github.com/henok3878)
diff --git a/README.md b/README.md
index 2e0d16b9..cb728a73 100644
--- a/README.md
+++ b/README.md
@@ -24,20 +24,33 @@ height="80">](https://play.google.com/store/apps/details?id=de.wger.flutter)
alt="Get it on F-Droid"
height="80">](https://f-droid.org/packages/de.wger.flutter/)
-## Development
+## Developing and contributing
-This is a regular flutter application, so you basically just run `flutter run` in
-the root directory of the project, and optionally use the test server to login
-(the db is reset daily):
+Our goal is to build an awesome and flexible fitness and nutrition manager,
+along with a comprehensive list of exercises and ingredients, all released
+under a free license.
+
+For this, we’d love your help! Whether it’s code, translations, exercises or
+reporting issues and ideas, check out our
+[contribution guide](https://wger.readthedocs.io/en/latest/contributing.html)
+to get started.
+
+A huge thank you to everyone who has contributed so far! ❤️ See the full list
+in [AUTHORS.md](AUTHORS.md).
+
+**TLDR**
+
+```bash
+flutter run
+```
+
+This is a regular flutter application, so there's no magic. You will need a backend
+for this, so feel free to use the test server for this (the db is reset daily):
* URL: `https://wger-master.rge.uber.space`
* username: `user`
* password: `flutteruser`
-For more information consult the development documentation:
-
-
-
## Translation
Translate the app to your language on [Weblate](https://hosted.weblate.org/engage/wger/).
diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index 1e198ad9..4e50bad4 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -29,10 +29,6 @@
android:enableOnBackInvokedCallback="true"
android:networkSecurityConfig="@xml/network_security_config">
-
-
https://github.com/wger-project இல் மூலக் குறியீட்டைக் கண்டறியவும்.
+
+-> உங்கள் கேள்விகளைக் கேளுங்கள் அல்லது எங்கள் டிஸ்கார்ட் சர்வரில் ஹலோ சொல்லுங்கள் https://discord.gg/rPWFv6W
diff --git a/fastlane/metadata/android/ta-IN/short_description.txt b/fastlane/metadata/android/ta-IN/short_description.txt
new file mode 100644
index 00000000..4391c682
--- /dev/null
+++ b/fastlane/metadata/android/ta-IN/short_description.txt
@@ -0,0 +1 @@
+உடற்தகுதி/உடற்பயிற்சி, ஊட்டச்சத்து மற்றும் எடை கண்காணிப்பு
diff --git a/fastlane/metadata/android/ta-IN/title.txt b/fastlane/metadata/android/ta-IN/title.txt
new file mode 100644
index 00000000..ea0df956
--- /dev/null
+++ b/fastlane/metadata/android/ta-IN/title.txt
@@ -0,0 +1 @@
+wger Workout Manager
\ No newline at end of file
diff --git a/fastlane/metadata/envfiles/decrypt_secrets.sh b/fastlane/metadata/envfiles/decrypt_secrets.sh
index e44097a1..0d1c7983 100755
--- a/fastlane/metadata/envfiles/decrypt_secrets.sh
+++ b/fastlane/metadata/envfiles/decrypt_secrets.sh
@@ -6,14 +6,20 @@
# To encrypt a new version of the keys:
# gpg -c filename.json
-echo "decrypting playstore API keys"
-gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPTKEY_PLAYSTORE" \
---output ./playstore.json playstore.json.gpg
+if [ -n "$DECRYPTKEY_PLAYSTORE" ]; then
+ echo "decrypting playstore API keys"
+ gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPTKEY_PLAYSTORE" \
+ --output ./playstore.json playstore.json.gpg
+fi
-echo "decrypting key.properties"
-gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPTKEY_PROPERTIES" \
---output ./key.properties key.properties.gpg
+if [ -n "$DECRYPTKEY_PROPERTIES" ]; then
+ echo "decrypting key.properties"
+ gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPTKEY_PROPERTIES" \
+ --output ./key.properties key.properties.gpg
+fi
-echo "decrypting playstore signing keys"
-gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPTKEY_PLAYSTORE_SIGNING_KEY" \
---output ./keys.jks keys.jks.gpg
\ No newline at end of file
+if [ -n "$DECRYPTKEY_PLAYSTORE_SIGNING_KEY" ]; then
+ echo "decrypting playstore signing keys"
+ gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPTKEY_PLAYSTORE_SIGNING_KEY" \
+ --output ./keys.jks keys.jks.gpg
+fi
\ No newline at end of file
diff --git a/flatpak/scripts/flatpak_packager.dart b/flatpak/scripts/flatpak_packager.dart
index 92cf2768..2caaf525 100644
--- a/flatpak/scripts/flatpak_packager.dart
+++ b/flatpak/scripts/flatpak_packager.dart
@@ -1,6 +1,7 @@
// ignore_for_file: avoid_print
import 'dart:io';
+
import 'flatpak_shared.dart';
/// Creates an archive containing all the sources for the Flatpak package for a
@@ -25,7 +26,8 @@ void main(List arguments) async {
final metaIndex = arguments.indexOf('--meta');
if (metaIndex == -1) {
throw Exception(
- 'You must run this script with a metadata file argument, using the --meta flag.');
+ 'You must run this script with a metadata file argument, using the --meta flag.',
+ );
}
if (arguments.length == metaIndex + 1) {
throw Exception('The --meta flag must be followed by the path to the metadata file.');
@@ -54,12 +56,16 @@ void main(List arguments) async {
await outputDir.create();
final packageGenerator = PackageGenerator(
- inputDir: metaFile.parent, meta: meta, addedTodaysVersion: addedTodaysVersion);
+ inputDir: metaFile.parent,
+ meta: meta,
+ addedTodaysVersion: addedTodaysVersion,
+ );
await packageGenerator.generatePackage(
- outputDir,
- await PackageGenerator.runningOnARM() ? CPUArchitecture.aarch64 : CPUArchitecture.x86_64,
- fetchFromGithub);
+ outputDir,
+ await PackageGenerator.runningOnARM() ? CPUArchitecture.aarch64 : CPUArchitecture.x86_64,
+ fetchFromGithub,
+ );
}
class PackageGenerator {
@@ -67,10 +73,17 @@ class PackageGenerator {
final FlatpakMeta meta;
final String? addedTodaysVersion;
- PackageGenerator({required this.inputDir, required this.meta, required this.addedTodaysVersion});
+ const PackageGenerator({
+ required this.inputDir,
+ required this.meta,
+ required this.addedTodaysVersion,
+ });
Future generatePackage(
- Directory outputDir, CPUArchitecture arch, bool fetchReleasesFromGithub) async {
+ Directory outputDir,
+ CPUArchitecture arch,
+ bool fetchReleasesFromGithub,
+ ) async {
final tempDir = await outputDir.createTemp('flutter_generator_temp');
final appId = meta.appId;
@@ -79,7 +92,8 @@ class PackageGenerator {
if (!(await desktopFile.exists())) {
throw Exception(
- 'The desktop file does not exist under the specified path: ${desktopFile.path}');
+ 'The desktop file does not exist under the specified path: ${desktopFile.path}',
+ );
}
await desktopFile.copy('${tempDir.path}/$appId.desktop');
@@ -101,12 +115,14 @@ class PackageGenerator {
final origAppStreamFile = File('${inputDir.path}/${meta.appStreamPath}');
if (!(await origAppStreamFile.exists())) {
throw Exception(
- 'The app data file does not exist under the specified path: ${origAppStreamFile.path}');
+ 'The app data file does not exist under the specified path: ${origAppStreamFile.path}',
+ );
}
final editedAppStreamContent = AppStreamModifier.replaceVersions(
- await origAppStreamFile.readAsString(),
- await meta.getReleases(fetchReleasesFromGithub, addedTodaysVersion));
+ await origAppStreamFile.readAsString(),
+ await meta.getReleases(fetchReleasesFromGithub, addedTodaysVersion),
+ );
final editedAppStreamFile = File('${tempDir.path}/$appId.metainfo.xml');
await editedAppStreamFile.writeAsString(editedAppStreamContent);
@@ -117,7 +133,8 @@ class PackageGenerator {
final buildDir = Directory(bundlePath);
if (!(await buildDir.exists())) {
throw Exception(
- 'The linux build directory does not exist under the specified path: ${buildDir.path}');
+ 'The linux build directory does not exist under the specified path: ${buildDir.path}',
+ );
}
final destDir = Directory('${tempDir.path}/bin');
await destDir.create();
@@ -159,9 +176,10 @@ class AppStreamModifier {
.replaceAll('\n', '<~>')
.replaceFirst(RegExp(''), releasesSection)
.replaceAll('<~>', '\n');
- } else {
- return origAppStreamContent.replaceFirst(
- '', '\n\t$releasesSection\n');
}
+ return origAppStreamContent.replaceFirst(
+ '',
+ '\n\t$releasesSection\n',
+ );
}
}
diff --git a/flatpak/scripts/flatpak_shared.dart b/flatpak/scripts/flatpak_shared.dart
index 75ce96cf..eaf445a0 100644
--- a/flatpak/scripts/flatpak_shared.dart
+++ b/flatpak/scripts/flatpak_shared.dart
@@ -9,7 +9,7 @@ class Release {
final String version;
final String date; //TODO add resources
- Release({required this.version, required this.date});
+ const Release({required this.version, required this.date});
}
enum CPUArchitecture {
@@ -18,6 +18,7 @@ enum CPUArchitecture {
final String flatpakArchCode;
final String flutterDirName;
+
const CPUArchitecture(this.flatpakArchCode, this.flutterDirName);
}
@@ -27,11 +28,12 @@ class ReleaseAsset {
final bool isRelativeLocalPath;
final String tarballSha256;
- ReleaseAsset(
- {required this.arch,
- required this.tarballUrlOrPath,
- required this.isRelativeLocalPath,
- required this.tarballSha256});
+ const ReleaseAsset({
+ required this.arch,
+ required this.tarballUrlOrPath,
+ required this.isRelativeLocalPath,
+ required this.tarballSha256,
+ });
}
class Icon {
@@ -72,9 +74,10 @@ class GithubReleases {
Future _fetchReleasesAndAssets(bool canBeEmpty) async {
final releaseJsonContent = (await http.get(Uri(
- scheme: 'https',
- host: 'api.github.com',
- path: '/repos/$githubReleaseOrganization/$githubReleaseProject/releases')))
+ scheme: 'https',
+ host: 'api.github.com',
+ path: '/repos/$githubReleaseOrganization/$githubReleaseProject/releases',
+ )))
.body;
final decodedJson = jsonDecode(releaseJsonContent) as List;
@@ -154,17 +157,19 @@ class GithubReleases {
final res = List.empty(growable: true);
if (x64TarballUrl != null && x64Sha != null) {
res.add(ReleaseAsset(
- arch: CPUArchitecture.x86_64,
- tarballUrlOrPath: x64TarballUrl,
- isRelativeLocalPath: false,
- tarballSha256: x64Sha));
+ arch: CPUArchitecture.x86_64,
+ tarballUrlOrPath: x64TarballUrl,
+ isRelativeLocalPath: false,
+ tarballSha256: x64Sha,
+ ));
}
if (aarch64TarballUrl != null && aarch64Sha != null) {
res.add(ReleaseAsset(
- arch: CPUArchitecture.aarch64,
- tarballUrlOrPath: aarch64TarballUrl,
- isRelativeLocalPath: false,
- tarballSha256: aarch64Sha));
+ arch: CPUArchitecture.aarch64,
+ tarballUrlOrPath: aarch64TarballUrl,
+ isRelativeLocalPath: false,
+ tarballSha256: aarch64Sha,
+ ));
}
return res.isEmpty ? null : res;
}
@@ -196,22 +201,22 @@ class FlatpakMeta {
final String? githubReleaseProject;
late final GithubReleases? _githubReleases;
- FlatpakMeta(
- {required this.appId,
- required this.lowercaseAppName,
- required this.githubReleaseOrganization,
- required this.githubReleaseProject,
- required List? localReleases,
- required List? localReleaseAssets,
- required this.localLinuxBuildDir,
- required this.appStreamPath,
- required this.desktopPath,
- required this.icons,
- required this.freedesktopRuntime,
- required this.buildCommandsAfterUnpack,
- required this.extraModules,
- required this.finishArgs})
- : _localReleases = localReleases,
+ FlatpakMeta({
+ required this.appId,
+ required this.lowercaseAppName,
+ required this.githubReleaseOrganization,
+ required this.githubReleaseProject,
+ required List? localReleases,
+ required List? localReleaseAssets,
+ required this.localLinuxBuildDir,
+ required this.appStreamPath,
+ required this.desktopPath,
+ required this.icons,
+ required this.freedesktopRuntime,
+ required this.buildCommandsAfterUnpack,
+ required this.extraModules,
+ required this.finishArgs,
+ }) : _localReleases = localReleases,
_localReleaseAssets = localReleaseAssets {
if (githubReleaseOrganization != null && githubReleaseProject != null) {
_githubReleases = GithubReleases(githubReleaseOrganization!, githubReleaseProject!);
@@ -219,16 +224,21 @@ class FlatpakMeta {
}
Future> getReleases(
- bool fetchReleasesFromGithub, String? addedTodaysVersion) async {
+ bool fetchReleasesFromGithub,
+ String? addedTodaysVersion,
+ ) async {
final releases = List.empty(growable: true);
if (addedTodaysVersion != null) {
releases.add(Release(
- version: addedTodaysVersion, date: DateTime.now().toIso8601String().split('T').first));
+ version: addedTodaysVersion,
+ date: DateTime.now().toIso8601String().split('T').first,
+ ));
}
if (fetchReleasesFromGithub) {
if (_githubReleases == null) {
throw Exception(
- 'Metadata must include Github repository info if fetching releases from Github.');
+ 'Metadata must include Github repository info if fetching releases from Github.',
+ );
}
releases.addAll(await _githubReleases!.getReleases(addedTodaysVersion != null));
} else {
@@ -246,71 +256,73 @@ class FlatpakMeta {
if (fetchReleasesFromGithub) {
if (_githubReleases == null) {
throw Exception(
- 'Metadata must include Github repository info if fetching releases from Github.');
+ 'Metadata must include Github repository info if fetching releases from Github.',
+ );
}
return _githubReleases!.getLatestReleaseAssets();
- } else {
- if (_localReleases == null) {
- throw Exception('Metadata must include releases if not fetching releases from Github.');
- }
- return _localReleaseAssets;
}
+ if (_localReleases == null) {
+ throw Exception('Metadata must include releases if not fetching releases from Github.');
+ }
+ return _localReleaseAssets;
}
static FlatpakMeta fromJson(File jsonFile, {bool skipLocalReleases = false}) {
try {
final dynamic json = jsonDecode(jsonFile.readAsStringSync());
return FlatpakMeta(
- appId: json['appId'] as String,
- lowercaseAppName: json['lowercaseAppName'] as String,
- githubReleaseOrganization: json['githubReleaseOrganization'] as String?,
- githubReleaseProject: json['githubReleaseProject'] as String?,
- localReleases: skipLocalReleases
- ? null
- : (json['localReleases'] as List?)?.map((dynamic r) {
- final rMap = r as Map;
- return Release(version: rMap['version'] as String, date: rMap['date'] as String);
- }).toList(),
- localReleaseAssets: skipLocalReleases
- ? null
- : (json['localReleaseAssets'] as List?)?.map((dynamic ra) {
- final raMap = ra as Map;
- final archString = raMap['arch'] as String;
- final arch = (archString == CPUArchitecture.x86_64.flatpakArchCode)
- ? CPUArchitecture.x86_64
- : (archString == CPUArchitecture.aarch64.flatpakArchCode)
- ? CPUArchitecture.aarch64
- : null;
- if (arch == null) {
- throw Exception(
- 'Architecture must be either "${CPUArchitecture.x86_64.flatpakArchCode}" or "${CPUArchitecture.aarch64.flatpakArchCode}"');
- }
- final tarballFile =
- File('${jsonFile.parent.path}/${raMap['tarballPath'] as String}');
- final tarballPath = tarballFile.absolute.path;
- final preShasum = Process.runSync('shasum', ['-a', '256', tarballPath]);
- final shasum = preShasum.stdout.toString().split(' ').first;
- if (preShasum.exitCode != 0) {
- throw Exception(preShasum.stderr);
- }
- return ReleaseAsset(
- arch: arch,
- tarballUrlOrPath: tarballPath,
- isRelativeLocalPath: true,
- tarballSha256: shasum);
- }).toList(),
- localLinuxBuildDir: json['localLinuxBuildDir'] as String,
- appStreamPath: json['appStreamPath'] as String,
- desktopPath: json['desktopPath'] as String,
- icons: (json['icons'] as Map).entries.map((mapEntry) {
- return Icon(type: mapEntry.key as String, path: mapEntry.value as String);
- }).toList(),
- freedesktopRuntime: json['freedesktopRuntime'] as String,
- buildCommandsAfterUnpack: (json['buildCommandsAfterUnpack'] as List?)
- ?.map((dynamic bc) => bc as String)
- .toList(),
- extraModules: json['extraModules'] as List?,
- finishArgs: (json['finishArgs'] as List).map((dynamic fa) => fa as String).toList());
+ appId: json['appId'] as String,
+ lowercaseAppName: json['lowercaseAppName'] as String,
+ githubReleaseOrganization: json['githubReleaseOrganization'] as String?,
+ githubReleaseProject: json['githubReleaseProject'] as String?,
+ localReleases: skipLocalReleases
+ ? null
+ : (json['localReleases'] as List?)?.map((dynamic r) {
+ final rMap = r as Map;
+ return Release(version: rMap['version'] as String, date: rMap['date'] as String);
+ }).toList(),
+ localReleaseAssets: skipLocalReleases
+ ? null
+ : (json['localReleaseAssets'] as List?)?.map((dynamic ra) {
+ final raMap = ra as Map;
+ final archString = raMap['arch'] as String;
+ final arch = (archString == CPUArchitecture.x86_64.flatpakArchCode)
+ ? CPUArchitecture.x86_64
+ : (archString == CPUArchitecture.aarch64.flatpakArchCode)
+ ? CPUArchitecture.aarch64
+ : null;
+ if (arch == null) {
+ throw Exception(
+ 'Architecture must be either "${CPUArchitecture.x86_64.flatpakArchCode}" or "${CPUArchitecture.aarch64.flatpakArchCode}"',
+ );
+ }
+ final tarballFile =
+ File('${jsonFile.parent.path}/${raMap['tarballPath'] as String}');
+ final tarballPath = tarballFile.absolute.path;
+ final preShasum = Process.runSync('shasum', ['-a', '256', tarballPath]);
+ final shasum = preShasum.stdout.toString().split(' ').first;
+ if (preShasum.exitCode != 0) {
+ throw Exception(preShasum.stderr);
+ }
+ return ReleaseAsset(
+ arch: arch,
+ tarballUrlOrPath: tarballPath,
+ isRelativeLocalPath: true,
+ tarballSha256: shasum,
+ );
+ }).toList(),
+ localLinuxBuildDir: json['localLinuxBuildDir'] as String,
+ appStreamPath: json['appStreamPath'] as String,
+ desktopPath: json['desktopPath'] as String,
+ icons: (json['icons'] as Map).entries.map((mapEntry) {
+ return Icon(type: mapEntry.key as String, path: mapEntry.value as String);
+ }).toList(),
+ freedesktopRuntime: json['freedesktopRuntime'] as String,
+ buildCommandsAfterUnpack:
+ (json['buildCommandsAfterUnpack'] as List?)?.map((dynamic bc) => bc as String).toList(),
+ extraModules: json['extraModules'] as List?,
+ finishArgs: (json['finishArgs'] as List).map((dynamic fa) => fa as String).toList(),
+ );
} catch (e) {
throw Exception('Could not parse JSON file, due to this error:\n$e');
}
diff --git a/ios/Gemfile b/ios/Gemfile
new file mode 100644
index 00000000..7a118b49
--- /dev/null
+++ b/ios/Gemfile
@@ -0,0 +1,3 @@
+source "https://rubygems.org"
+
+gem "fastlane"
diff --git a/ios/Gemfile.lock b/ios/Gemfile.lock
new file mode 100644
index 00000000..350474d8
--- /dev/null
+++ b/ios/Gemfile.lock
@@ -0,0 +1,222 @@
+GEM
+ remote: https://rubygems.org/
+ specs:
+ CFPropertyList (3.0.7)
+ base64
+ nkf
+ rexml
+ addressable (2.8.7)
+ public_suffix (>= 2.0.2, < 7.0)
+ artifactory (3.0.17)
+ atomos (0.1.3)
+ aws-eventstream (1.3.0)
+ aws-partitions (1.1018.0)
+ aws-sdk-core (3.214.0)
+ aws-eventstream (~> 1, >= 1.3.0)
+ aws-partitions (~> 1, >= 1.992.0)
+ aws-sigv4 (~> 1.9)
+ jmespath (~> 1, >= 1.6.1)
+ aws-sdk-kms (1.96.0)
+ aws-sdk-core (~> 3, >= 3.210.0)
+ aws-sigv4 (~> 1.5)
+ aws-sdk-s3 (1.176.0)
+ aws-sdk-core (~> 3, >= 3.210.0)
+ aws-sdk-kms (~> 1)
+ aws-sigv4 (~> 1.5)
+ aws-sigv4 (1.10.1)
+ aws-eventstream (~> 1, >= 1.0.2)
+ babosa (1.0.4)
+ base64 (0.2.0)
+ claide (1.1.0)
+ colored (1.2)
+ colored2 (3.1.2)
+ commander (4.6.0)
+ highline (~> 2.0.0)
+ declarative (0.0.20)
+ digest-crc (0.6.5)
+ rake (>= 12.0.0, < 14.0.0)
+ domain_name (0.6.20240107)
+ dotenv (2.8.1)
+ emoji_regex (3.2.3)
+ excon (0.112.0)
+ faraday (1.10.4)
+ faraday-em_http (~> 1.0)
+ faraday-em_synchrony (~> 1.0)
+ faraday-excon (~> 1.1)
+ faraday-httpclient (~> 1.0)
+ faraday-multipart (~> 1.0)
+ faraday-net_http (~> 1.0)
+ faraday-net_http_persistent (~> 1.0)
+ faraday-patron (~> 1.0)
+ faraday-rack (~> 1.0)
+ faraday-retry (~> 1.0)
+ ruby2_keywords (>= 0.0.4)
+ faraday-cookie_jar (0.0.7)
+ faraday (>= 0.8.0)
+ http-cookie (~> 1.0.0)
+ faraday-em_http (1.0.0)
+ faraday-em_synchrony (1.0.0)
+ faraday-excon (1.1.0)
+ faraday-httpclient (1.0.1)
+ faraday-multipart (1.0.4)
+ multipart-post (~> 2)
+ faraday-net_http (1.0.2)
+ faraday-net_http_persistent (1.2.0)
+ faraday-patron (1.0.0)
+ faraday-rack (1.0.0)
+ faraday-retry (1.0.3)
+ faraday_middleware (1.2.1)
+ faraday (~> 1.0)
+ fastimage (2.3.1)
+ fastlane (2.225.0)
+ CFPropertyList (>= 2.3, < 4.0.0)
+ addressable (>= 2.8, < 3.0.0)
+ artifactory (~> 3.0)
+ aws-sdk-s3 (~> 1.0)
+ babosa (>= 1.0.3, < 2.0.0)
+ bundler (>= 1.12.0, < 3.0.0)
+ colored (~> 1.2)
+ commander (~> 4.6)
+ dotenv (>= 2.1.1, < 3.0.0)
+ emoji_regex (>= 0.1, < 4.0)
+ excon (>= 0.71.0, < 1.0.0)
+ faraday (~> 1.0)
+ faraday-cookie_jar (~> 0.0.6)
+ faraday_middleware (~> 1.0)
+ fastimage (>= 2.1.0, < 3.0.0)
+ fastlane-sirp (>= 1.0.0)
+ gh_inspector (>= 1.1.2, < 2.0.0)
+ google-apis-androidpublisher_v3 (~> 0.3)
+ google-apis-playcustomapp_v1 (~> 0.1)
+ google-cloud-env (>= 1.6.0, < 2.0.0)
+ google-cloud-storage (~> 1.31)
+ highline (~> 2.0)
+ http-cookie (~> 1.0.5)
+ json (< 3.0.0)
+ jwt (>= 2.1.0, < 3)
+ mini_magick (>= 4.9.4, < 5.0.0)
+ multipart-post (>= 2.0.0, < 3.0.0)
+ naturally (~> 2.2)
+ optparse (>= 0.1.1, < 1.0.0)
+ plist (>= 3.1.0, < 4.0.0)
+ rubyzip (>= 2.0.0, < 3.0.0)
+ security (= 0.1.5)
+ simctl (~> 1.6.3)
+ terminal-notifier (>= 2.0.0, < 3.0.0)
+ terminal-table (~> 3)
+ tty-screen (>= 0.6.3, < 1.0.0)
+ tty-spinner (>= 0.8.0, < 1.0.0)
+ word_wrap (~> 1.0.0)
+ xcodeproj (>= 1.13.0, < 2.0.0)
+ xcpretty (~> 0.3.0)
+ xcpretty-travis-formatter (>= 0.0.3, < 2.0.0)
+ fastlane-sirp (1.0.0)
+ sysrandom (~> 1.0)
+ gh_inspector (1.1.3)
+ google-apis-androidpublisher_v3 (0.54.0)
+ google-apis-core (>= 0.11.0, < 2.a)
+ google-apis-core (0.11.3)
+ addressable (~> 2.5, >= 2.5.1)
+ googleauth (>= 0.16.2, < 2.a)
+ httpclient (>= 2.8.1, < 3.a)
+ mini_mime (~> 1.0)
+ representable (~> 3.0)
+ retriable (>= 2.0, < 4.a)
+ rexml
+ google-apis-iamcredentials_v1 (0.17.0)
+ google-apis-core (>= 0.11.0, < 2.a)
+ google-apis-playcustomapp_v1 (0.13.0)
+ google-apis-core (>= 0.11.0, < 2.a)
+ google-apis-storage_v1 (0.31.0)
+ google-apis-core (>= 0.11.0, < 2.a)
+ google-cloud-core (1.7.1)
+ google-cloud-env (>= 1.0, < 3.a)
+ google-cloud-errors (~> 1.0)
+ google-cloud-env (1.6.0)
+ faraday (>= 0.17.3, < 3.0)
+ google-cloud-errors (1.4.0)
+ google-cloud-storage (1.47.0)
+ addressable (~> 2.8)
+ digest-crc (~> 0.4)
+ google-apis-iamcredentials_v1 (~> 0.1)
+ google-apis-storage_v1 (~> 0.31.0)
+ google-cloud-core (~> 1.6)
+ googleauth (>= 0.16.2, < 2.a)
+ mini_mime (~> 1.0)
+ googleauth (1.8.1)
+ faraday (>= 0.17.3, < 3.a)
+ jwt (>= 1.4, < 3.0)
+ multi_json (~> 1.11)
+ os (>= 0.9, < 2.0)
+ signet (>= 0.16, < 2.a)
+ highline (2.0.3)
+ http-cookie (1.0.8)
+ domain_name (~> 0.5)
+ httpclient (2.8.3)
+ jmespath (1.6.2)
+ json (2.9.0)
+ jwt (2.9.3)
+ base64
+ mini_magick (4.13.2)
+ mini_mime (1.1.5)
+ multi_json (1.15.0)
+ multipart-post (2.4.1)
+ nanaimo (0.4.0)
+ naturally (2.2.1)
+ nkf (0.2.0)
+ optparse (0.6.0)
+ os (1.1.4)
+ plist (3.7.1)
+ public_suffix (6.0.1)
+ rake (13.2.1)
+ representable (3.2.0)
+ declarative (< 0.1.0)
+ trailblazer-option (>= 0.1.1, < 0.2.0)
+ uber (< 0.2.0)
+ retriable (3.1.2)
+ rexml (3.3.9)
+ rouge (2.0.7)
+ ruby2_keywords (0.0.5)
+ rubyzip (2.3.2)
+ security (0.1.5)
+ signet (0.19.0)
+ addressable (~> 2.8)
+ faraday (>= 0.17.5, < 3.a)
+ jwt (>= 1.5, < 3.0)
+ multi_json (~> 1.10)
+ 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)
+ trailblazer-option (0.1.2)
+ tty-cursor (0.7.1)
+ tty-screen (0.8.2)
+ tty-spinner (0.9.3)
+ tty-cursor (~> 0.7)
+ uber (0.1.0)
+ unicode-display_width (2.6.0)
+ word_wrap (1.0.0)
+ xcodeproj (1.27.0)
+ CFPropertyList (>= 2.3.3, < 4.0)
+ atomos (~> 0.1.3)
+ claide (>= 1.0.2, < 2.0)
+ colored2 (~> 3.1)
+ nanaimo (~> 0.4.0)
+ rexml (>= 3.3.6, < 4.0)
+ xcpretty (0.3.0)
+ rouge (~> 2.0.7)
+ xcpretty-travis-formatter (1.0.1)
+ xcpretty (~> 0.2, >= 0.0.7)
+
+PLATFORMS
+ arm64-darwin-24
+ ruby
+
+DEPENDENCIES
+ fastlane
+
+BUNDLED WITH
+ 2.5.18
diff --git a/ios/Podfile b/ios/Podfile
index 2c068c40..0b62d79e 100644
--- a/ios/Podfile
+++ b/ios/Podfile
@@ -1,5 +1,5 @@
# Uncomment this line to define a global platform for your project
-platform :ios, '12.0'
+platform :ios, '14.0'
# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
ENV['COCOAPODS_DISABLE_STATS'] = 'true'
diff --git a/ios/Podfile.lock b/ios/Podfile.lock
index 364cb767..065b1a2a 100644
--- a/ios/Podfile.lock
+++ b/ios/Podfile.lock
@@ -2,8 +2,6 @@ PODS:
- camera_avfoundation (0.0.1):
- Flutter
- Flutter (1.0.0)
- - flutter_barcode_scanner (2.0.0):
- - Flutter
- flutter_keyboard_visibility (0.0.1):
- Flutter
- flutter_zxing (0.0.1):
@@ -24,23 +22,26 @@ PODS:
- shared_preferences_foundation (0.0.1):
- Flutter
- FlutterMacOS
- - sqlite3 (3.48.0):
- - sqlite3/common (= 3.48.0)
- - sqlite3/common (3.48.0)
- - sqlite3/dbstatvtab (3.48.0):
+ - sqlite3 (3.49.1):
+ - sqlite3/common (= 3.49.1)
+ - sqlite3/common (3.49.1)
+ - sqlite3/dbstatvtab (3.49.1):
- sqlite3/common
- - sqlite3/fts5 (3.48.0):
+ - sqlite3/fts5 (3.49.1):
- sqlite3/common
- - sqlite3/perf-threadsafe (3.48.0):
+ - sqlite3/math (3.49.1):
- sqlite3/common
- - sqlite3/rtree (3.48.0):
+ - sqlite3/perf-threadsafe (3.49.1):
+ - sqlite3/common
+ - sqlite3/rtree (3.49.1):
- sqlite3/common
- sqlite3_flutter_libs (0.0.1):
- Flutter
- FlutterMacOS
- - sqlite3 (~> 3.48.0)
+ - sqlite3 (~> 3.49.1)
- sqlite3/dbstatvtab
- sqlite3/fts5
+ - sqlite3/math
- sqlite3/perf-threadsafe
- sqlite3/rtree
- url_launcher_ios (0.0.1):
@@ -52,7 +53,6 @@ PODS:
DEPENDENCIES:
- camera_avfoundation (from `.symlinks/plugins/camera_avfoundation/ios`)
- Flutter (from `Flutter`)
- - flutter_barcode_scanner (from `.symlinks/plugins/flutter_barcode_scanner/ios`)
- flutter_keyboard_visibility (from `.symlinks/plugins/flutter_keyboard_visibility/ios`)
- flutter_zxing (from `.symlinks/plugins/flutter_zxing/ios`)
- image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`)
@@ -75,8 +75,6 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/camera_avfoundation/ios"
Flutter:
:path: Flutter
- flutter_barcode_scanner:
- :path: ".symlinks/plugins/flutter_barcode_scanner/ios"
flutter_keyboard_visibility:
:path: ".symlinks/plugins/flutter_keyboard_visibility/ios"
flutter_zxing:
@@ -105,7 +103,6 @@ EXTERNAL SOURCES:
SPEC CHECKSUMS:
camera_avfoundation: 04b44aeb14070126c6529e5ab82cc7c9fca107cf
Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7
- flutter_barcode_scanner: c5aa9f51c150a6242fa392386bd52b64bb27fcb5
flutter_keyboard_visibility: 4625131e43015dbbe759d9b20daaf77e0e3f6619
flutter_zxing: e741c4f3335db8910e5c396c4291cdfb320859dc
image_picker_ios: 7fe1ff8e34c1790d6fff70a32484959f563a928a
@@ -115,8 +112,8 @@ SPEC CHECKSUMS:
pointer_interceptor_ios: ec847ef8b0915778bed2b2cef636f4d177fa8eed
rive_common: dd421daaf9ae69f0125aa761dd96abd278399952
shared_preferences_foundation: 9e1978ff2562383bd5676f64ec4e9aa8fa06a6f7
- sqlite3: 3da10a59910c809fb584a93aa46a3f05b785e12e
- sqlite3_flutter_libs: c26d86af4ad88f1465dc4e07e6dc6931eef228e4
+ sqlite3: fc1400008a9b3525f5914ed715a5d1af0b8f4983
+ sqlite3_flutter_libs: f6acaa2172e6bb3e2e70c771661905080e8ebcf2
url_launcher_ios: 694010445543906933d732453a59da0a173ae33d
video_player_avfoundation: 2cef49524dd1f16c5300b9cd6efd9611ce03639b
diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj
index 3209bb17..9d2e3de6 100644
--- a/ios/Runner.xcodeproj/project.pbxproj
+++ b/ios/Runner.xcodeproj/project.pbxproj
@@ -8,9 +8,9 @@
/* Begin PBXBuildFile section */
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
+ 3845DFE0762714C6680D5DFA /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AFA44D9DB464FB85F130C5B5 /* Pods_Runner.framework */; };
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
- 78C727F12E8C2C2BF5ED5703 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DAC1C25406C5CD78CE59E547 /* Pods_Runner.framework */; };
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
@@ -30,14 +30,15 @@
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
- 0661B42137D743038BB7032F /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; };
- 0AA56188CB2769B47E250516 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; };
+ 0ED96167FF623FAB319C6E99 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; };
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; };
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; };
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; };
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; };
74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; };
+ 89F44165E15E0A7B109A05EB /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; };
+ 8D383D452D8E929100066A20 /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = ""; };
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; };
9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; };
97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -45,8 +46,8 @@
97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
- C19FA8F529BB2B899AB0C23A /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; };
- DAC1C25406C5CD78CE59E547 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFA44D9DB464FB85F130C5B5 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ C71BAD15819A771165D784B0 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -54,17 +55,17 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
- 78C727F12E8C2C2BF5ED5703 /* Pods_Runner.framework in Frameworks */,
+ 3845DFE0762714C6680D5DFA /* Pods_Runner.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
- 631B4307BD65C9D08E514EBB /* Frameworks */ = {
+ 23E168F95D2790D29E207E68 /* Frameworks */ = {
isa = PBXGroup;
children = (
- DAC1C25406C5CD78CE59E547 /* Pods_Runner.framework */,
+ AFA44D9DB464FB85F130C5B5 /* Pods_Runner.framework */,
);
name = Frameworks;
sourceTree = "";
@@ -87,7 +88,7 @@
97C146F01CF9000F007C117D /* Runner */,
97C146EF1CF9000F007C117D /* Products */,
BB0286322FD60C00014F981C /* Pods */,
- 631B4307BD65C9D08E514EBB /* Frameworks */,
+ 23E168F95D2790D29E207E68 /* Frameworks */,
);
sourceTree = "";
};
@@ -102,6 +103,7 @@
97C146F01CF9000F007C117D /* Runner */ = {
isa = PBXGroup;
children = (
+ 8D383D452D8E929100066A20 /* Runner.entitlements */,
97C146FA1CF9000F007C117D /* Main.storyboard */,
97C146FD1CF9000F007C117D /* Assets.xcassets */,
97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,
@@ -117,9 +119,9 @@
BB0286322FD60C00014F981C /* Pods */ = {
isa = PBXGroup;
children = (
- 0661B42137D743038BB7032F /* Pods-Runner.debug.xcconfig */,
- C19FA8F529BB2B899AB0C23A /* Pods-Runner.release.xcconfig */,
- 0AA56188CB2769B47E250516 /* Pods-Runner.profile.xcconfig */,
+ C71BAD15819A771165D784B0 /* Pods-Runner.debug.xcconfig */,
+ 0ED96167FF623FAB319C6E99 /* Pods-Runner.release.xcconfig */,
+ 89F44165E15E0A7B109A05EB /* Pods-Runner.profile.xcconfig */,
);
path = Pods;
sourceTree = "";
@@ -131,14 +133,14 @@
isa = PBXNativeTarget;
buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
buildPhases = (
- 55A9F1D1670043D7444258F2 /* [CP] Check Pods Manifest.lock */,
+ 49A79EC3F389C902853B9186 /* [CP] Check Pods Manifest.lock */,
9740EEB61CF901F6004384FC /* Run Script */,
97C146EA1CF9000F007C117D /* Sources */,
97C146EB1CF9000F007C117D /* Frameworks */,
97C146EC1CF9000F007C117D /* Resources */,
9705A1C41CF9048500538489 /* Embed Frameworks */,
3B06AD1E1E4923F5004D2608 /* Thin Binary */,
- 8D4C3EABCD024FF4FF37C7E4 /* [CP] Embed Pods Frameworks */,
+ 0A9E38C31DF3DC192213822E /* [CP] Embed Pods Frameworks */,
);
buildRules = (
);
@@ -197,6 +199,23 @@
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
+ 0A9E38C31DF3DC192213822E /* [CP] Embed Pods Frameworks */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
+ );
+ name = "[CP] Embed Pods Frameworks";
+ outputFileListPaths = (
+ "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
+ showEnvVarsInLog = 0;
+ };
3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
@@ -213,7 +232,7 @@
shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
};
- 55A9F1D1670043D7444258F2 /* [CP] Check Pods Manifest.lock */ = {
+ 49A79EC3F389C902853B9186 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
@@ -235,23 +254,6 @@
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
- 8D4C3EABCD024FF4FF37C7E4 /* [CP] Embed Pods Frameworks */ = {
- isa = PBXShellScriptBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- inputFileListPaths = (
- "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
- );
- name = "[CP] Embed Pods Frameworks";
- outputFileListPaths = (
- "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
- );
- runOnlyForDeploymentPostprocessing = 0;
- shellPath = /bin/sh;
- shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
- showEnvVarsInLog = 0;
- };
9740EEB61CF901F6004384FC /* Run Script */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
@@ -357,8 +359,9 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
+ CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
- DEVELOPMENT_TEAM = 643RNGR6QG;
+ DEVELOPMENT_TEAM = U92KZ4HZ4C;
ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
@@ -373,7 +376,8 @@
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
);
- PRODUCT_BUNDLE_IDENTIFIER = de.wger.flutter;
+ MARKETING_VERSION = 1.8.0;
+ PRODUCT_BUNDLE_IDENTIFIER = de.wger.flutter.community;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
@@ -494,8 +498,9 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
+ CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
- DEVELOPMENT_TEAM = 643RNGR6QG;
+ DEVELOPMENT_TEAM = U92KZ4HZ4C;
ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
@@ -510,7 +515,8 @@
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
);
- PRODUCT_BUNDLE_IDENTIFIER = de.wger.flutter;
+ MARKETING_VERSION = 1.8.0;
+ PRODUCT_BUNDLE_IDENTIFIER = de.wger.flutter.community;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
@@ -525,8 +531,9 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
+ CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
- DEVELOPMENT_TEAM = 643RNGR6QG;
+ DEVELOPMENT_TEAM = U92KZ4HZ4C;
ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
@@ -541,7 +548,8 @@
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
);
- PRODUCT_BUNDLE_IDENTIFIER = de.wger.flutter;
+ MARKETING_VERSION = 1.8.0;
+ PRODUCT_BUNDLE_IDENTIFIER = de.wger.flutter.community;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
index e67b2808..4f746537 100644
--- a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
+++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
@@ -50,6 +50,7 @@
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
+ enableGPUValidationMode = "1"
allowLocationSimulation = "YES">
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/100.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/100.png
new file mode 100644
index 00000000..c8a575a4
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/100.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/1024.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/1024.png
new file mode 100644
index 00000000..8a496566
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/1024.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/114.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/114.png
new file mode 100644
index 00000000..3775ccb8
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/114.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/120.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/120.png
new file mode 100644
index 00000000..0e1aa207
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/120.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/144.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/144.png
new file mode 100644
index 00000000..575fdf76
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/144.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/152.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/152.png
new file mode 100644
index 00000000..3fee4203
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/152.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/167.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/167.png
new file mode 100644
index 00000000..22d94023
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/167.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/180.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/180.png
new file mode 100644
index 00000000..7c03e07d
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/180.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/20.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/20.png
new file mode 100644
index 00000000..4de0c847
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/20.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/29.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/29.png
new file mode 100644
index 00000000..fc9d7fa3
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/29.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/40.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/40.png
new file mode 100644
index 00000000..52af074e
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/40.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/50.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/50.png
new file mode 100644
index 00000000..d7c8f697
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/50.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/57.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/57.png
new file mode 100644
index 00000000..60ddfdfc
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/57.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/58.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/58.png
new file mode 100644
index 00000000..9d4a7f01
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/58.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/60.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/60.png
new file mode 100644
index 00000000..12ffb247
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/60.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/72.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/72.png
new file mode 100644
index 00000000..b3853a74
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/72.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/76.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/76.png
new file mode 100644
index 00000000..a9052ddc
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/76.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/80.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/80.png
new file mode 100644
index 00000000..3748cd9f
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/80.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/87.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/87.png
new file mode 100644
index 00000000..6fab0780
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/87.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
index d36b1fab..4fdf8826 100644
--- a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
+++ b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -1,122 +1,158 @@
{
"images" : [
{
- "size" : "20x20",
+ "filename" : "40.png",
"idiom" : "iphone",
- "filename" : "Icon-App-20x20@2x.png",
- "scale" : "2x"
+ "scale" : "2x",
+ "size" : "20x20"
},
{
- "size" : "20x20",
+ "filename" : "60.png",
"idiom" : "iphone",
- "filename" : "Icon-App-20x20@3x.png",
- "scale" : "3x"
+ "scale" : "3x",
+ "size" : "20x20"
},
{
- "size" : "29x29",
+ "filename" : "29.png",
"idiom" : "iphone",
- "filename" : "Icon-App-29x29@1x.png",
- "scale" : "1x"
+ "scale" : "1x",
+ "size" : "29x29"
},
{
- "size" : "29x29",
+ "filename" : "58.png",
"idiom" : "iphone",
- "filename" : "Icon-App-29x29@2x.png",
- "scale" : "2x"
+ "scale" : "2x",
+ "size" : "29x29"
},
{
- "size" : "29x29",
+ "filename" : "87.png",
"idiom" : "iphone",
- "filename" : "Icon-App-29x29@3x.png",
- "scale" : "3x"
+ "scale" : "3x",
+ "size" : "29x29"
},
{
- "size" : "40x40",
+ "filename" : "80.png",
"idiom" : "iphone",
- "filename" : "Icon-App-40x40@2x.png",
- "scale" : "2x"
+ "scale" : "2x",
+ "size" : "40x40"
},
{
- "size" : "40x40",
+ "filename" : "120.png",
"idiom" : "iphone",
- "filename" : "Icon-App-40x40@3x.png",
- "scale" : "3x"
+ "scale" : "3x",
+ "size" : "40x40"
},
{
- "size" : "60x60",
+ "filename" : "57.png",
"idiom" : "iphone",
- "filename" : "Icon-App-60x60@2x.png",
- "scale" : "2x"
+ "scale" : "1x",
+ "size" : "57x57"
},
{
- "size" : "60x60",
+ "filename" : "114.png",
"idiom" : "iphone",
- "filename" : "Icon-App-60x60@3x.png",
- "scale" : "3x"
+ "scale" : "2x",
+ "size" : "57x57"
},
{
- "size" : "20x20",
+ "filename" : "120.png",
+ "idiom" : "iphone",
+ "scale" : "2x",
+ "size" : "60x60"
+ },
+ {
+ "filename" : "180.png",
+ "idiom" : "iphone",
+ "scale" : "3x",
+ "size" : "60x60"
+ },
+ {
+ "filename" : "20.png",
"idiom" : "ipad",
- "filename" : "Icon-App-20x20@1x.png",
- "scale" : "1x"
+ "scale" : "1x",
+ "size" : "20x20"
},
{
- "size" : "20x20",
+ "filename" : "40.png",
"idiom" : "ipad",
- "filename" : "Icon-App-20x20@2x.png",
- "scale" : "2x"
+ "scale" : "2x",
+ "size" : "20x20"
},
{
- "size" : "29x29",
+ "filename" : "29.png",
"idiom" : "ipad",
- "filename" : "Icon-App-29x29@1x.png",
- "scale" : "1x"
+ "scale" : "1x",
+ "size" : "29x29"
},
{
- "size" : "29x29",
+ "filename" : "58.png",
"idiom" : "ipad",
- "filename" : "Icon-App-29x29@2x.png",
- "scale" : "2x"
+ "scale" : "2x",
+ "size" : "29x29"
},
{
- "size" : "40x40",
+ "filename" : "40.png",
"idiom" : "ipad",
- "filename" : "Icon-App-40x40@1x.png",
- "scale" : "1x"
+ "scale" : "1x",
+ "size" : "40x40"
},
{
- "size" : "40x40",
+ "filename" : "80.png",
"idiom" : "ipad",
- "filename" : "Icon-App-40x40@2x.png",
- "scale" : "2x"
+ "scale" : "2x",
+ "size" : "40x40"
},
{
- "size" : "76x76",
+ "filename" : "50.png",
"idiom" : "ipad",
- "filename" : "Icon-App-76x76@1x.png",
- "scale" : "1x"
+ "scale" : "1x",
+ "size" : "50x50"
},
{
- "size" : "76x76",
+ "filename" : "100.png",
"idiom" : "ipad",
- "filename" : "Icon-App-76x76@2x.png",
- "scale" : "2x"
+ "scale" : "2x",
+ "size" : "50x50"
},
{
- "size" : "83.5x83.5",
+ "filename" : "72.png",
"idiom" : "ipad",
- "filename" : "Icon-App-83.5x83.5@2x.png",
- "scale" : "2x"
+ "scale" : "1x",
+ "size" : "72x72"
},
{
- "size" : "1024x1024",
+ "filename" : "144.png",
+ "idiom" : "ipad",
+ "scale" : "2x",
+ "size" : "72x72"
+ },
+ {
+ "filename" : "76.png",
+ "idiom" : "ipad",
+ "scale" : "1x",
+ "size" : "76x76"
+ },
+ {
+ "filename" : "152.png",
+ "idiom" : "ipad",
+ "scale" : "2x",
+ "size" : "76x76"
+ },
+ {
+ "filename" : "167.png",
+ "idiom" : "ipad",
+ "scale" : "2x",
+ "size" : "83.5x83.5"
+ },
+ {
+ "filename" : "1024.png",
"idiom" : "ios-marketing",
- "filename" : "Icon-App-1024x1024@1x.png",
- "scale" : "1x"
+ "scale" : "1x",
+ "size" : "1024x1024"
}
],
"info" : {
- "version" : 1,
- "author" : "xcode"
+ "author" : "xcode",
+ "version" : 1
}
}
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png
deleted file mode 100644
index da9a6094..00000000
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png and /dev/null differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png
deleted file mode 100644
index 2b3b1a94..00000000
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png and /dev/null differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png
deleted file mode 100644
index 0c5443fe..00000000
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png and /dev/null differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png
deleted file mode 100644
index 4f2bc865..00000000
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png and /dev/null differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png
deleted file mode 100644
index b7539761..00000000
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png and /dev/null differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png
deleted file mode 100644
index 956eb4bd..00000000
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png and /dev/null differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png
deleted file mode 100644
index 1c4c2dae..00000000
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png and /dev/null differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png
deleted file mode 100644
index 0c5443fe..00000000
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png and /dev/null differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png
deleted file mode 100644
index 81ed89bc..00000000
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png and /dev/null differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png
deleted file mode 100644
index af6c4429..00000000
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png and /dev/null differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png
deleted file mode 100644
index af6c4429..00000000
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png and /dev/null differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png
deleted file mode 100644
index 91145264..00000000
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png and /dev/null differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png
deleted file mode 100644
index a538920e..00000000
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png and /dev/null differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
deleted file mode 100644
index 9579c5e3..00000000
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png and /dev/null differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
deleted file mode 100644
index 211d8e57..00000000
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png and /dev/null differ
diff --git a/ios/Runner/Assets.xcassets/Contents.json b/ios/Runner/Assets.xcassets/Contents.json
new file mode 100644
index 00000000..73c00596
--- /dev/null
+++ b/ios/Runner/Assets.xcassets/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist
index 9aa740a2..7049504d 100644
--- a/ios/Runner/Info.plist
+++ b/ios/Runner/Info.plist
@@ -2,6 +2,8 @@
+ NSCameraUsageDescription
+ Workout photos
CFBundleDevelopmentRegion
$(DEVELOPMENT_LANGUAGE)
CFBundleExecutable
diff --git a/ios/Runner/Runner.entitlements b/ios/Runner/Runner.entitlements
new file mode 100644
index 00000000..903def2a
--- /dev/null
+++ b/ios/Runner/Runner.entitlements
@@ -0,0 +1,8 @@
+
+
+
+
+ aps-environment
+ development
+
+
diff --git a/ios/build/.last_build_id b/ios/build/.last_build_id
new file mode 100644
index 00000000..7769d20e
--- /dev/null
+++ b/ios/build/.last_build_id
@@ -0,0 +1 @@
+ce49e7d90cd902197f9a9cbc84219d23
\ No newline at end of file
diff --git a/ios/fastlane/Appfile b/ios/fastlane/Appfile
new file mode 100644
index 00000000..2ba8d12b
--- /dev/null
+++ b/ios/fastlane/Appfile
@@ -0,0 +1,5 @@
+app_identifier("de.wger.flutter.community") # The bundle identifier of your app
+apple_id(ENV["APPLE_ID"]) # Your Apple Developer Portal username
+
+itc_team_id(ENV["ITC_TEAM_ID"]) # App Store Connect Team ID
+team_id(ENV["TEAM_ID"]) # Developer Portal Team ID
diff --git a/ios/fastlane/Deliverfile b/ios/fastlane/Deliverfile
new file mode 100644
index 00000000..74739f74
--- /dev/null
+++ b/ios/fastlane/Deliverfile
@@ -0,0 +1,3 @@
+# The Deliverfile allows you to store various App Store Connect metadata
+# For more information, check out the docs
+# https://docs.fastlane.tools/actions/deliver/
diff --git a/ios/fastlane/Fastfile b/ios/fastlane/Fastfile
new file mode 100644
index 00000000..2dc804f8
--- /dev/null
+++ b/ios/fastlane/Fastfile
@@ -0,0 +1,61 @@
+default_platform(:ios)
+
+platform :ios do
+
+ desc "Set AppStore Connect API KEY using the provided environment variables."
+ lane :apikey do
+ app_store_connect_api_key(
+ key_id: ENV["APP_STORE_API_KEY_ID"],
+ issuer_id: ENV["APP_STORE_API_ISSUER_ID"],
+ key_filepath: ENV["APP_STORE_API_KEY_PATH"],
+ duration: 1200, # optional (maximum 1200)
+ in_house: false # optional but may be required if using match/sigh
+ )
+ end
+
+ ###############################################################################
+
+ desc "Push a new release build to AppStore Connect for manual submission to TestFlight beta testing or App Store Release."
+ lane :release do
+ apikey
+ build_app(workspace: "Runner.xcworkspace", scheme: "Runner")
+ upload_to_app_store(
+ precheck_include_in_app_purchases: false
+ )
+ end
+
+ ###############################################################################
+
+ desc "Test if all environment variables are present and check if API key is working properly."
+ lane :test_env do
+ UI.message "🔍 Testing environment variables..."
+
+ UI.message "APP_STORE_API_KEY_ID: #{ENV['APP_STORE_API_KEY_ID']}"
+ UI.message "APP_STORE_API_ISSUER_ID: #{ENV['APP_STORE_API_ISSUER_ID']}"
+ UI.message "APP_STORE_API_KEY_PATH: #{ENV['APP_STORE_API_KEY_PATH']}"
+ UI.message "APPLE_ID: #{ENV['APPLE_ID']}"
+ UI.message "ITC_TEAM_ID: #{ENV['ITC_TEAM_ID']}"
+ UI.message "TEAM_ID: #{ENV['TEAM_ID']}"
+
+ UI.success "✅ Environment variables loaded."
+
+ UI.message "🔐 Testing App Store Connect API key authentication..."
+
+ app_store_connect_api_key(
+ key_id: ENV["APP_STORE_API_KEY_ID"],
+ issuer_id: ENV["APP_STORE_API_ISSUER_ID"],
+ key_filepath: ENV["APP_STORE_API_KEY_PATH"],
+ duration: 1200,
+ in_house: false
+ )
+
+ # Test: Fetch list of apps to verify authentication
+ apps = Spaceship::ConnectAPI::App.all
+ UI.success "✅ API Key is valid! Found #{apps.count} apps in your App Store Connect account."
+
+ rescue => ex
+ UI.error "❌ API Key authentication failed: #{ex.message}"
+ UI.user_error!("Please check your API key environment variables and credentials.")
+ end
+
+end
diff --git a/ios/fastlane/README.md b/ios/fastlane/README.md
new file mode 100644
index 00000000..08fd87f3
--- /dev/null
+++ b/ios/fastlane/README.md
@@ -0,0 +1,48 @@
+fastlane documentation
+----
+
+# Installation
+
+Make sure you have the latest version of the Xcode command line tools installed:
+
+```sh
+xcode-select --install
+```
+
+For _fastlane_ installation instructions, see [Installing _fastlane_](https://docs.fastlane.tools/#installing-fastlane)
+
+# Available Actions
+
+## iOS
+
+### ios apikey
+
+```sh
+[bundle exec] fastlane ios apikey
+```
+
+Set AppStore Connect API KEY using the provided environment variables.
+
+### ios release
+
+```sh
+[bundle exec] fastlane ios release
+```
+
+Push a new release build to AppStore Connect for manual submission to TestFlight beta testing or App Store Release.
+
+### ios test_env
+
+```sh
+[bundle exec] fastlane ios test_env
+```
+
+Test if all environment variables are present and check if API key is working properly.
+
+----
+
+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).
+
+The documentation of _fastlane_ can be found on [docs.fastlane.tools](https://docs.fastlane.tools).
diff --git a/ios/fastlane/metadata/copyright.txt b/ios/fastlane/metadata/copyright.txt
new file mode 100644
index 00000000..3d870c90
--- /dev/null
+++ b/ios/fastlane/metadata/copyright.txt
@@ -0,0 +1 @@
+wger Project
diff --git a/ios/fastlane/metadata/de-DE/apple_tv_privacy_policy.txt b/ios/fastlane/metadata/de-DE/apple_tv_privacy_policy.txt
new file mode 100644
index 00000000..8b137891
--- /dev/null
+++ b/ios/fastlane/metadata/de-DE/apple_tv_privacy_policy.txt
@@ -0,0 +1 @@
+
diff --git a/ios/fastlane/metadata/de-DE/description.txt b/ios/fastlane/metadata/de-DE/description.txt
new file mode 100644
index 00000000..677e4da1
--- /dev/null
+++ b/ios/fastlane/metadata/de-DE/description.txt
@@ -0,0 +1,39 @@
+Von Fitnessliebhabern für Fitnessliebhaber, organisiere deine Gesundheit mit wger, deinem Trainingsverwaltungsprogramm!
+
+Hast du schon deine Nr. 1 Fitness-Anwendung gefunden und liebst es, deine eigene Trainingspläne zu erstellen? Egal was für ein sportliches Biest du bist sind – wir haben alle etwas gemeinsam: wir lieben es, den Überblick über unsere Gesundheitsdaten zu behalten.
+
+Wir verurteilen dich also nicht dafür, dass du deine Fitness-Reise immer noch mit deinem kleinen Tagebuch verwaltest, aber willkommen im 21. Jahrhundert!
+
+Wir haben eine 100 % kostenlose digitale Gesundheits- und Fitnesstracker-Anwendung für dich entwickelt, die auf die wichtigsten Funktionen reduziert ist, um dein Leben einfacher zu machen. Lege jetzt lost, trainiere weiter und feiere deine Fortschritte!
+
+wger ist ein quelloffenes Projekt und dreht sich um:
+* Deinen Körper
+* Deine Workouts
+* Deine Fortschritte
+* Deine Daten
+
+Dein Körper:
+Du musst nicht mehr nach den Zutaten deiner Lieblingsspeise suchen – stelle deine täglichen Mahlzeiten aus mehr als 78.000 Produkten und deren Nährwerte zusammen. Füge diese deinem Ernährungsplan hinzu und behalte den Überblick über deine Ernährung im Kalender.
+
+Deine Workouts:
+Du weißt, was das Beste für deinen Körper ist. Erstelle deine eigenen Workouts aus einer wachsenden Vielfalt von 200 verschiedenen Übungen. Verwende den Gym-Modus, um dich durch das Training führen zu lassen, während du deine Gewichte und Wiederholungen mit einem Tippen protokollieren kannst.
+
+Dein Fortschritt:
+Verlieren nie deine Ziele aus den Augen, tracke dein Gewicht und behalte deine Statistiken.
+
+Deine Daten:
+wger ist dein persönliches Fitness-Tagebuch - aber deine Daten gehören dir. Nutze die REST-API, um darauf zuzugreifen und erstaunliche Dinge damit zu tun.
+
+Bitte beachte: Diese kostenlose Anwendung basiert nicht auf zusätzlichen Finanzierungen und wir bitten dich nicht um Geldspenden. Vielmehr handelt es sich um ein Community-Projekt, das ständig wächst. Sei also jederzeit auf neue Funktionen vorbereitet!
+
+Quelloffen – was bedeutet das?
+
+Quelloffen bedeutet, dass der gesamte Quellcode für diese Anwendung und den damit verbundenen Server, frei und für jeden verfügbar ist:
+* Willst du wger auf deinem eigenen Server für dich oder dein lokales Fitnessstudio laufen lassen? Nur zu!
+* Vermisst du ein Feature und willst es implementieren? Fang jetzt an!
+* Willst du überprüfen, dass etwas an Dritte gesendet wird? Das kannst du!
+
+Trete unserer Gemeinschaft bei und werde ein Teil von Sportbegeisterten und IT-Freaks aus aller Welt. Wir arbeiten ständig daran, die Anwendung an unsere Bedürfnisse anzupassen und zu optimieren. Wir freuen uns über deinen Input, du kannst jederzeit einsteigen und deine Wünsche und Ideen einbringen!
+
+-> finde den Quellcode auf https://github.com/wger-project
+-> stelle deine Fragen oder sag einfach Hallo auf unserem Discord-Server https://discord.gg/rPWFv6W
diff --git a/ios/fastlane/metadata/de-DE/keywords.txt b/ios/fastlane/metadata/de-DE/keywords.txt
new file mode 100644
index 00000000..bd88e814
--- /dev/null
+++ b/ios/fastlane/metadata/de-DE/keywords.txt
@@ -0,0 +1 @@
+wger Workout Ernährung Fitness
diff --git a/ios/fastlane/metadata/de-DE/marketing_url.txt b/ios/fastlane/metadata/de-DE/marketing_url.txt
new file mode 100644
index 00000000..697495c2
--- /dev/null
+++ b/ios/fastlane/metadata/de-DE/marketing_url.txt
@@ -0,0 +1 @@
+https://wger.de/de/software/features
diff --git a/ios/fastlane/metadata/de-DE/name.txt b/ios/fastlane/metadata/de-DE/name.txt
new file mode 100644
index 00000000..d35e4087
--- /dev/null
+++ b/ios/fastlane/metadata/de-DE/name.txt
@@ -0,0 +1 @@
+wger Workout Manager
diff --git a/ios/fastlane/metadata/de-DE/privacy_url.txt b/ios/fastlane/metadata/de-DE/privacy_url.txt
new file mode 100644
index 00000000..fd0b0bb0
--- /dev/null
+++ b/ios/fastlane/metadata/de-DE/privacy_url.txt
@@ -0,0 +1 @@
+https://wger.de/de/software/terms-of-service
diff --git a/ios/fastlane/metadata/de-DE/promotional_text.txt b/ios/fastlane/metadata/de-DE/promotional_text.txt
new file mode 100644
index 00000000..8b137891
--- /dev/null
+++ b/ios/fastlane/metadata/de-DE/promotional_text.txt
@@ -0,0 +1 @@
+
diff --git a/ios/fastlane/metadata/de-DE/release_notes.txt b/ios/fastlane/metadata/de-DE/release_notes.txt
new file mode 100644
index 00000000..713d4615
--- /dev/null
+++ b/ios/fastlane/metadata/de-DE/release_notes.txt
@@ -0,0 +1 @@
+UI Verbesserungen, Übersetzungen aktualisiert, Fehlerbehebungen
diff --git a/ios/fastlane/metadata/de-DE/subtitle.txt b/ios/fastlane/metadata/de-DE/subtitle.txt
new file mode 100644
index 00000000..d5f6172e
--- /dev/null
+++ b/ios/fastlane/metadata/de-DE/subtitle.txt
@@ -0,0 +1 @@
+OpenSource Fitness-Tracker
diff --git a/ios/fastlane/metadata/de-DE/support_url.txt b/ios/fastlane/metadata/de-DE/support_url.txt
new file mode 100644
index 00000000..c7a2218b
--- /dev/null
+++ b/ios/fastlane/metadata/de-DE/support_url.txt
@@ -0,0 +1 @@
+https://wger.de/en/software/about-us
diff --git a/ios/fastlane/metadata/primary_category.txt b/ios/fastlane/metadata/primary_category.txt
new file mode 100644
index 00000000..16340f75
--- /dev/null
+++ b/ios/fastlane/metadata/primary_category.txt
@@ -0,0 +1 @@
+HEALTH_AND_FITNESS
diff --git a/ios/fastlane/metadata/primary_first_sub_category.txt b/ios/fastlane/metadata/primary_first_sub_category.txt
new file mode 100644
index 00000000..8b137891
--- /dev/null
+++ b/ios/fastlane/metadata/primary_first_sub_category.txt
@@ -0,0 +1 @@
+
diff --git a/ios/fastlane/metadata/primary_second_sub_category.txt b/ios/fastlane/metadata/primary_second_sub_category.txt
new file mode 100644
index 00000000..8b137891
--- /dev/null
+++ b/ios/fastlane/metadata/primary_second_sub_category.txt
@@ -0,0 +1 @@
+
diff --git a/ios/fastlane/metadata/review_information/demo_password.txt b/ios/fastlane/metadata/review_information/demo_password.txt
new file mode 100644
index 00000000..7e0defbb
--- /dev/null
+++ b/ios/fastlane/metadata/review_information/demo_password.txt
@@ -0,0 +1 @@
+flutteruser
diff --git a/ios/fastlane/metadata/review_information/demo_user.txt b/ios/fastlane/metadata/review_information/demo_user.txt
new file mode 100644
index 00000000..4eb8387f
--- /dev/null
+++ b/ios/fastlane/metadata/review_information/demo_user.txt
@@ -0,0 +1 @@
+user
diff --git a/ios/fastlane/metadata/review_information/email_address.txt b/ios/fastlane/metadata/review_information/email_address.txt
new file mode 100644
index 00000000..b115c6d9
--- /dev/null
+++ b/ios/fastlane/metadata/review_information/email_address.txt
@@ -0,0 +1 @@
+software@thweb.net
diff --git a/ios/fastlane/metadata/review_information/first_name.txt b/ios/fastlane/metadata/review_information/first_name.txt
new file mode 100644
index 00000000..5089231f
--- /dev/null
+++ b/ios/fastlane/metadata/review_information/first_name.txt
@@ -0,0 +1 @@
+Peter
diff --git a/ios/fastlane/metadata/review_information/last_name.txt b/ios/fastlane/metadata/review_information/last_name.txt
new file mode 100644
index 00000000..4c74f8e7
--- /dev/null
+++ b/ios/fastlane/metadata/review_information/last_name.txt
@@ -0,0 +1 @@
+Thaler
diff --git a/ios/fastlane/metadata/review_information/notes.txt b/ios/fastlane/metadata/review_information/notes.txt
new file mode 100644
index 00000000..37ceff1c
--- /dev/null
+++ b/ios/fastlane/metadata/review_information/notes.txt
@@ -0,0 +1,5 @@
+Testserver: https://wger-master.rge.uber.space
+
+ui improvements, bugfixes
+
+
diff --git a/ios/fastlane/metadata/review_information/phone_number.txt b/ios/fastlane/metadata/review_information/phone_number.txt
new file mode 100644
index 00000000..3203533e
--- /dev/null
+++ b/ios/fastlane/metadata/review_information/phone_number.txt
@@ -0,0 +1 @@
++436805529332
diff --git a/ios/fastlane/metadata/secondary_category.txt b/ios/fastlane/metadata/secondary_category.txt
new file mode 100644
index 00000000..90b0c7ba
--- /dev/null
+++ b/ios/fastlane/metadata/secondary_category.txt
@@ -0,0 +1 @@
+FOOD_AND_DRINK
diff --git a/ios/fastlane/metadata/secondary_first_sub_category.txt b/ios/fastlane/metadata/secondary_first_sub_category.txt
new file mode 100644
index 00000000..8b137891
--- /dev/null
+++ b/ios/fastlane/metadata/secondary_first_sub_category.txt
@@ -0,0 +1 @@
+
diff --git a/ios/fastlane/metadata/secondary_second_sub_category.txt b/ios/fastlane/metadata/secondary_second_sub_category.txt
new file mode 100644
index 00000000..8b137891
--- /dev/null
+++ b/ios/fastlane/metadata/secondary_second_sub_category.txt
@@ -0,0 +1 @@
+
diff --git a/ios/fastlane/screenshots/README.txt b/ios/fastlane/screenshots/README.txt
new file mode 100644
index 00000000..948c580c
--- /dev/null
+++ b/ios/fastlane/screenshots/README.txt
@@ -0,0 +1,30 @@
+## Screenshots Naming Rules
+
+Put all screenshots you want to use inside the folder of its language (e.g. `en-US`).
+The device type will automatically be recognized using the image resolution.
+
+The screenshots can be named whatever you want, but keep in mind they are sorted
+alphabetically, in a human-friendly way. See https://github.com/fastlane/fastlane/pull/18200 for more details.
+
+### Exceptions
+
+#### iPad Pro (3rd Gen) 12.9"
+
+Since iPad Pro (3rd Gen) 12.9" and iPad Pro (2nd Gen) 12.9" have the same image
+resolution, screenshots of the iPad Pro (3rd gen) 12.9" must contain either the
+string `iPad Pro (12.9-inch) (3rd generation)`, `IPAD_PRO_3GEN_129`, or `ipadPro129`
+(App Store Connect's internal naming of the display family for the 3rd generation iPad Pro)
+in its filename to be assigned the correct display family and to be uploaded to
+the correct screenshot slot in your app's metadata.
+
+### Other Platforms
+
+#### Apple TV
+
+Apple TV screenshots should be stored in a subdirectory named `appleTV` with language
+folders inside of it.
+
+#### iMessage
+
+iMessage screenshots, like the Apple TV ones, should also be stored in a subdirectory
+named `iMessage`, with language folders inside of it.
diff --git a/ios/fastlane/screenshots/de-DE/0_APP_IPHONE_55_0.png b/ios/fastlane/screenshots/de-DE/0_APP_IPHONE_55_0.png
new file mode 100644
index 00000000..a5d87929
Binary files /dev/null and b/ios/fastlane/screenshots/de-DE/0_APP_IPHONE_55_0.png differ
diff --git a/ios/fastlane/screenshots/de-DE/0_APP_IPHONE_67_0.jpg b/ios/fastlane/screenshots/de-DE/0_APP_IPHONE_67_0.jpg
new file mode 100644
index 00000000..f9a73897
Binary files /dev/null and b/ios/fastlane/screenshots/de-DE/0_APP_IPHONE_67_0.jpg differ
diff --git a/ios/fastlane/screenshots/de-DE/1_APP_IPHONE_55_1.png b/ios/fastlane/screenshots/de-DE/1_APP_IPHONE_55_1.png
new file mode 100644
index 00000000..8666a397
Binary files /dev/null and b/ios/fastlane/screenshots/de-DE/1_APP_IPHONE_55_1.png differ
diff --git a/ios/fastlane/screenshots/de-DE/1_APP_IPHONE_67_1.jpg b/ios/fastlane/screenshots/de-DE/1_APP_IPHONE_67_1.jpg
new file mode 100644
index 00000000..de93bf0d
Binary files /dev/null and b/ios/fastlane/screenshots/de-DE/1_APP_IPHONE_67_1.jpg differ
diff --git a/ios/fastlane/screenshots/de-DE/2_APP_IPHONE_55_2.png b/ios/fastlane/screenshots/de-DE/2_APP_IPHONE_55_2.png
new file mode 100644
index 00000000..8fa713b1
Binary files /dev/null and b/ios/fastlane/screenshots/de-DE/2_APP_IPHONE_55_2.png differ
diff --git a/ios/fastlane/screenshots/de-DE/2_APP_IPHONE_67_2.jpg b/ios/fastlane/screenshots/de-DE/2_APP_IPHONE_67_2.jpg
new file mode 100644
index 00000000..df36b300
Binary files /dev/null and b/ios/fastlane/screenshots/de-DE/2_APP_IPHONE_67_2.jpg differ
diff --git a/ios/fastlane/screenshots/de-DE/3_APP_IPHONE_55_3.png b/ios/fastlane/screenshots/de-DE/3_APP_IPHONE_55_3.png
new file mode 100644
index 00000000..f7516b8d
Binary files /dev/null and b/ios/fastlane/screenshots/de-DE/3_APP_IPHONE_55_3.png differ
diff --git a/ios/fastlane/screenshots/de-DE/3_APP_IPHONE_67_3.jpg b/ios/fastlane/screenshots/de-DE/3_APP_IPHONE_67_3.jpg
new file mode 100644
index 00000000..3e050399
Binary files /dev/null and b/ios/fastlane/screenshots/de-DE/3_APP_IPHONE_67_3.jpg differ
diff --git a/ios/fastlane/screenshots/de-DE/4_APP_IPHONE_55_4.png b/ios/fastlane/screenshots/de-DE/4_APP_IPHONE_55_4.png
new file mode 100644
index 00000000..78c93ebe
Binary files /dev/null and b/ios/fastlane/screenshots/de-DE/4_APP_IPHONE_55_4.png differ
diff --git a/ios/fastlane/screenshots/de-DE/4_APP_IPHONE_67_4.jpg b/ios/fastlane/screenshots/de-DE/4_APP_IPHONE_67_4.jpg
new file mode 100644
index 00000000..f0afd774
Binary files /dev/null and b/ios/fastlane/screenshots/de-DE/4_APP_IPHONE_67_4.jpg differ
diff --git a/lib/database/exercises/exercise_database.dart b/lib/database/exercises/exercise_database.dart
index 5a58528c..35a3eaf2 100644
--- a/lib/database/exercises/exercise_database.dart
+++ b/lib/database/exercises/exercise_database.dart
@@ -78,7 +78,7 @@ class ExerciseDatabase extends _$ExerciseDatabase {
/// Note that this needs to be bumped if the JSON response from the server changes
@override
- int get schemaVersion => 2;
+ int get schemaVersion => 3;
/// There is not really a migration strategy. If we bump the version
/// number, delete everything and recreate the new tables. The provider
diff --git a/lib/database/exercises/type_converters.dart b/lib/database/exercises/type_converters.dart
index b494aa2a..77d54559 100644
--- a/lib/database/exercises/type_converters.dart
+++ b/lib/database/exercises/type_converters.dart
@@ -1,67 +1,11 @@
import 'dart:convert';
import 'package:drift/drift.dart';
-import 'package:wger/models/exercises/alias.dart';
import 'package:wger/models/exercises/category.dart';
-import 'package:wger/models/exercises/comment.dart';
import 'package:wger/models/exercises/equipment.dart';
-import 'package:wger/models/exercises/exercise.dart';
-import 'package:wger/models/exercises/image.dart';
import 'package:wger/models/exercises/language.dart';
import 'package:wger/models/exercises/muscle.dart';
-import 'package:wger/models/exercises/translation.dart';
import 'package:wger/models/exercises/variation.dart';
-import 'package:wger/models/exercises/video.dart';
-
-class ExerciseBaseConverter extends TypeConverter {
- const ExerciseBaseConverter();
-
- @override
- Exercise fromSql(String fromDb) {
- final Map baseData = json.decode(fromDb);
-
- final category = ExerciseCategory.fromJson(baseData['categories']);
- final musclesPrimary = baseData['muscless'].map((e) => Muscle.fromJson(e)).toList();
- final musclesSecondary = baseData['musclesSecondary'].map((e) => Muscle.fromJson(e)).toList();
- final equipment = baseData['equipments'].map((e) => Equipment.fromJson(e)).toList();
- final images = baseData['images'].map((e) => ExerciseImage.fromJson(e)).toList();
- final videos = baseData['videos'].map((e) => Video.fromJson(e)).toList();
-
- final List translations = [];
- for (final exerciseData in baseData['translations']) {
- final translation = Translation(
- id: exerciseData['id'],
- name: exerciseData['name'],
- description: exerciseData['description'],
- exerciseId: baseData['id'],
- );
- translation.aliases = exerciseData['aliases'].map((e) => Alias.fromJson(e)).toList();
- translation.notes = exerciseData['notes'].map((e) => Comment.fromJson(e)).toList();
- translation.language = Language.fromJson(exerciseData['languageObj']);
- translations.add(translation);
- }
-
- final exerciseBase = Exercise(
- id: baseData['id'],
- uuid: baseData['uuid'],
- created: null,
- //creationDate: toDate(baseData['creation_date']),
- musclesSecondary: musclesSecondary.cast(),
- muscles: musclesPrimary.cast(),
- equipment: equipment.cast(),
- category: category,
- images: images.cast(),
- translations: translations,
- videos: videos.cast