Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
5 changes: 5 additions & 0 deletions .github/workflows/flutter-android.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,18 @@ jobs:
steps:
- name: Check out repository
uses: actions/checkout@v7
with:
fetch-depth: 0

- name: Validate release PR source branch
if: github.event_name == 'pull_request'
env:
RELEASE_PR_TITLE: ${{ github.event.pull_request.title }}
run: python3 tool/check_release_pull_request.py

- name: Materialize pinned shared dependencies
run: python3 tool/checkout_shared_dependencies.py

- name: Set up JDK 17
uses: actions/setup-java@v5
with:
Expand Down
17 changes: 17 additions & 0 deletions .github/workflows/flutter-linux.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,13 +30,18 @@ jobs:

- name: Check out repository
uses: actions/checkout@v7
with:
fetch-depth: 0

- name: Validate release PR source branch
if: github.event_name == 'pull_request'
env:
RELEASE_PR_TITLE: ${{ github.event.pull_request.title }}
run: python3 tool/check_release_pull_request.py

- name: Materialize pinned shared dependencies
run: python3 tool/checkout_shared_dependencies.py

- name: Install Linux build dependencies
run: |
printf 'https://archive.ubuntu.com/ubuntu/\n' | \
Expand Down Expand Up @@ -258,6 +263,18 @@ jobs:
id: snapcraft
uses: snapcore/action-build@v1

- name: Build deterministic sibling-layout source archive
run: python3 tool/package_source.py

- name: Upload pinned source artifact
if: github.event_name == 'push'
uses: actions/upload-artifact@v7
with:
name: busymax-source
path: dist/source/
if-no-files-found: error
retention-days: 7

- name: Install strict Snap
run: >-
sudo snap install --dangerous
Expand Down
6 changes: 6 additions & 0 deletions .github/workflows/flutter-windows.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ jobs:
steps:
- name: Check out repository
uses: actions/checkout@v7
with:
fetch-depth: 0

- name: Validate release PR source branch
if: github.event_name == 'pull_request'
Expand All @@ -26,6 +28,10 @@ jobs:
RELEASE_PR_TITLE: ${{ github.event.pull_request.title }}
run: python tool/check_release_pull_request.py

- name: Materialize pinned shared dependencies
shell: pwsh
run: python tool/checkout_shared_dependencies.py

- name: Set up Flutter
uses: subosito/flutter-action@v2
with:
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ migrate_working_dir/
.pub/
/build/
/coverage/
/dist/

# Per-run evidence belongs in build/ or a temporary directory.
/docs/validation/
Expand Down
5 changes: 3 additions & 2 deletions android/app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -59,12 +59,13 @@ android {
minSdk = 24
targetSdk = 37
// Keep Android's required monotonic package code separate from the
// public 0.2.4 version declared in pubspec.yaml. When using split APKs,
// public version declared in pubspec.yaml. The owner confirmed 4 is
// the highest distributed base code; v0.3.0 advances to 5. For split APKs,
// 1000 * ABI_VERSION is added automatically by Flutter.
// (https://developer.android.com/studio/build/configure-apk-splits#configure-APK-versions)
// You can force using the value of versionCode by specifying the `-P force-version-code-ignoring-abi=true`
// flag during build.
versionCode = 4
versionCode = 5
versionName = flutter.versionName
manifestPlaceholders["busymaxMsalRedirectHost"] = applicationId!!
manifestPlaceholders["busymaxMsalSignatureHash"] = msalSignatureHash
Expand Down
4 changes: 4 additions & 0 deletions android/app/src/main/res/raw/busymax_notification_keep.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Flutter's notification plugin loads this drawable by name at startup. -->
<resources xmlns:tools="http://schemas.android.com/tools"
tools:keep="@drawable/ic_notification" />
6 changes: 6 additions & 0 deletions docs/android_release.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,12 @@ Production key material is never tracked. Copy
`storeFile` at the owner-controlled keystore, and fill its passwords and alias
outside logs and shell history. Do not replace an established upload identity.

For v0.3.0 the public version is `0.3.0` and the package code is `5`, advancing
the v0.2.4 source and retained test-signed artifact code `4`. During preparation
on 2026-10-11, the owner confirmed `4` is the highest distributed base code.
For subsequent releases, verify the distribution ledger and account for ABI
offsets if split APKs were distributed before choosing the next code.

With real public provider configuration and owner signing present, build both
formats with:

Expand Down
2 changes: 1 addition & 1 deletion docs/android_setup.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# Android setup and provider registration

BusyMax Android is a beta application with package ID
`io.busystack.busymax`, version `0.2.4`, minimum API 24, and compile/target
`io.busystack.busymax`, version `0.3.0`, minimum API 24, and compile/target
API 37. The supported toolchain is Flutter 3.47.5, its bundled Dart 3.13.4,
JDK 17, Android platform 37, and Build Tools 37.x.

Expand Down
2 changes: 2 additions & 0 deletions docs/beta_snap_release.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ grep -nE '^version:|<release version=' \

The `pubspec.yaml` version, Snapcraft version, and newest metainfo release
must match. Older metainfo entries are release history.
For v0.3.0 they are `0.3.0`; `tool/package_source.py` derives the source
filename `busymax-0.3.0-source.tar.gz` from `pubspec.yaml`.

For a configured release, create the ignored file
`.snap-local/busymax-dart-defines.json` with mode `0600`:
Expand Down
5 changes: 5 additions & 0 deletions docs/desktop_oauth_release_checklist.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,17 @@ Official desktop releases support explicitly active BusyMax-managed registration

- The owner must supply a real production Desktop OAuth client ID/secret and its actual project ID through `BUSYMAX_GOOGLE_OAUTH_CLIENT_ID`, `BUSYMAX_GOOGLE_OAUTH_CLIENT_SECRET`, and `BUSYMAX_GOOGLE_OAUTH_PROJECT_ID`.
- Configure branding, support/contact details, Calendar and Tasks APIs, and the existing five scopes. Complete In production publishing and any applicable branding/domain and scope approval/verification. Publishing alone is not verification; tests cannot establish either.
- Optional contacts lookup also needs People API and `contacts.readonly` as
described in [Google setup](google_setup.md); it remains separate from initial
Calendar/Tasks authorization. Do not request contacts write access.
- BusyStack-owned production branding uses `https://busystack.org/privacy-busymax`. Other project owners must satisfy their own domain and policy obligations.

## Microsoft external prerequisites

- The owner must supply a real public app ID through `BUSYMAX_MICROSOFT_OAUTH_CLIENT_ID`. The managed registration must support personal and organizational Microsoft accounts; its authority is always `common` and is not configurable. Custom registrations retain their own audience and tenant selections.
- Configure Mobile and desktop applications with `http://localhost`, existing mandatory delegated permissions, and applicable administrator consent. Optional shared-calendar/category consent stays optional. No client secret is used.
- Optional contacts lookup uses delegated `Contacts.Read`, including Android;
see [Microsoft setup](microsoft_setup.md). Preserve existing grants accurately.

## Preserve existing registrations and data

Expand Down
18 changes: 13 additions & 5 deletions docs/development.md
Original file line number Diff line number Diff line change
Expand Up @@ -172,11 +172,19 @@ evidence are retained for seven days only after a successful `main` push or manu
The workflows do not deploy Windows packages.

Release PRs originate from the existing release branch for that version.
For v0.2.4, squash feature and fix PRs into `Release/v0.2.4`, then open
`Release/v0.2.4` into `main` with the title `Release/v0.2.4` and squash it.
Verify both the PR title and its source branch when checking release CI.
The workflows reject release titles that do not match the source release
branch; comparison permits intentionally lowercase release branch names.
Start each release branch from current `main`. Before final review, fetch and
merge any later `origin/main` commits into the release branch with a normal
merge commit. A squash of a feature containing main changes preserves its
source but does not preserve that ancestry.
Open `release/v0.3.0` into `main` with the title `Release/v0.3.0`.
`tool/check_release_pull_request.py` checks the title and branch (including
intentional lowercase naming), matching application/Snap/AppStream/Windows
resource versions, Android's increasing version code, and current target
ancestry. CI fetches the actual `refs/pull/<number>/head` and target branch;
the synthetic PR merge checkout does not prove release-branch ancestry.
The owner reviews and manually merges the open release PR.
Historically, v0.2.4 feature/fix PRs were squashed into `Release/v0.2.4`,
followed by a squash of that release PR into `main`.

For release artifacts, follow [Snap beta release](beta_snap_release.md) or
[Windows packaging](windows_packaging.md) and the
Expand Down
Loading
Loading