Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
cf8af06
Loading large images
desistefanova Jul 27, 2025
091c3ab
build release
desistefanova Jan 28, 2026
c06125c
feat: video playback with media_kit and stream URL
desistefanova Jan 28, 2026
a3a561f
fix: add missing closing parenthesis for Focus in photo viewer build
desistefanova Jan 28, 2026
7edce4e
Trash: screen, restore, empty trash (password), home refresh, API and…
desistefanova Jan 28, 2026
96f5055
HomeMobiSync rename, CI build/deploy, English-only
desistefanova Jan 28, 2026
88df034
android build
desistefanova Jan 28, 2026
1bae881
Merge branch 'large-images' of https://github.com/takecontrolsoft/syn…
desistefanova Jan 28, 2026
5de73dd
apk
desistefanova Jan 29, 2026
3bf5a62
Thumbnail cache, path normalization, month grouping
desistefanova Jan 30, 2026
cce0de7
Photo viewer: fix controls disappearing, add always-visible back
desistefanova Jan 30, 2026
b4eb98f
CI, quality levels, download, video play button
desistefanova Jan 30, 2026
e07c794
Video play button: tap-through when on video, hide overlay on swipe t…
desistefanova Jan 30, 2026
3fc08c9
build for android
desistefanova Jan 30, 2026
bfa9802
gallary changed
desistefanova Jan 30, 2026
12c5466
Account: Delete cached images & Delete Sync Metadata; Trash: restore …
desistefanova Jan 30, 2026
ea6371a
apk build
desistefanova Jan 30, 2026
c47a266
UI: AppBar logo left + bottom bar color, Account layout, refresh FAB …
desistefanova Jan 30, 2026
3d834ee
Merge branch 'large-images' of https://github.com/takecontrolsoft/syn…
desistefanova Jan 30, 2026
ea8ef20
dart format: fix formatting for CI
desistefanova Jan 30, 2026
69c1bc7
Fix dart analyze warnings: unused vars, explicit types, null checks, …
desistefanova Jan 30, 2026
35b0beb
dart format: photo_viewer_screen.dart
desistefanova Jan 30, 2026
5825b62
ios: set platform :ios 12.0 for wakelock_plus compatibility
desistefanova Jan 30, 2026
e2b99c4
ios: enforce iOS 12.0 in target and post_install for pods
desistefanova Jan 30, 2026
ab103c2
ios: set deployment target to 13.0 for pod compatibility
desistefanova Jan 30, 2026
78f6426
android: upgrade AGP to 8.9.1 and Gradle to 8.9 for androidx deps
desistefanova Jan 30, 2026
acad7c2
android: force AGP 8.9.1 via plugin resolution for CI
desistefanova Jan 30, 2026
5b4ea1f
android: bump Gradle to 8.11.1 for AGP 8.9.1
desistefanova Jan 30, 2026
bcf7007
ci: convert keystore to JKS in CI, disable Gradle daemon
desistefanova Jan 30, 2026
4c90a42
ci: add srcalias/destalias to keytool import for keystore conversion
desistefanova Jan 30, 2026
4413948
chore: release v1.0.10 - iOS 13, Android AGP/Gradle, CI keystore, sof…
desistefanova Jan 30, 2026
24b9cea
Gallery: all-photos toggle, 404 handling, API version 1.0.8 header
desistefanova Jan 30, 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
11 changes: 8 additions & 3 deletions .github/workflows/FlutterApp.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ jobs:
channel: 'stable'

- name: Install dependencies
run: dart pub get
run: flutter pub get

- name: Verify formatting
run: dart format --output=none --set-exit-if-changed .
Expand Down Expand Up @@ -66,10 +66,15 @@ jobs:
channel: 'stable'

- name: Install dependencies
run: dart pub get
run: flutter pub get

- name: Run integration tests
run: xvfb-run flutter test integration_test
run: |
if [ -d integration_test ]; then
xvfb-run flutter test integration_test
else
echo "No integration_test directory, skipping."
fi

- name: Dump docker logs on failure
uses: jwalton/gh-docker-logs@v2
126 changes: 126 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
name: Build (Android, iOS, Windows)

# Android and Windows: release. iOS: simulator only (release not supported). Android requires GitHub Secrets:
# ANDROID_KEYSTORE_BASE64, ANDROID_KEYSTORE_PASSWORD, ANDROID_KEY_ALIAS, ANDROID_KEY_PASSWORD.

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

concurrency:
group: build-${{ github.head_ref || github.ref }}
cancel-in-progress: true

jobs:
build-android:
name: Android
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Setup Java
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: 17

- name: Setup Flutter
uses: subosito/flutter-action@v2
with:
channel: stable
cache: true

- name: Create keystore and key.properties
run: |
mkdir -p android/app
printf '%s' "$ANDROID_KEYSTORE_B64" | base64 -d > android/app/upload-keystore.jks
keytool -importkeystore \
-srckeystore android/app/upload-keystore.jks \
-destkeystore android/app/upload-keystore-legacy.jks \
-deststoretype JKS \
-srcalias "$KEY_ALIAS" \
-destalias "$KEY_ALIAS" \
-deststorepass "$STORE_PASS" \
-destkeypass "$KEY_PASS" \
-srcstorepass "$STORE_PASS" \
-srckeypass "$KEY_PASS" \
-noprompt
mv android/app/upload-keystore-legacy.jks android/app/upload-keystore.jks
cat > android/key.properties << EOF
storePassword=${{ secrets.ANDROID_KEYSTORE_PASSWORD }}
keyPassword=${{ secrets.ANDROID_KEY_PASSWORD }}
keyAlias=${{ secrets.ANDROID_KEY_ALIAS }}
storeFile=upload-keystore.jks
EOF
env:
ANDROID_KEYSTORE_B64: ${{ secrets.ANDROID_KEYSTORE_BASE64 }}
STORE_PASS: ${{ secrets.ANDROID_KEYSTORE_PASSWORD }}
KEY_PASS: ${{ secrets.ANDROID_KEY_PASSWORD }}
KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }}

- name: Install dependencies
run: flutter pub get

- name: Build APK (release)
run: flutter build apk --release

- name: Upload APK
uses: actions/upload-artifact@v4
with:
name: android-release-apk
path: build/app/outputs/flutter-apk/app-release.apk

build-ios:
name: iOS (simulator)
runs-on: macos-14
steps:
- uses: actions/checkout@v4

- name: Setup Flutter
uses: subosito/flutter-action@v2
with:
channel: stable
cache: true

- name: Install dependencies
run: flutter pub get

- name: Install CocoaPods dependencies
run: cd ios && pod install && cd ..

- name: Build iOS (simulator)
run: flutter build ios --simulator

- name: Upload iOS app
uses: actions/upload-artifact@v4
with:
name: ios-simulator-app
path: build/ios/iphonesimulator/Runner.app

build-windows:
name: Windows
runs-on: windows-latest
steps:
- uses: actions/checkout@v4

- name: Setup Flutter
uses: subosito/flutter-action@v2
with:
channel: stable
cache: true

- name: Install dependencies
run: flutter pub get

- name: Build Windows (release)
run: flutter build windows --release

- name: Upload Windows build
uses: actions/upload-artifact@v4
with:
name: windows-build
path: build/windows/x64/runner/Release/

185 changes: 185 additions & 0 deletions .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,185 @@
name: Deploy (Google Play & App Store)

# Publishes AAB to Google Play and IPA to TestFlight.
# Trigger: tag v* or workflow_dispatch.
#
# Google Play – Secrets: GOOGLE_PLAY_CREDENTIALS (service account JSON), same as build for Android.
# App Store – Secrets: BUILD_CERTIFICATE_BASE64 (p12), P12_PASSWORD, BUILD_PROVISION_PROFILE_BASE64;
# Vars: APPSTORE_ISSUER_ID, APPSTORE_API_KEY_ID. Secret: APPSTORE_API_PRIVATE_KEY (.p8 contents).
# Var: IOS_PROFILE_NAME – exact provisioning profile name for eu.mobisync.syncClient.

on:
push:
tags:
- 'v*'
workflow_dispatch:
inputs:
play_track:
description: 'Google Play track'
required: false
default: 'internal'
type: choice
options:
- internal
- alpha
- beta
- production
deploy_android:
description: 'Deploy to Google Play'
required: false
default: true
type: boolean
deploy_ios:
description: 'Deploy to App Store (TestFlight)'
required: false
default: true
type: boolean

concurrency:
group: deploy-${{ github.ref }}
cancel-in-progress: false

jobs:
deploy-android:
name: Deploy Android (Google Play)
if: github.event_name != 'workflow_dispatch' || github.event.inputs.deploy_android != 'false'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Setup Java
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: 17

- name: Setup Flutter
uses: subosito/flutter-action@v2
with:
channel: stable
cache: true

- name: Create keystore and key.properties
run: |
mkdir -p android/app
printf '%s' "$ANDROID_KEYSTORE_B64" | base64 -d > android/app/upload-keystore.jks
keytool -importkeystore \
-srckeystore android/app/upload-keystore.jks \
-destkeystore android/app/upload-keystore-legacy.jks \
-deststoretype JKS \
-srcalias "$KEY_ALIAS" \
-destalias "$KEY_ALIAS" \
-deststorepass "$STORE_PASS" \
-destkeypass "$KEY_PASS" \
-srcstorepass "$STORE_PASS" \
-srckeypass "$KEY_PASS" \
-noprompt
mv android/app/upload-keystore-legacy.jks android/app/upload-keystore.jks
cat > android/key.properties << EOF
storePassword=${{ secrets.ANDROID_KEYSTORE_PASSWORD }}
keyPassword=${{ secrets.ANDROID_KEY_PASSWORD }}
keyAlias=${{ secrets.ANDROID_KEY_ALIAS }}
storeFile=upload-keystore.jks
EOF
env:
ANDROID_KEYSTORE_B64: ${{ secrets.ANDROID_KEYSTORE_BASE64 }}
STORE_PASS: ${{ secrets.ANDROID_KEYSTORE_PASSWORD }}
KEY_PASS: ${{ secrets.ANDROID_KEY_PASSWORD }}
KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }}

- name: Install dependencies
run: flutter pub get

- name: Build App Bundle (release)
run: flutter build appbundle --release

- name: Upload to Google Play
uses: r0adkll/upload-google-play@v1
with:
serviceAccountJsonPlainText: ${{ secrets.GOOGLE_PLAY_CREDENTIALS }}
packageName: eu.mobisync.sync_client
releaseFiles: build/app/outputs/bundle/release/app-release.aab
track: ${{ github.event.inputs.play_track || 'internal' }}
status: completed
mappingFile: android/app/build/outputs/mapping/release/mapping.txt

deploy-ios:
name: Deploy iOS (TestFlight)
if: github.event_name != 'workflow_dispatch' || github.event.inputs.deploy_ios != 'false'
runs-on: macos-14
steps:
- uses: actions/checkout@v4

- name: Import code signing certificate
uses: apple-actions/import-codesign-certs@v3
with:
p12-file-base64: ${{ secrets.BUILD_CERTIFICATE_BASE64 }}
p12-password: ${{ secrets.P12_PASSWORD }}

- name: Install provisioning profile
run: |
mkdir -p "$HOME/Library/MobileDevice/Provisioning Profiles"
printf '%s' "$BUILD_PROVISION_PROFILE_B64" | base64 -d > "$HOME/Library/MobileDevice/Provisioning Profiles/ci.mobileprovision"
env:
BUILD_PROVISION_PROFILE_B64: ${{ secrets.BUILD_PROVISION_PROFILE_BASE64 }}

- name: Create ExportOptions.plist
run: |
PROFILE="${{ vars.IOS_PROFILE_NAME }}"
if [ -z "$PROFILE" ]; then
echo "::error::Repository variable IOS_PROFILE_NAME is required for iOS deploy."
exit 1
fi
cat > ios/ExportOptions.plist << EOF
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>method</key>
<string>app-store</string>
<key>teamID</key>
<string>R25XLT6Z87</string>
<key>signingStyle</key>
<string>manual</string>
<key>signingCertificate</key>
<string>iPhone Distribution</string>
<key>provisioningProfiles</key>
<dict>
<key>eu.mobisync.syncClient</key>
<string>${PROFILE}</string>
</dict>
<key>uploadSymbols</key>
<true/>
</dict>
</plist>
EOF

- name: Setup Flutter
uses: subosito/flutter-action@v2
with:
channel: stable
cache: true

- name: Install dependencies
run: flutter pub get

- name: Install CocoaPods
run: cd ios && pod install && cd ..

- name: Build IPA
run: flutter build ipa --export-options-plist=ios/ExportOptions.plist

- name: Locate IPA
id: ipa
run: |
F=$(ls build/ios/ipa/*.ipa 2>/dev/null | head -1)
if [ -z "$F" ]; then echo "::error::No IPA found"; exit 1; fi
echo "path=$F" >> "$GITHUB_OUTPUT"

- name: Upload to TestFlight
uses: apple-actions/upload-testflight-build@v3
with:
app-path: ${{ steps.ipa.outputs.path }}
issuer-id: ${{ vars.APPSTORE_ISSUER_ID }}
api-key-id: ${{ vars.APPSTORE_API_KEY_ID }}
api-private-key: ${{ secrets.APPSTORE_API_PRIVATE_KEY }}
19 changes: 7 additions & 12 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,26 +22,21 @@ jobs:


steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4

- name: Get version number
id: version
run: |
echo "number=$(echo '${{ github.ref }}' | cut -d '/' -f 3)" >>${GITHUB_OUTPUT}

- name: Show version number
run: |
echo ${{ steps.version.outputs.number }}
run: echo "number=${{ github.ref_name }}" >>$GITHUB_OUTPUT

- name: Create Release
id: create_release
uses: actions/create-release@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ github.ref }}
release_name: ${{ github.ref }}
tag_name: ${{ github.ref_name }}
name: ${{ github.ref_name }}
body_path: CHANGELOG.md
draft: false
prerelease: false
env:
GITHUB_TOKEN: ${{ secrets.RELEASE_TOKEN || secrets.GITHUB_TOKEN }}

2 changes: 1 addition & 1 deletion .metadata
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ migration:
- platform: root
create_revision: d7b523b356d15fb81e7d340bbe52b47f93937323
base_revision: d7b523b356d15fb81e7d340bbe52b47f93937323
- platform: ios
- platform: web
create_revision: d7b523b356d15fb81e7d340bbe52b47f93937323
base_revision: d7b523b356d15fb81e7d340bbe52b47f93937323

Expand Down
Loading
Loading