Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
64 commits
Select commit Hold shift + click to select a range
cdd49db
Update rclone to v1.73.0 - adds support for Shade, Drime, Filen, Inte…
thies2005 Feb 2, 2026
4cd7e71
Update NDK to r29 (29.0.14206865) - latest stable version with improv…
thies2005 Feb 2, 2026
c550283
Fix Internxt backend: add to interactive auth providers list
thies2005 Feb 2, 2026
d3dbd96
Improve Internxt support: add to interactive auth list and add error …
thies2005 Feb 2, 2026
6e8185d
Add Internxt 2FA support with interactive dialog
thies2005 Feb 2, 2026
c326118
Fix Internxt 2FA trigger: match rclone output '2FA code'
thies2005 Feb 2, 2026
85be4a9
Update README with Drime and Internxt support
thies2005 Feb 3, 2026
6af00d6
Fix sync notification stuck at 'starting sync' and add speed indication
thies2005 Feb 3, 2026
c234655
feat: implement Internxt 2FA support and fix Windows build issues
thies2005 Feb 19, 2026
ddbe7b5
feat: implement Session Guardian architecture for resilient token man…
Mar 20, 2026
c3b148d
fix: enable CGO for Android ARM builds and add ARM64 Linux host support
Mar 20, 2026
7ebbcf9
fix: make rclone build compatible with Windows (Ryzen 8845HS)
Mar 20, 2026
b255a3f
docs: add comprehensive build guide for Windows and GitHub Actions
Mar 20, 2026
e34ffe3
trigger build
Mar 20, 2026
c2c3436
docs: add comprehensive Session Guardian workflow with detailed comments
Mar 20, 2026
a6ecb88
fix: simplify workflow conditions and fix syntax
Mar 20, 2026
9eb0a0c
trigger workflow build for Pixel 9
Mar 20, 2026
455ea89
fix: shell script syntax in Go version step
Mar 20, 2026
d23d995
trigger build for Pixel 9 arm64-v8a
Mar 20, 2026
e33f590
fix: simplify workflow conditions and fix step references
Mar 20, 2026
796baf9
fix: resolve Go syntax errors in auth.go for CGO build
Mar 20, 2026
04d9087
fix: disable CGO for rclone Android build
Mar 20, 2026
b1ada08
fix: re-enable CGO and add std lib build for Android
Mar 20, 2026
9ddcce5
fix: remove duplicate code in build.gradle
Mar 20, 2026
bf0d8b4
fix: remove android build tag to resolve CGO import issues
Mar 20, 2026
41d3d77
fix: revert to working CGO configuration for GitHub Actions
Mar 20, 2026
f03793f
fix: build for linux/arm instead of android/arm to avoid CGO requirement
Mar 20, 2026
7d8302a
fix: revert to Go 1.19.8 to match working configuration
Mar 20, 2026
decea03
docs: add Windows build scripts and checklists
Mar 20, 2026
9dd5601
fix: correct Gradle task syntax and add error checking
Mar 20, 2026
25f0c9f
docs: correct manual build commands in checklist
Mar 20, 2026
19db350
docs: correct ARM64 build command in Windows guide
Mar 20, 2026
91abfe4
feat: add pre-built rclone download option to bypass Go build issues
Mar 20, 2026
9434ad3
fix: build errors and rclone build configuration optimization
thies2005 Mar 24, 2026
98b25da
fix(rclone): Fix TLS verification by providing Android path to SSL_CE…
thies2005 Mar 24, 2026
af4d2f0
fix(rclone): rebuild with patched internxt source and add log copy fe…
thies2005 Mar 24, 2026
724a3ca
Fix Internxt authentication flow: 401 Unauthorized errors and 2FA sup…
thies2005 Mar 26, 2026
3bbfebc
Switch to custom rclone fork for unified Internxt backend development
thies2005 Apr 22, 2026
1b1e874
chore: Rebrand Round Sync to CloudBridge
thies2005 Apr 23, 2026
06177e5
Merge feature/rclone-fork-integration into master: Full Rebrand to Cl…
thies2005 Apr 23, 2026
08f90fb
fix(dns): resolve DNS failure on Android by using forked rclone with …
thies2005 May 12, 2026
2cbf315
fix(ci): update gradle property names in android workflow
thies2005 May 12, 2026
bdffa78
fix: correct brace mismatch in UpdateUserchoiceReceiver.kt from confl…
thies2005 May 12, 2026
e3072e4
feat(ci): build signed release APKs and publish as GitHub beta release
thies2005 May 12, 2026
e037a87
fix: distinguish network errors from auth failures in SessionGuardian
thies2005 Jun 4, 2026
7ae40f1
chore: bump version to 1.0.1 (20) and update rclone ref to master for…
thies2005 Jun 5, 2026
e9b8315
chore: add AGENTS.md guidelines and remove obsolete build logs/plan f…
thies2005 Jun 6, 2026
e85c16e
fix: add internxt reauthentication flow
thies2005 Jun 6, 2026
580c720
fix: apply audit remediation phases 1-2 (crashes, security, data inte…
thies2005 Jun 18, 2026
c5c4b86
fix: apply audit remediation phases 3-5 (UI/UX, tech-debt, CI/docs)
thies2005 Jun 18, 2026
72bc406
fix: repair Phase 3-5 build blockers found by Android tooling
thies2005 Jun 19, 2026
592d491
fix: rotate release key and apply production-readiness hardening
thies2005 Jun 19, 2026
d38336d
ci: fix apktool wrapper download (404) in FOSS dependency scan
thies2005 Jun 19, 2026
3e2969d
fix: keep content below status bar on Android 15
thies2005 Jun 19, 2026
1932b8e
feat: add concurrent transfers setting
thies2005 Jun 19, 2026
ec6f6b8
fix: opt out of enforced edge-to-edge at theme level
thies2005 Jun 19, 2026
e60c695
chore: bump rclone fork to v1.74.3 (14b874e5)
thies2005 Jun 19, 2026
f1ce4ef
fix: give each beta a unique version and clean up old beta releases
thies2005 Jun 19, 2026
112d27d
feat: add per-task concurrent transfers override and fix bisync no-op
thies2005 Jun 19, 2026
cdccb6d
fix(ci): compute correct beta versionCode via full git history
thies2005 Jun 19, 2026
a9c2dd8
perf: improve cloud transfer throughput
Jun 23, 2026
1ffd286
fix: resolve TransferLocks compile error and align transfers default
thies2005 Jun 23, 2026
a26a25d
fix(internxt): re-auth notification deep-links and surface reauth errors
thies2005 Jul 9, 2026
21e7000
feat: add cloud-to-cloud sync and copy directions
thies2005 Jul 9, 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
183 changes: 130 additions & 53 deletions .github/workflows/android.yml
Original file line number Diff line number Diff line change
@@ -1,60 +1,137 @@
name: Android CI
name: Android CI - Beta Release Build

on:
workflow_dispatch:
push:
tags:
- '*'
branches: [master]
workflow_dispatch:
inputs:
reason:
description: 'Reason for manual build'
required: false
default: 'Manual build'

permissions:
contents: write

jobs:
createArtifacts:
build-and-release:
name: Build & Release Beta APKs
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4
- name: Read Go version from project
run: echo "GO_VERSION=$(grep -E "^de\.felixnuesse\.extract\.goVersion=" gradle.properties | cut -d'=' -f2)"
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
cache: gradle
- name: Set up Go from gradle.properties
uses: actions/setup-go@v4
with:
go-version: '${{env.GO_VERSION}}'
id: go
- name: Setup Android SDK/NDK
uses: android-actions/setup-android@v3
- name: Install NDK from gradle.properties
run: |
NDK_VERSION="$(grep -E "^de\.felixnuesse\.extract\.ndkVersion=" gradle.properties | cut -d'=' -f2)"
sdkmanager "ndk;${NDK_VERSION}"
- name: Build app
run: ./gradlew assembleOssDebug
- name: Upload APK (arm)
uses: actions/upload-artifact@v4
with:
name: nightly-armeabi.apk
path: ${{ github.workspace }}/app/build/outputs/apk/oss/debug/*-oss-armeabi-v7a-debug.apk
- name: Upload APK (arm64)
uses: actions/upload-artifact@v4
with:
name: nightly-arm64.apk
path: ${{ github.workspace }}/app/build/outputs/apk/oss/debug/*-oss-arm64-v8a-debug.apk
- name: Upload APK (x86)
uses: actions/upload-artifact@v4
with:
name: nightly-x86.apk
path: ${{ github.workspace }}/app/build/outputs/apk/oss/debug/*-oss-x86-debug.apk
- name: Upload APK (arm)
uses: actions/upload-artifact@v4
with:
name: nightly-x64.apk
path: ${{ github.workspace }}/app/build/outputs/apk/oss/debug/*-oss-x86_64-debug.apk
- name: Upload APK (universal)
uses: actions/upload-artifact@v4
with:
name: nightly-universal.apk
path: ${{ github.workspace }}/app/build/outputs/apk/oss/debug/*-oss-universal-debug.apk
retention-days: 14
- name: Checkout code
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
with:
# Full history is required: the beta versionCode is derived from
# `git rev-list --count HEAD`, which only returns the real commit
# count (not 1) when the full history is present. Without this every
# beta builds with versionCode 10 and Android refuses the update.
fetch-depth: '0'

- name: Read versions from gradle.properties
run: |
GO_VERSION=$(grep '^de\.schuelken\.cloudbridge\.goVersion=' gradle.properties | cut -d'=' -f2)
NDK_VERSION=$(grep '^de\.schuelken\.cloudbridge\.ndkVersion=' gradle.properties | cut -d'=' -f2)
echo "GO_VERSION=$GO_VERSION" >> $GITHUB_ENV
echo "NDK_VERSION=$NDK_VERSION" >> $GITHUB_ENV

- name: Compute beta version
id: app-version
run: |
BASE_NAME=$(grep "versionName " app/build.gradle | grep -oE "[0-9]+\.[0-9]+\.[0-9]+" | head -1)
SHORT_SHA=$(git rev-parse --short HEAD)
COMMIT_COUNT=$(git rev-list --count HEAD)
# versionCode ends in 0 (ABI offsets use 6-9); bump per commit so every beta is a real update
VERSION_CODE=$((COMMIT_COUNT * 10))
VERSION_NAME="${BASE_NAME}-beta.${SHORT_SHA}"
TAG="v${VERSION_NAME}"
{
echo "version_name=$VERSION_NAME"
echo "version_code=$VERSION_CODE"
echo "tag=$TAG"
} >> "$GITHUB_OUTPUT"
echo "CB_VERSION_CODE=$VERSION_CODE" >> "$GITHUB_ENV"
echo "CB_VERSION_NAME=$VERSION_NAME" >> "$GITHUB_ENV"
echo "Building CloudBridge ${VERSION_NAME} (versionCode ${VERSION_CODE}) as ${TAG}"

- name: Set up JDK 17
uses: actions/setup-java@17f84c3641ba7b8f6deff6309fc4c864478f5d62 # v3
with:
java-version: '17'
distribution: 'temurin'
cache: gradle

- name: Install Go
uses: actions/setup-go@40f1582b2485089dde7abd97c1529aa768e1baff # v5
with:
go-version: '${{ env.GO_VERSION }}'
cache: true

- name: Setup Android SDK
uses: android-actions/setup-android@9fc6c4e9069bf8d3d10b2204b1fb8f6ef7065407 # v3

- name: Install NDK
run: |
echo "Installing NDK version: ${{ env.NDK_VERSION }}"
sdkmanager "ndk;${{ env.NDK_VERSION }}"

- name: Configure release signing
env:
CB_KEYSTORE_BASE64: ${{ secrets.CB_KEYSTORE_BASE64 }}
run: |
mkdir -p app/.config/android
echo "$CB_KEYSTORE_BASE64" | base64 -d > app/.config/android/cloudbridge-release.keystore

- name: Build release APKs
env:
CB_STORE_FILE: app/.config/android/cloudbridge-release.keystore
CB_STORE_PASSWORD: ${{ secrets.CB_STORE_PASSWORD }}
CB_KEY_ALIAS: ${{ secrets.CB_KEY_ALIAS }}
CB_KEY_PASSWORD: ${{ secrets.CB_KEY_PASSWORD }}
run: |
echo "Building OSS Release APKs..."
./gradlew assembleOssRelease

- name: List built APKs
run: find app/build/outputs/apk -name '*.apk' -exec ls -lh {} \;

- name: Delete previous beta releases
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
CURRENT_TAG="${{ steps.app-version.outputs.tag }}"
gh release list --json tagName -q '.[].tagName' | grep '\-beta\.' | while read -r tag; do
if [ -z "$tag" ] || [ "$tag" = "$CURRENT_TAG" ]; then
continue
fi
echo "Deleting old beta release: $tag"
gh release delete "$tag" --yes --cleanup-tag 2>/dev/null || true
done

- name: Create beta release
uses: softprops/action-gh-release@3bb12739c298aeb8a4eeaf626c5b8d85266b0e65 # v2
with:
tag_name: ${{ steps.app-version.outputs.tag }}
name: "Beta ${{ steps.app-version.outputs.tag }}"
prerelease: true
body: |
## CloudBridge Beta Build

**Version:** ${{ steps.app-version.outputs.version_name }}
**Commit:** ${{ github.sha }}
**Branch:** ${{ github.ref_name }}

Auto-built from latest master push.

### Downloads
- **arm64-v8a** — most modern phones (Pixel, Samsung, etc.)
- **armeabi-v7a** — older 32-bit ARM devices
- **x86_64** — emulators / ChromeOS
- **x86** — older emulators
- **universal** — all architectures (larger file)
files: |
app/build/outputs/apk/oss/release/*-oss-armeabi-v7a-release.apk
app/build/outputs/apk/oss/release/*-oss-arm64-v8a-release.apk
app/build/outputs/apk/oss/release/*-oss-x86-release.apk
app/build/outputs/apk/oss/release/*-oss-x86_64-release.apk
app/build/outputs/apk/oss/release/*-oss-universal-release.apk
28 changes: 16 additions & 12 deletions .github/workflows/dependencies.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,10 @@ jobs:
outputs:
changed: ${{ steps.changeDetection.outputs.should-run }}
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
- name: Get changed files
id: changed-files
uses: tj-actions/changed-files@v44
uses: tj-actions/changed-files@ed68ef82c095e0d48ec87eccea555d944a631a4c # v46
- name: Verify build.gradle changed
id: changeDetection
env:
Expand All @@ -31,25 +31,28 @@ jobs:
needs: dependency-change-verification
if: needs.dependency-change-verification.outputs.changed == 'true'
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
- name: Read Go version from project
run: echo "GO_VERSION=$(grep -E "^de\.felixnuesse\.extract\.goVersion=" gradle.properties | cut -d'=' -f2)"
run: |
GO_VERSION=$(grep -E "^de\.schuelken\.cloudbridge\.goVersion=" gradle.properties | cut -d'=' -f2)
echo "GO_VERSION=$GO_VERSION" >> $GITHUB_ENV
echo "Go version: $GO_VERSION"
- name: Set up JDK 17
uses: actions/setup-java@v3
uses: actions/setup-java@17f84c3641ba7b8f6deff6309fc4c864478f5d62 # v3
with:
java-version: '17'
distribution: 'temurin'
cache: gradle
- name: Set up Go from gradle.properties
uses: actions/setup-go@v4
uses: actions/setup-go@40f1582b2485089dde7abd97c1529aa768e1baff # v5
with:
go-version: '${{env.GO_VERSION}}'
id: go
- name: Setup Android SDK/NDK
uses: android-actions/setup-android@v3
uses: android-actions/setup-android@9fc6c4e9069bf8d3d10b2204b1fb8f6ef7065407 # v3
- name: Install NDK from gradle.properties
run: |
NDK_VERSION="$(grep -E "^de\.felixnuesse\.extract\.ndkVersion=" gradle.properties | cut -d'=' -f2)"
NDK_VERSION="$(grep -E "^de\.schuelken\.cloudbridge\.ndkVersion=" gradle.properties | cut -d'=' -f2)"
sdkmanager "ndk;${NDK_VERSION}"
- name: Build app
run: ./gradlew assembleOssDebug
Expand All @@ -58,18 +61,19 @@ jobs:
run: |
# prepare scanapk with apktool.
wget https://github.com/iBotPeaches/Apktool/releases/download/v$apktoolVersion/apktool_$apktoolVersion.jar
# Wrapper for apktool_*.jar
wget https://github.com/iBotPeaches/Apktool/raw/master/scripts/linux/apktool
# Wrapper for apktool_*.jar. Upstream removed scripts/linux/apktool (404), so inline a
# minimal one that just invokes the jar from its own directory.
printf '#!/bin/bash\njava -jar "$(dirname "$0")/apktool.jar" "$@"\n' > apktool
# clone izzy's repo with the scan tools
git clone https://gitlab.com/IzzyOnDroid/repo.git
# create a directory for Apktool and move the apktool* files there
mkdir -p repo/lib/radar/tool
mv apktool* repo/lib/radar/tool
chmod u+x repo/lib/radar/tool/apktool
mv repo/lib/radar/tool/apktool_$apktoolVersion.jar repo/lib/radar/tool/apktool.jar
repo/bin/scanapk.php app/build/outputs/apk/oss/debug/roundsync_v*-oss-universal-debug.apk
repo/bin/scanapk.php app/build/outputs/apk/oss/debug/cloudbridge_v*-oss-universal-debug.apk
env:
apktoolVersion: "2.9.3"
- name: 'Get Commit Hash'
id: commit
uses: pr-mpt/actions-commit-hash@v1
uses: pr-mpt/actions-commit-hash@d06222114eac9daa8cfe0a748462a83e651aa136 # v1
8 changes: 5 additions & 3 deletions .github/workflows/lint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,18 +10,20 @@ jobs:
checkLint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
- name: Set up JDK 17
uses: actions/setup-java@v3
uses: actions/setup-java@17f84c3641ba7b8f6deff6309fc4c864478f5d62 # v3
with:
java-version: '17'
distribution: 'temurin'
cache: gradle
- name: Unit tests
run: ./gradlew testOssDebugUnitTest -x :rclone:buildAll
- name: Run Linter
run: ./gradlew lint -x :rclone:buildAll
- name: Upload Reports
if: always()
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
name: Lint Reports
path: ~/**/build/reports/
Expand Down
10 changes: 5 additions & 5 deletions .github/workflows/translations.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,10 @@ jobs:
changed: ${{ steps.changeDetection.outputs.should-run }}
files: ${{ steps.changeDetection.outputs.files }}
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
- name: Get changed files
id: changed-files
uses: tj-actions/changed-files@v44
uses: tj-actions/changed-files@ed68ef82c095e0d48ec87eccea555d944a631a4c # v46
- name: Verify build.gradle changed
id: changeDetection
env:
Expand All @@ -36,7 +36,7 @@ jobs:
needs: string-change-verification
if: needs.string-change-verification.outputs.changed == 'true'
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
with:
fetch-depth: 0
- name: Prepare Profanity Check
Expand All @@ -55,7 +55,7 @@ jobs:
TRANSLATIONS=$(./scripts/generateFilelist.sh ${{ github.event.pull_request.commits }} ${{needs.string-change-verification.outputs.files}})
echo "TRANSLATIONS=$TRANSLATIONS" >> $GITHUB_OUTPUT
shell: sh
- uses: fabasoad/translation-action@main
- uses: fabasoad/translation-action@1476a9db97feaa816029bc027103eb89f3b017bf # v4.2.4
id: google-translate
with:
provider: google
Expand All @@ -68,7 +68,7 @@ jobs:
./scripts/checkProfanity.py translated_texts.txt
shell: sh
- name: Upload Raw Translations
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
name: Translations
path: |
Expand Down
13 changes: 12 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,11 @@ captures/
.idea/libraries
.idea/caches

# Keystore files
# Keystore files (release signing keys must never be committed)
*.jks
*.keystore
# Local signing credentials for release builds (see app/build.gradle)
keystore.properties

# External native build folder generated in Android Studio 2.2 and later
.externalNativeBuild
Expand All @@ -70,3 +73,11 @@ debug/
.idea/codeStyles/codeStyleConfig.xml
.idea/inspectionProfiles/Project_Default.xml
.idea/

# Node (not used by this Android project)
node_modules/
package.json
package-lock.json

# Local ZCode IDE state
.zcode/
3 changes: 3 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"java.configuration.updateBuildConfiguration": "interactive"
}
Loading