diff --git a/.github/actions/flutter-setup/action.yaml b/.github/actions/flutter-setup/action.yaml new file mode 100644 index 0000000..6534571 --- /dev/null +++ b/.github/actions/flutter-setup/action.yaml @@ -0,0 +1,46 @@ +# .github/actions/flutter-setup/action.yml +name: "Flutter Setup Composite Action" +description: "Checks out code, sets up Java/Flutter, caches, and runs pub get" + +# Define inputs for customization (optional, but good practice) +inputs: + flutter-channel: + description: "Flutter channel to use (stable, beta, dev, master)" + required: false + default: "stable" + java-version: + description: "Java version to set up" + required: false + default: "17" + +runs: + using: "composite" # Specify this is a composite action + steps: + - name: Set up Java + uses: actions/setup-java@v4 + with: + distribution: "temurin" + java-version: ${{ inputs.java-version }} + + - name: Set up Flutter SDK + uses: subosito/flutter-action@v2 + with: + channel: ${{ inputs.flutter-channel }} + flutter-version-file: pubspec.yaml + cache: true # Cache Flutter SDK itself + + - name: Cache Flutter dependencies + id: cache-pub + uses: actions/cache@v4 + with: + path: ${{ env.FLUTTER_HOME }}/.pub-cache + key: ${{ runner.os }}-flutter-pub-${{ hashFiles('**/pubspec.lock') }} + restore-keys: | + ${{ runner.os }}-flutter-pub- + + - name: Get Flutter dependencies + run: flutter pub get + # Use shell: bash for potential cross-platform compatibility in complex commands + shell: bash + + # Add other common setup steps if needed diff --git a/.github/workflows/flutter-ci.yaml b/.github/workflows/flutter-ci.yaml new file mode 100644 index 0000000..eb9d9eb --- /dev/null +++ b/.github/workflows/flutter-ci.yaml @@ -0,0 +1,182 @@ +name: Flutter CI & Release + +on: + push: + branches: [main] + tags: ["v*.*.*"] + pull_request: + branches: [main] + workflow_dispatch: + +jobs: + test: + name: Test + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Setup Flutter Environment + uses: ./.github/actions/flutter-setup # Path to the composite action directory + # Pass inputs if needed (optional, using defaults here) + # with: + # flutter-channel: 'stable' + # java-version: '17' + # Debug: Echo current directory contents + - name: List root directory contents + run: | + pwd + ls -la + + # Debug: Recursive directory structure + - name: Show full directory structure + run: | + echo "Full directory structure:" + tree -L 3 + + # Debug: Submodule status and details + - name: Check submodule status + run: | + echo "Submodule status:" + git submodule status + + echo "\nSubmodule details:" + git submodule foreach 'echo $path: && pwd && ls -la' + + # - name: Run static analysis + # run: flutter analyze + + - name: Run tests + run: flutter test + + build_android: + name: Build Android APKs + needs: test + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + submodules: recursive + - name: Setup Flutter Environment + uses: ./.github/actions/flutter-setup # Path to the composite action directory + with: + flutter-channel: stable + java-version: 17 + + - name: Decode android/upload.jks + run: echo "${{ secrets.UPLOAD_KEYSTORE_JKS }}" | base64 --decode > android/upload.jks + + - name: Decode android/key.properties + run: echo "${{ secrets.KEY_PROPERTIES }}" | base64 --decode > android/key.properties + + - name: Build APKs + run: flutter build apk --release --split-per-abi + + - name: Build Universal APK + run: flutter build apk --release + + - name: Rename Universal APK + run: mv build/app/outputs/flutter-apk/{app-release,app-universal-release}.apk + + - name: Build App Bundle + run: flutter build appbundle --release + + - name: Upload Android APK Artifact + uses: actions/upload-artifact@v4 + with: + name: android-release-artifacts + path: | + build/app/outputs/flutter-apk/*-release*.apk + build/app/outputs/bundle/release/*.aab + + build_linux: + needs: test + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + submodules: recursive + - name: Setup Flutter Environment + uses: ./.github/actions/flutter-setup # Path to the composite action directory + + - name: Install Linux dependencies + run: | + sudo apt-get update -y + sudo apt-get install -y clang cmake ninja-build pkg-config libgtk-3-dev liblzma-dev + shell: bash + - name: setup fastforge + run: | + dart pub global activate fastforge + - name: Build Linux AppImage + run: fastforge package --platform linux --targets deb + + - name: Upload deb Artifacts + uses: actions/upload-artifact@v4 + with: + name: linux-release-artifacts + path: | + dist/*/*.deb + + # Job 4: Create GitHub Release (NEW - runs only on tag pushes) + create_release: + name: Create GitHub Release + needs: [build_android, build_linux] # Depends on successful builds + runs-on: ubuntu-latest + permissions: + contents: write # Need write access to create release + # <<< CONDITION: Only run this job if the trigger was a tag starting with 'v' + if: startsWith(github.ref, 'refs/tags/v') + + steps: + # No checkout needed if only downloading artifacts and using context variables + # - name: Checkout repository + # uses: actions/checkout@v4 + + # Download artifacts created earlier IN THIS SAME WORKFLOW RUN + - name: Download Android Artifacts + uses: actions/download-artifact@v4 + with: + name: android-release-artifacts + path: ./release-artifacts/android + + - name: Download Linux Artifacts + uses: actions/download-artifact@v4 + with: + name: linux-release-artifacts + path: ./release-artifacts/linux + + - name: List downloaded files (for debugging) + run: ls -R ./release-artifacts + shell: bash + + # Extract version info from the tag + - name: Extract Version from Tag + id: version + run: | + TAG_NAME=${GITHUB_REF#refs/tags/} + VERSION=${TAG_NAME#v} + echo "tag=${TAG_NAME}" >> $GITHUB_OUTPUT + echo "version=${VERSION}" >> $GITHUB_OUTPUT + shell: bash + + # Generate release notes (optional, consider its configuration for tags) + - name: Generate Release Notes + id: generate_release_notes + uses: release-drafter/release-drafter@v6 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + # Create the GitHub Release using downloaded artifacts + - name: Create GitHub Release + uses: ncipollo/release-action@v1 + with: + artifacts: "./release-artifacts/**/*" # Use downloaded artifacts + name: Release v${{ steps.version.outputs.version }} + tag: ${{ github.ref }} + body: ${{ steps.generate_release_notes.outputs.body }} + # token: ${{ secrets.GITHUB_TOKEN }} # Usually inferred diff --git a/.github/workflows/flutter_release.yaml b/.github/workflows/flutter_release.yaml deleted file mode 100644 index ae1ba76..0000000 --- a/.github/workflows/flutter_release.yaml +++ /dev/null @@ -1,81 +0,0 @@ -name: Flutter Release Workflow - -on: - push: - tags: - - "v**" - # manually trigger a release if needed - workflow_dispatch: - -jobs: - build: - permissions: - # write permission is required to create a github release - contents: write - runs-on: ubuntu-latest - - steps: - - name: Checkout repository - uses: actions/checkout@v4 - with: - submodules: recursive - - - name: Set Up Java - uses: actions/setup-java@v3.12.0 - with: - distribution: "oracle" - java-version: "17" - - - name: Set up Flutter - uses: subosito/flutter-action@v2 - with: - channel: "stable" - flutter-version-file: pubspec.yaml - - - name: Install dependencies - run: flutter pub get - - # - name: Run tests - # run: flutter test - - - name: Decode android/upload.jks - run: echo "${{ secrets.UPLOAD_KEYSTORE_JKS }}" | base64 --decode > android/upload.jks - - - name: Decode android/key.properties - run: echo "${{ secrets.KEY_PROPERTIES }}" | base64 --decode > android/key.properties - - - name: Build APKs - run: flutter build apk --release --split-per-abi - - - name: Build Universal APK - run: flutter build apk --release - - - name: Rename Universal APK - run: mv build/app/outputs/flutter-apk/{app-release,app-universal-release}.apk - - - name: Build App Bundle - run: flutter build appbundle --release - - - name: version - id: version - run: | - tag=${GITHUB_REF/refs\/tags\//} - version=${tag#v} - major=${version%%.*} - echo "tag=${tag}" >> $GITHUB_OUTPUT - echo "version=${version}" >> $GITHUB_OUTPUT - echo "major=${major}" >> $GITHUB_OUTPUT - - - name: Generate Release Notes - id: generate_release_notes - uses: release-drafter/release-drafter@v6 - env: - GITHUB_TOKEN: ${{ github.token }} - - - name: Create GitHub Release - uses: ncipollo/release-action@v1 - with: - artifacts: "build/app/outputs/flutter-apk/*-release*.apk,build/app/outputs/bundle/release/*.aab" - name: v${{ steps.version.outputs.version }} - tag: ${{ github.ref }} - body: ${{ steps.generate_release_notes.outputs.body }} diff --git a/.github/workflows/flutter_test.yaml b/.github/workflows/flutter_test.yaml deleted file mode 100644 index 3be6733..0000000 --- a/.github/workflows/flutter_test.yaml +++ /dev/null @@ -1,74 +0,0 @@ -name: Flutter Test - -on: - push: - branches: - - main - pull_request: - - # Allows you to run this workflow manually from the Actions tab - workflow_dispatch: - -jobs: - test: - runs-on: ubuntu-latest - - steps: - - name: Checkout repository - uses: actions/checkout@v4 - with: - # This ensures submodules are cloned - submodules: recursive - - # Debug: Echo current directory contents - - name: List root directory contents - run: | - pwd - ls -la - - # Debug: Recursive directory structure - - name: Show full directory structure - run: | - echo "Full directory structure:" - tree -L 3 - - # Debug: Submodule status and details - - name: Check submodule status - run: | - echo "Submodule status:" - git submodule status - - echo "\nSubmodule details:" - git submodule foreach 'echo $path: && pwd && ls -la' - - - name: Decode android/upload.jks - run: echo "${{ secrets.UPLOAD_KEYSTORE_JKS }}" | base64 --decode > android/upload.jks - - - name: Decode android/key.properties - run: echo "${{ secrets.KEY_PROPERTIES }}" | base64 --decode > android/key.properties - - - name: Set up Flutter - uses: subosito/flutter-action@v2 - with: - channel: "stable" - - - name: Install dependencies - run: flutter pub get - - - name: Run tests - run: flutter test - - - name: Set Up Java - uses: actions/setup-java@v3.12.0 - with: - distribution: "oracle" - java-version: "17" - - - name: Build APK - run: flutter build apk --release - - - name: Upload APKs - uses: actions/upload-artifact@v4 - with: - name: app-release - path: build/app/outputs/flutter-apk/*.apk diff --git a/.github/workflows/prepare-release.yaml b/.github/workflows/prepare-release.yaml new file mode 100644 index 0000000..f1cb4a6 --- /dev/null +++ b/.github/workflows/prepare-release.yaml @@ -0,0 +1,130 @@ +# .github/workflows/prepare-release.yml +name: Prepare Release (using Cider) + +on: + workflow_dispatch: + inputs: + bump_type: + description: "Type of version bump (patch, minor, major)" + required: true + type: choice + options: + - patch + - minor + - major + default: "patch" + +permissions: + contents: write # NEEDED to commit, push, and tag + +jobs: + bump_version_and_tag: + name: Bump Version and Tag using Cider + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + # Use a PAT if pushing to protected branches is restricted for GITHUB_TOKEN + # token: ${{ secrets.PAT_TOKEN }} # Create PAT with repo scope + token: ${{ secrets.GITHUB_TOKEN }} + + # Setup Flutter/Dart environment needed to run dart pub global activate + - name: Setup Flutter + uses: subosito/flutter-action@v2 + with: + channel: "stable" # Or match your project's channel + flutter-version-file: pubspec.yaml + + - name: Install Cider + run: dart pub global activate cider + shell: bash + + # Add pub global bin to PATH for this job + - name: Add pub global bin to PATH + run: echo "$HOME/.pub-cache/bin" >> $GITHUB_PATH + shell: bash + + - name: Configure Git + run: | + git config user.name "github-actions[bot]" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + shell: bash + + - name: Bump version using Cider + id: bump + run: | + echo "Current version:" + grep '^version:' pubspec.yaml + + # Run cider to bump version and build number + # Cider modifies pubspec.yaml in place + cider bump ${{ github.event.inputs.bump_type }} --bump-build + + echo "New version (after cider bump):" + # Read the *new* version directly from the modified file + new_version_line=$(grep '^version:' pubspec.yaml) + # Extract just the version string (e.g., 1.2.3+4) + new_version=$(echo "$new_version_line" | sed 's/version: *//') + + echo "$new_version_line" + echo "Extracted new version: $new_version" + + if [[ -z "$new_version" ]]; then + echo "Error: Could not extract new version after cider bump." + exit 1 + fi + + # Create tag name (e.g., v1.2.3 - usually tags don't include build number) + # Extract version part before '+' for the tag + version_for_tag=$(echo "$new_version" | cut -d'+' -f1) + new_tag="v$version_for_tag" + echo "New tag: $new_tag" + + # Set outputs for later steps + echo "new_version=$new_version" >> $GITHUB_OUTPUT + echo "new_tag=$new_tag" >> $GITHUB_OUTPUT + shell: bash + + - name: Commit version bump + run: | + # Add pubspec.yaml. Add CHANGELOG.md if cider modifies it and you want to commit it. + git add pubspec.yaml + # git add CHANGELOG.md # Uncomment if needed + + # Check if there are changes to commit + if git diff --staged --quiet; then + echo "No changes detected in pubspec.yaml (or CHANGELOG.md) to commit." + else + # Use the version *without* build number for the commit message usually + git commit -m "chore(release): bump version to ${{ steps.bump.outputs.new_tag }}" + fi + shell: bash + + - name: Create Git tag + # Only run if the commit step actually committed something (check git status) + # or simply run always, it won't hurt if the commit was skipped + run: | + git tag ${{ steps.bump.outputs.new_tag }} + shell: bash + + - name: Push changes and tag + run: | + # Push the commit first (e.g., to main branch - adjust if needed) + # Handle potential conflicts if main changed since checkout? (More advanced setup) + # Check if there are commits to push before pushing branch + if ! git diff --quiet HEAD^ HEAD; then + echo "Pushing commit to main..." + git push origin HEAD:main + else + echo "No new commits to push to main." + fi + + # Always push the tag + echo "Pushing tag ${{ steps.bump.outputs.new_tag }}..." + git push origin ${{ steps.bump.outputs.new_tag }} + shell: bash + + - name: Output New Tag + run: echo "Successfully tagged release ${{ steps.bump.outputs.new_tag }}" diff --git a/.gitignore b/.gitignore index b5a7e29..3eee232 100644 --- a/.gitignore +++ b/.gitignore @@ -30,6 +30,7 @@ migrate_working_dir/ .pub-cache/ .pub/ /build/ +dist/ # Symbolication related app.*.symbols @@ -41,7 +42,7 @@ app.*.map.json /android/app/debug /android/app/profile /android/app/release -/android/app/.cxx/Debug +/android/app/.cxx/ # secret keys /secrets diff --git a/distribute_options.yaml b/distribute_options.yaml new file mode 100644 index 0000000..a04cb34 --- /dev/null +++ b/distribute_options.yaml @@ -0,0 +1,8 @@ +output: dist/ +releases: + - name: dev + jobs: + - name: release-dev-linux-deb + package: + platform: linux + target: deb diff --git a/linux/my_application.cc b/linux/my_application.cc index 8a52c8b..ca1287d 100644 --- a/linux/my_application.cc +++ b/linux/my_application.cc @@ -40,11 +40,11 @@ static void my_application_activate(GApplication* application) { if (use_header_bar) { GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new()); gtk_widget_show(GTK_WIDGET(header_bar)); - gtk_header_bar_set_title(header_bar, "vaani"); + gtk_header_bar_set_title(header_bar, "Vaani"); gtk_header_bar_set_show_close_button(header_bar, TRUE); gtk_window_set_titlebar(window, GTK_WIDGET(header_bar)); } else { - gtk_window_set_title(window, "vaani"); + gtk_window_set_title(window, "Vaani"); } gtk_window_set_default_size(window, 1280, 720); diff --git a/linux/packaging/deb/make_config.yaml b/linux/packaging/deb/make_config.yaml new file mode 100644 index 0000000..3367263 --- /dev/null +++ b/linux/packaging/deb/make_config.yaml @@ -0,0 +1,32 @@ +display_name: Vaani +package_name: vaani + +maintainer: + name: Dr.Blank + email: drblankdev@gmail.com + +priority: optional + +section: x11 + +installed_size: 75700 + +essential: false + +icon: assets/icon/logo.png + +postuninstall_scripts: + - echo "Sorry to see you go." + +keywords: + - Audiobook + - Audiobook Player + - Audiobookshelf + +generic_name: Audiobook Player + +categories: + - Media + - Utility + +startup_notify: true