Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
9350af4
Bump version to v0.2.2
albert-gee Sep 14, 2026
263a99e
Add Android support
albert-gee Sep 14, 2026
a8d0604
Fixed Android implementation:
albert-gee Sep 14, 2026
b0f816c
Fixed Launch at login: Disabled GNOME startup entry, preserving a rec…
albert-gee Sep 15, 2026
356ff0f
Refactored Android notifications:
albert-gee Sep 15, 2026
f14f309
Introduce detailed free/busy evaluations:
albert-gee Sep 15, 2026
47064f2
Update Android verification documentation with new baseline and corre…
ChenZhenIO Sep 15, 2026
f503330
Implemented filterable Schedule search across Linux, Windows, and And…
ChenZhenIO Sep 15, 2026
62bc568
Refactored Schedule search filters and person matching logic
ChenZhenIO Sep 15, 2026
40726ce
Refactor filters ui
ChenZhenIO Sep 15, 2026
1cdebc0
Refactor sidebar and filters ui
ChenZhenIO Sep 15, 2026
415154b
Refactor Schedule search result handling and agenda view rendering
ChenZhenIO Sep 16, 2026
252af11
Refactor Schedule agenda view and search result comparison logic
ChenZhenIO Sep 16, 2026
a80f6ed
Update Flutter to 3.47.4 and Dart to 3.13.3 across toolchain, tests, …
albert-gee Sep 18, 2026
8a73d1b
Implemented the “First day of the week” preference across Linux, Wind…
albert-gee Sep 18, 2026
c4f1bde
Fix Microsoft task conflict
albert-gee Sep 19, 2026
d057acf
Fix Linux native weekday reader, open search-filter interaction
albert-gee Sep 19, 2026
fe9253b
Refactor `BusyMaxReadFirstWeekday` implementation for clarity and GLI…
albert-gee Sep 19, 2026
7f5b734
Fix sync recovery, mutation ordering, calendar navigation, and DAV ca…
albert-gee Sep 19, 2026
25090fd
Introduce `NativeTerminatingHttpClient` for precise connection termin…
albert-gee Sep 19, 2026
fc389d0
Implemented the complete first-day-of-week correction and regression …
albert-gee Sep 19, 2026
7f10bf6
Add tests for superseded weekday reads and delayed portal completions…
ChenZhenIO Sep 19, 2026
3ab4ff6
Fix Android SDK manager path in CI
ChenZhenIO Sep 19, 2026
7e0997b
Fix quiet-hours test timezone
ChenZhenIO Sep 19, 2026
153bd18
Fix Windows CI path assumptions
ChenZhenIO Sep 19, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
61 changes: 61 additions & 0 deletions .github/workflows/flutter-android.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
name: Flutter Android

on:
workflow_dispatch:
pull_request:
branches: [main]
push:
branches: [main]

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
build:
runs-on: ubuntu-24.04

steps:
- name: Check out repository
uses: actions/checkout@v7

- name: Set up JDK 17
uses: actions/setup-java@v5
with:
distribution: temurin
java-version: '17'

- name: Set up Flutter
uses: subosito/flutter-action@v2
with:
channel: stable
flutter-version: '3.47.4'
cache: true

- name: Install Android API and Build Tools 37
run: >-
"$ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager"
'platforms;android-37.0'
'build-tools;37.0.0'

- name: Verify source, Dart, Flutter, Android, and native plugin tests
run: tool/android/verify.sh

- name: Build explicitly test-signed release APK and AAB
run: >-
tool/android/build_release.sh --all --test-signing
--allow-unconfigured-providers

- name: Inspect test-signed artifacts
run: tool/android/inspect_artifacts.sh

- name: Upload clearly labeled non-production artifacts
uses: actions/upload-artifact@v7
with:
name: busymax-android-test-signed-not-for-distribution
path: |
build/app/outputs/flutter-apk/app-release.apk
build/app/outputs/bundle/release/app-release.aab
build/android/android-artifact-inspection.txt
if-no-files-found: error
retention-days: 7
33 changes: 29 additions & 4 deletions .github/workflows/flutter-linux.yml
Original file line number Diff line number Diff line change
Expand Up @@ -32,13 +32,15 @@ jobs:
libsecret-1-dev \
libjsoncpp-dev \
liblzma-dev \
locales \
xvfb
sudo locale-gen en_US.UTF-8 en_GB.UTF-8

- name: Set up Flutter
uses: subosito/flutter-action@v2
with:
channel: stable
flutter-version: '3.47.2'
flutter-version: '3.47.4'
cache: true

- name: Verify pinned Flutter and bundled Dart
Expand All @@ -50,8 +52,8 @@ jobs:
"$dart_executable" tool/verify_flutter_sdk.dart \
--flutter "$flutter_executable" \
--dart "$dart_executable" \
--expected-flutter 3.47.2 \
--expected-dart 3.13.2
--expected-flutter 3.47.4 \
--expected-dart 3.13.3
printf 'BUSYMAX_FLUTTER_EXECUTABLE=%s\n' "$flutter_executable" >> "$GITHUB_ENV"
printf 'BUSYMAX_DART_EXECUTABLE=%s\n' "$dart_executable" >> "$GITHUB_ENV"

Expand Down Expand Up @@ -87,13 +89,36 @@ jobs:
- name: Test
run: '"$BUSYMAX_FLUTTER_EXECUTABLE" test'

- name: Test native clock patterns and optional GTK time picker
- name: Test native clock patterns, weekday locale, and GTK time picker
run: |
mkdir -p build/linux/native-tests
g++ -std=c++17 -Wall -Wextra -Werror \
windows/runner/tests/short_time_pattern_test.cpp \
-o build/linux/native-tests/short_time_pattern_test
build/linux/native-tests/short_time_pattern_test
g++ -std=c++17 -Wall -Wextra -Werror \
linux/runner/tests/first_weekday_test.cc \
-o build/linux/native-tests/first_weekday_test
build/linux/native-tests/first_weekday_test
mkdir -p build/linux/native-tests/weekday-schemas
glib-compile-schemas --strict \
--targetdir=build/linux/native-tests/weekday-schemas \
linux/runner/tests/schemas
g++ -std=c++17 -Wall -Wextra -Werror \
linux/runner/tests/first_weekday_preference_test.cc \
linux/runner/first_weekday_preference.cc \
-o build/linux/native-tests/first_weekday_preference_test \
$(pkg-config --cflags --libs gio-2.0)
build/linux/native-tests/first_weekday_preference_test \
build/linux/native-tests/weekday-schemas
LC_ALL=C.UTF-8 MALLOC_PERTURB_=165 \
build/linux/native-tests/first_weekday_test
g++ -std=c++17 -Wall -Wextra -Werror \
-fsanitize=address -fno-omit-frame-pointer \
linux/runner/tests/first_weekday_test.cc \
-o build/linux/native-tests/first_weekday_test_asan
ASAN_OPTIONS=detect_leaks=0 \
build/linux/native-tests/first_weekday_test_asan
g++ -std=c++17 -Wall -Wextra -Werror \
linux/runner/tests/time_picker_test.cc \
-o build/linux/native-tests/time_picker_test \
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/flutter-windows.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ jobs:
uses: subosito/flutter-action@v2
with:
channel: stable
flutter-version: '3.47.2'
flutter-version: '3.47.4'
cache: true

- name: Enable Windows desktop
Expand Down
5 changes: 4 additions & 1 deletion .metadata
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
# This file should be version controlled and should not be manually edited.

version:
revision: "f6ff1529fd6d8af5f706051d9251ac9231c83407"
revision: "d3b14c876900e553bc736ca19295fc09e3853e8e"
channel: "stable"

project_type: app
Expand All @@ -21,6 +21,9 @@ migration:
- platform: windows
create_revision: ad70ec4617166f1c38e5d2bfd388af71fda14f06
base_revision: ad70ec4617166f1c38e5d2bfd388af71fda14f06
- platform: android
create_revision: d3b14c876900e553bc736ca19295fc09e3853e8e
base_revision: d3b14c876900e553bc736ca19295fc09e3853e8e

# User provided section

Expand Down
7 changes: 7 additions & 0 deletions .run/BusyMax Android.run.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="BusyMax Android" type="FlutterRunConfigurationType" factoryName="Flutter">
<option name="filePath" value="$PROJECT_DIR$/lib/main_android.dart" />
<option name="additionalArgs" value="" />
<method v="2" />
</configuration>
</component>
9 changes: 9 additions & 0 deletions NOTICE
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,12 @@ Source repository: https://github.com/busystack/busymax
The BusyMax name and logo are identifying marks of BusyStack.
This license does not grant permission to use the BusyMax name or logo to
imply endorsement, sponsorship, or official status for modified versions.

The Android build includes Microsoft Authentication Library for Android
(MSAL), licensed under the MIT License; Flutter Workmanager, licensed under the
MIT License; and flutter_local_notifications, licensed under the BSD 3-Clause
License. It also links Google Play services libraries, which are distributed
under Google's applicable Android SDK and API terms. Complete Flutter package
license text is available through Flutter's license registry in built apps;
Gradle dependency and license records must be retained with distributed
Android artifacts.
40 changes: 33 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
# BusyMax

BusyMax is a beta calendar and task manager for Linux and Windows. It brings
events, tasks, reminders, and day, week, month, year, and agenda views into one
desktop application.
BusyMax is a beta calendar and task manager for Android, Linux, and Windows. It
brings events, tasks, reminders, and day, week, month, year, and agenda views
into one application.

Linux uses a Yaru/GTK desktop composition with XDG integrations. Windows uses
a separate Fluent composition with a native Windows title bar, tray,
notifications, and packaged startup integration. Provider capabilities differ;
notifications, and packaged startup integration. Android uses a separate
adaptive Material 3 composition, native account authorization, WorkManager,
Android notifications, and the Storage Access Framework. Provider capabilities differ;
see the [provider support matrix](docs/provider_support_matrix.md) before
relying on a particular task field or operation.

Expand All @@ -29,8 +31,8 @@ relying on a particular task field or operation.
permissions granted for a collection.
- Local caching for offline viewing. Supported changes can be queued for some
providers; offline behavior is not identical across every integration.
- Desktop reminders, tray actions, import/export, themes, keyboard navigation,
and localized interfaces.
- Platform-native reminders, Android document import/export, desktop tray
actions, themes, keyboard navigation, and localized interfaces.

<details>
<summary>More Linux screenshots</summary>
Expand Down Expand Up @@ -67,7 +69,9 @@ test artifacts, not ordinary user downloads.
Packaged users do not need Flutter, Visual Studio, Linux development libraries,
or their own OAuth registration. In a configured build:

- Google and Microsoft accounts connect through browser-based sign-in.
- Desktop Google and Microsoft accounts connect through browser-based sign-in.
Android uses Google Play services authorization for Google and MSAL's
registered browser redirect for Microsoft.
- Apple iCloud Calendar uses an Apple app-specific password; Apple Reminders is
not supported. See [Connect Apple iCloud Calendar](docs/apple_icloud_setup.md).
- Nextcloud authorizes BusyMax in the default browser and requires a compatible
Expand All @@ -80,6 +84,24 @@ use the [Google OAuth registration guide](docs/google_setup.md) or
differences and limitations are summarized in the
[provider support matrix](docs/provider_support_matrix.md).

### Android development build

Android support targets API 37 with a minimum API of 24 and uses the explicit
entrypoint `lib/main_android.dart`. It requires Flutter 3.47.4, bundled Dart
3.13.3, JDK 17, Android platform 37, and Build Tools 37.x.

```sh
tool/android/check_prerequisites.sh
cp android/busymax.android.properties.example android/busymax.android.properties
tool/android/run.sh --device DEVICE_ID
```

The copied public configuration needs real Microsoft and certificate-specific
provider registrations before those sign-in flows work. It contains no client
secret. See [Android setup](docs/android_setup.md), [Android release](docs/android_release.md),
and the [Android verification report](docs/android_verification.md). Generated
test-signed artifacts are not production releases.

## Documentation

Account, provider, and data information:
Expand All @@ -88,10 +110,14 @@ Account, provider, and data information:
- [Apple iCloud Calendar setup](docs/apple_icloud_setup.md)
- [Nextcloud Calendar and Tasks setup](docs/nextcloud_setup.md)
- [Privacy and data map](docs/privacy_data_map.md)
- [Android setup and OAuth registration](docs/android_setup.md)
- [Android provider parity](docs/android_provider_parity.md)

Development and maintenance:

- [Development setup for Linux and Windows](docs/development.md)
- [Android release](docs/android_release.md), [verification](docs/android_verification.md),
and [implementation status](docs/android_implementation_status.md)
- [Google developer OAuth registration](docs/google_setup.md) and
[Microsoft developer OAuth registration](docs/microsoft_setup.md)
- [iCalendar and DAV data model](docs/icalendar_data_model.md)
Expand Down
3 changes: 3 additions & 0 deletions analysis_options.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@ analyzer:
- tool/google_tasks_discovery/cache/**
- windows/**
- linux/**
- android/**
- packages/**/example/**
- packages/busymax_android_platform/example/**

linter:
rules:
Expand Down
16 changes: 16 additions & 0 deletions android/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
/.gradle
/build
/captures/
/local.properties
/busymax.android.properties
/key.properties
*.jks
*.keystore
GeneratedPluginRegistrant.java
.cxx/

# Remember to never publicly share your keystore.
# See https://flutter.dev/to/reference-keystore
key.properties
**/*.keystore
**/*.jks
Loading
Loading