diff --git a/.github/workflows/FlutterApp.yml b/.github/workflows/FlutterApp.yml
index cfdc629..baef660 100644
--- a/.github/workflows/FlutterApp.yml
+++ b/.github/workflows/FlutterApp.yml
@@ -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 .
@@ -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
\ No newline at end of file
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
new file mode 100644
index 0000000..0ad9a1b
--- /dev/null
+++ b/.github/workflows/build.yml
@@ -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/
+
diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml
new file mode 100644
index 0000000..cd9dfe5
--- /dev/null
+++ b/.github/workflows/deploy.yml
@@ -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
+
+
+
+
+ method
+ app-store
+ teamID
+ R25XLT6Z87
+ signingStyle
+ manual
+ signingCertificate
+ iPhone Distribution
+ provisioningProfiles
+
+ eu.mobisync.syncClient
+ ${PROFILE}
+
+ uploadSymbols
+
+
+
+ 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 }}
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 9f92e19..7afe56a 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -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 }}
\ No newline at end of file
diff --git a/.metadata b/.metadata
index bad0587..e2ff7d7 100644
--- a/.metadata
+++ b/.metadata
@@ -15,7 +15,7 @@ migration:
- platform: root
create_revision: d7b523b356d15fb81e7d340bbe52b47f93937323
base_revision: d7b523b356d15fb81e7d340bbe52b47f93937323
- - platform: ios
+ - platform: web
create_revision: d7b523b356d15fb81e7d340bbe52b47f93937323
base_revision: d7b523b356d15fb81e7d340bbe52b47f93937323
diff --git a/CHANGELOG.md b/CHANGELOG.md
index ed772f8..c52a8dc 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,16 @@
An App for wireless syncing of photos and videos from devices to home server. (https://mobisync.eu)
+## 1.0.10 Release notes (2026-01-29)
+
+### Enhancements
+* iOS: deployment target set to 13.0 for pod compatibility (wakelock_plus, url_launcher_ios)
+* Android: AGP 8.9.1 and Gradle 8.11.1 for androidx deps; keystore conversion to JKS in CI
+* Added url_launcher for mobisync.eu link; branding strip below nav bar
+
+### Fixes
+* CI: Android keystore conversion with srcalias/destalias; Gradle daemon disabled in CI
+
## 1.0.9 Release notes (2024-09-02)
### Enhancements
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 89ce047..9114cd3 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -11,3 +11,29 @@
`git tag v0.0.2`
`git push --tags`
`flutter build appbundle --release`
+
+## CI builds (GitHub Actions)
+Workflow **Build (Android, iOS, Windows)** (`.github/workflows/build.yml`):
+- **Trigger:** push/PR to `main`, or manually (`workflow_dispatch`).
+- **Release builds:** Android APK, Windows exe+dll. iOS is simulator only (no release for simulator).
+- **Android** requires GitHub Secrets on every run:
+ - `ANDROID_KEYSTORE_BASE64` – keystore (.jks) as base64 (on Linux: `base64 -w0 keystore.jks`)
+ - `ANDROID_KEYSTORE_PASSWORD`, `ANDROID_KEY_ALIAS`, `ANDROID_KEY_PASSWORD`
+
+## Deploy (Google Play & App Store)
+Workflow **Deploy** (`.github/workflows/deploy.yml`):
+- **Trigger:** tag `v*` (`git tag v1.0.0` → `git push --tags`) or manually (`workflow_dispatch`).
+- On manual run: choose track (internal / alpha / beta / production), whether to deploy Android and/or iOS.
+
+### Google Play
+- **Secrets:** same as build + `GOOGLE_PLAY_CREDENTIALS` – JSON key from Google Play service account (Cloud Console → Service Accounts → Create Key → JSON). App must exist in Play Console and service account must have access.
+
+### App Store (TestFlight)
+- **Secrets:**
+ - `BUILD_CERTIFICATE_BASE64` – Apple Distribution certificate (.p12) as base64
+ - `P12_PASSWORD` – .p12 password
+ - `BUILD_PROVISION_PROFILE_BASE64` – App Store provisioning profile (.mobileprovision) as base64
+ - `APPSTORE_API_PRIVATE_KEY` – contents of .p8 key from App Store Connect API
+- **Variables:**
+ - `APPSTORE_ISSUER_ID`, `APPSTORE_API_KEY_ID` – from App Store Connect → Users and Access → Keys
+ - `IOS_PROFILE_NAME` – exact provisioning profile name for `eu.mobisync.home` (as in Developer Portal)
diff --git a/analysis_options.yaml b/analysis_options.yaml
index 4cb157c..5c58cfb 100644
--- a/analysis_options.yaml
+++ b/analysis_options.yaml
@@ -2,7 +2,7 @@ include: package:flutter_lints/flutter.yaml
linter:
rules:
- avoid_print: false # Uncomment to disable the `avoid_print` rule
+ avoid_print: false # Uncomment to disable the `avoid_print` rule
# prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule
analyzer:
diff --git a/android/app/build.gradle b/android/app/build.gradle
index 47eec7c..5a47912 100644
--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -14,7 +14,7 @@ if (localPropertiesFile.exists()) {
def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
if (flutterVersionCode == null) {
- flutterVersionCode = '110'
+ flutterVersionCode = '111'
}
def flutterVersionName = localProperties.getProperty('flutter.versionName')
@@ -30,17 +30,21 @@ if (keystorePropertiesFile.exists()) {
android {
- namespace "eu.mobisync.sync_client"
+ namespace "eu.mobisync.home"
compileSdkVersion flutter.compileSdkVersion
ndkVersion flutter.ndkVersion
+ buildFeatures {
+ buildConfig = true
+ }
+
compileOptions {
- sourceCompatibility JavaVersion.VERSION_1_8
- targetCompatibility JavaVersion.VERSION_1_8
+ sourceCompatibility JavaVersion.VERSION_17
+ targetCompatibility JavaVersion.VERSION_17
}
kotlinOptions {
- jvmTarget = '1.8'
+ jvmTarget = '17'
}
sourceSets {
@@ -49,7 +53,7 @@ android {
defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
- applicationId "eu.mobisync.sync_client"
+ applicationId "eu.mobisync.home"
// You can update the following values to match your application needs.
// For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
minSdkVersion flutter.minSdkVersion
diff --git a/android/app/release/app-release.aab b/android/app/release/app-release.aab
index 0940b64..b593cea 100644
Binary files a/android/app/release/app-release.aab and b/android/app/release/app-release.aab differ
diff --git a/android/app/release/app-release.apk b/android/app/release/app-release.apk
new file mode 100644
index 0000000..2e81e6e
Binary files /dev/null and b/android/app/release/app-release.apk differ
diff --git a/android/app/release/baselineProfiles/0/app-release.dm b/android/app/release/baselineProfiles/0/app-release.dm
new file mode 100644
index 0000000..2aa1e5c
Binary files /dev/null and b/android/app/release/baselineProfiles/0/app-release.dm differ
diff --git a/android/app/release/baselineProfiles/1/app-release.dm b/android/app/release/baselineProfiles/1/app-release.dm
new file mode 100644
index 0000000..b463063
Binary files /dev/null and b/android/app/release/baselineProfiles/1/app-release.dm differ
diff --git a/android/app/release/output-metadata.json b/android/app/release/output-metadata.json
new file mode 100644
index 0000000..f883663
--- /dev/null
+++ b/android/app/release/output-metadata.json
@@ -0,0 +1,37 @@
+{
+ "version": 3,
+ "artifactType": {
+ "type": "APK",
+ "kind": "Directory"
+ },
+ "applicationId": "eu.mobisync.sync_client",
+ "variantName": "release",
+ "elements": [
+ {
+ "type": "SINGLE",
+ "filters": [],
+ "attributes": [],
+ "versionCode": 111,
+ "versionName": "1.0.9",
+ "outputFile": "app-release.apk"
+ }
+ ],
+ "elementType": "File",
+ "baselineProfiles": [
+ {
+ "minApi": 28,
+ "maxApi": 30,
+ "baselineProfiles": [
+ "baselineProfiles/1/app-release.dm"
+ ]
+ },
+ {
+ "minApi": 31,
+ "maxApi": 2147483647,
+ "baselineProfiles": [
+ "baselineProfiles/0/app-release.dm"
+ ]
+ }
+ ],
+ "minSdkVersionForDexing": 21
+}
\ No newline at end of file
diff --git a/android/app/src/debug/AndroidManifest.xml b/android/app/src/debug/AndroidManifest.xml
index ae11ff3..7856257 100644
--- a/android/app/src/debug/AndroidManifest.xml
+++ b/android/app/src/debug/AndroidManifest.xml
@@ -4,13 +4,13 @@
-
-
+
+
-
+ android:requestLegacyExternalStorage="true">
+
diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index eb22c8e..0a1a1d3 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -1,6 +1,6 @@
@@ -30,9 +30,8 @@
-
-
-
+
+
diff --git a/android/app/src/main/kotlin/com/example/sync_client/MainActivity.kt b/android/app/src/main/kotlin/eu/mobisync/home/MainActivity.kt
similarity index 75%
rename from android/app/src/main/kotlin/com/example/sync_client/MainActivity.kt
rename to android/app/src/main/kotlin/eu/mobisync/home/MainActivity.kt
index e577b15..63306e2 100644
--- a/android/app/src/main/kotlin/com/example/sync_client/MainActivity.kt
+++ b/android/app/src/main/kotlin/eu/mobisync/home/MainActivity.kt
@@ -1,4 +1,4 @@
-package eu.mobisync.sync_client
+package eu.mobisync.home
import io.flutter.embedding.android.FlutterActivity
diff --git a/android/app/src/profile/AndroidManifest.xml b/android/app/src/profile/AndroidManifest.xml
index 76034cc..f629628 100644
--- a/android/app/src/profile/AndroidManifest.xml
+++ b/android/app/src/profile/AndroidManifest.xml
@@ -4,14 +4,14 @@
-
-
+
+
-
+ android:requestLegacyExternalStorage="true">
+
diff --git a/android/build.gradle b/android/build.gradle
index 1e73c4f..e7c733a 100644
--- a/android/build.gradle
+++ b/android/build.gradle
@@ -14,6 +14,35 @@ subprojects {
project.evaluationDependsOn(':app')
}
+subprojects { subproject ->
+ subproject.plugins.withId('com.android.library') {
+ subproject.android {
+ if (namespace == null) {
+ def manifest = file("${subproject.projectDir}/src/main/AndroidManifest.xml")
+ if (manifest.exists()) {
+ def parsed = new XmlParser().parse(manifest)
+ if (parsed.@package) {
+ namespace = parsed.@package
+ }
+ }
+ }
+ }
+ }
+
+ // Force Java 17 on all Java compile tasks
+ subproject.tasks.withType(JavaCompile).configureEach {
+ sourceCompatibility = JavaVersion.VERSION_17
+ targetCompatibility = JavaVersion.VERSION_17
+ }
+
+ // Force Kotlin JVM 17 on all Kotlin compile tasks
+ subproject.tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach {
+ compilerOptions {
+ jvmTarget.set(org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_17)
+ }
+ }
+}
+
tasks.register("clean", Delete) {
delete rootProject.buildDir
}
diff --git a/android/gradle.properties b/android/gradle.properties
index b9a9a24..0ed393d 100644
--- a/android/gradle.properties
+++ b/android/gradle.properties
@@ -1,6 +1,8 @@
-org.gradle.jvmargs=-Xmx1536M
+org.gradle.jvmargs=-Xmx4096M -XX:+HeapDumpOnOutOfMemoryError
+org.gradle.daemon=false
+org.gradle.caching=true
android.useAndroidX=true
-android.enableJetifier=true
-android.defaults.buildfeatures.buildconfig=true
+android.enableJetifier=false
android.nonTransitiveRClass=false
android.nonFinalResIds=false
+kotlin.jvm.target.validation.mode=IGNORE
diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties
index 3c85cfe..efdcc4a 100644
--- a/android/gradle/wrapper/gradle-wrapper.properties
+++ b/android/gradle/wrapper/gradle-wrapper.properties
@@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-all.zip
diff --git a/android/settings.gradle b/android/settings.gradle
index 76f86c8..034d0e0 100644
--- a/android/settings.gradle
+++ b/android/settings.gradle
@@ -14,12 +14,19 @@ pluginManagement {
mavenCentral()
gradlePluginPortal()
}
+ resolutionStrategy {
+ eachPlugin { details ->
+ if (details.requested.id.namespace == "com.android" && details.requested.id.name == "application") {
+ details.useVersion("8.9.1")
+ }
+ }
+ }
}
plugins {
id "dev.flutter.flutter-plugin-loader" version "1.0.0"
- id "com.android.application" version '8.5.0' apply false
- id "org.jetbrains.kotlin.android" version "1.9.23" apply false
+ id "com.android.application" version '8.9.1' apply false
+ id "org.jetbrains.kotlin.android" version "2.2.0" apply false
}
include ":app"
\ No newline at end of file
diff --git a/docs/AUTH_DESIGN.md b/docs/AUTH_DESIGN.md
new file mode 100644
index 0000000..faa1019
--- /dev/null
+++ b/docs/AUTH_DESIGN.md
@@ -0,0 +1,60 @@
+# Design: Login and security in the app
+
+## Requirements
+
+1. **App login** – one or both of:
+ - **Username + password** – server validates against local SQLite DB.
+ - **Google account** – sign in with Google Sign-In; server accepts Google ID token and creates/links user.
+
+2. **Device password** – stored **securely** on device (not in plain JSON):
+ - Use **flutter_secure_storage** (or similar) for session token / credentials.
+ - On app launch – if a valid token exists in secure storage, user stays "logged in" without re-entering password.
+
+3. **On delete / dangerous actions** – additional confirmation required:
+ - **Biometrics** (fingerprint, face) – via **local_auth**.
+ - Or **PIN** – set by user in settings; for "Delete all", "Empty trash", bulk "Move to Trash" – show biometric or PIN entry screen first.
+
+---
+
+## Components
+
+### Server (sync_server)
+
+- **SQLite DB** – `users` table (username, password_hash).
+- **POST /auth/login** – `{ "User": "", "Password": "" }` → on success returns `{ "Token": "..." }` (JWT or random token stored in DB).
+- **POST /auth/register** – creates user (optional, if registration is enabled).
+- **Dangerous endpoints** (`/delete-all`, `/empty-trash`) – require `Authorization: Bearer ` header or password in body; server verifies token/password before execution.
+- **POST /auth/google** (phase 2) – accepts Google ID token, validates it, creates/returns session token.
+
+### Client (sync_client)
+
+- **Secure storage** – `flutter_secure_storage` for:
+ - `auth_token` – after successful login/Google sign-in.
+ - Optionally: do not store password in plain text in DeviceSettings; token only.
+- **Login screen** – current (email + password) + "Sign in with Google" button (phase 2).
+ - On successful login – store token in secure storage and state (currentUser + token).
+- **On startup** – read token from secure storage; if valid token → auto login (no login screen).
+- **API requests** – all requests to server include `Authorization: Bearer ` (when token exists).
+- **Dangerous actions** – before calling `apiDeleteAllFiles` / `apiEmptyTrash` / bulk "Move to Trash":
+ - Show dialog: "Confirm with biometrics or PIN".
+ - **local_auth**: `authenticate()` – on success proceed with request.
+ - If biometrics unavailable or user chooses PIN – show PIN entry screen (PIN stored in secure storage when first set in settings).
+
+### PIN
+
+- In **Settings / Account** – option "Set PIN for delete confirmation".
+- PIN stored only in **secure storage** (hashed or encrypted).
+- On first "Delete all" / "Empty trash" – if no PIN set, prompt user to set PIN or use biometrics only.
+
+---
+
+## Implementation phases
+
+| Phase | Description |
+|-------|-------------|
+| **1** | Server: SQLite auth DB + `/auth/login` + protect `/delete-all` and `/empty-trash` with password or token. Client: store token in secure storage, send in requests; before delete/empty-trash – require biometrics (local_auth). |
+| **2** | Client: PIN option in settings; for dangerous actions – biometrics or PIN entry. |
+| **3** | Google sign-in: button on login screen, `google_sign_in`, server endpoint `/auth/google`. |
+| **4** | Remove password from DeviceSettings (plain text); token only in secure storage. |
+
+This document describes the overall design; concrete implementation follows these phases.
diff --git a/docs/icon-arrow-alternatives.md b/docs/icon-arrow-alternatives.md
new file mode 100644
index 0000000..4a541f1
--- /dev/null
+++ b/docs/icon-arrow-alternatives.md
@@ -0,0 +1,41 @@
+# Rounded arrow alternatives for the app icon
+
+The current icon uses **rounded ends** (small circles at the arrow tips) for a softer “round arrow” look. Here are other options you could use:
+
+---
+
+## 1. **Current: Round ends (circles)** ✓
+- Thick curved arcs (orange + blue) with **small circles** at the tips instead of sharp arrowheads.
+- Soft, friendly, clearly “round arrows”.
+
+---
+
+## 2. **Sharp arrowheads (original)**
+- Same arcs with **triangular arrowheads** at the ends.
+- More classic sync/transfer look. To revert: replace the circle paths with triangles (e.g. `M88,73 L82,82 L92,76 Z` for orange, `M20,35 L26,26 L16,32 Z` for blue).
+
+---
+
+## 3. **Single circular refresh arrow**
+- One continuous **ring** with two arrowheads 180° apart (half orange, half blue).
+- Very “sync/refresh” style, minimal.
+
+---
+
+## 4. **Oval / softer arc**
+- Same two arrows but drawn along a **more oval path** (e.g. wider horizontally).
+- Feels rounder and a bit more organic.
+
+---
+
+## 5. **Rounded (blunt) arrowheads**
+- Keep the arcs, but use **short, blunt triangles** (wider, less pointy) at the ends.
+- Still reads as arrows but softer than sharp points.
+
+---
+
+## 6. **Double-line (outline) arrows**
+- **Stroked** circular arcs instead of filled thick bands, with round line caps.
+- Lighter, more “line art” look; needs stroke in the vector/SVG.
+
+If you want to try one of these, say which number (or combination) and we can adapt the icon files.
diff --git a/integration_test/app_test.dart b/integration_test/app_test.dart
deleted file mode 100644
index 8085ec1..0000000
--- a/integration_test/app_test.dart
+++ /dev/null
@@ -1,18 +0,0 @@
-import 'package:flutter_test/flutter_test.dart';
-import 'package:integration_test/integration_test.dart';
-
-void main() {
- IntegrationTestWidgetsFlutterBinding.ensureInitialized();
-
- group('end-to-end test', () {
- testWidgets('Login form', (WidgetTester tester) async {
- //app.main();
- // await tester.pumpAndSettle();
- // expect(find.byKey(Key('username')), findsOneWidget);
- // expect(find.byKey(Key('password')), findsOneWidget);
-
- // await tester.tap(find.text("Login"));
- await tester.pump();
- });
- });
-}
diff --git a/ios/.gitignore b/ios/.gitignore
index 7a7f987..a056504 100644
--- a/ios/.gitignore
+++ b/ios/.gitignore
@@ -26,6 +26,7 @@ Flutter/flutter_assets/
Flutter/flutter_export_environment.sh
ServiceDefinitions.json
Runner/GeneratedPluginRegistrant.*
+ExportOptions.plist
# Exceptions to above rules.
!default.mode1v3
diff --git a/ios/Podfile b/ios/Podfile
index e549ee2..73d040c 100644
--- a/ios/Podfile
+++ b/ios/Podfile
@@ -1,5 +1,5 @@
-# Uncomment this line to define a global platform for your project
-# platform :ios, '12.0'
+# Minimum iOS version for url_launcher_ios, wakelock_plus and other plugins
+platform :ios, '13.0'
# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
ENV['COCOAPODS_DISABLE_STATS'] = 'true'
@@ -29,6 +29,7 @@ flutter_ios_podfile_setup
target 'Runner' do
use_frameworks!
+ platform :ios, '13.0'
flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
target 'RunnerTests' do
@@ -39,5 +40,8 @@ end
post_install do |installer|
installer.pods_project.targets.each do |target|
flutter_additional_ios_build_settings(target)
+ target.build_configurations.each do |config|
+ config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '13.0'
+ end
end
end
diff --git a/ios/Podfile.lock b/ios/Podfile.lock
index 9215cdc..e3b7e0f 100644
--- a/ios/Podfile.lock
+++ b/ios/Podfile.lock
@@ -34,8 +34,6 @@ PODS:
- DKImagePickerController/PhotoGallery
- Flutter
- Flutter (1.0.0)
- - integration_test (0.0.1):
- - Flutter
- path_provider_foundation (0.0.1):
- Flutter
- FlutterMacOS
@@ -44,14 +42,24 @@ PODS:
- SDWebImage (5.19.4):
- SDWebImage/Core (= 5.19.4)
- SDWebImage/Core (5.19.4)
+ - share_plus (0.0.1):
+ - Flutter
+ - shared_preferences_foundation (0.0.1):
+ - Flutter
+ - FlutterMacOS
+ - sqflite_darwin (0.0.4):
+ - Flutter
+ - FlutterMacOS
- SwiftyGif (5.4.5)
DEPENDENCIES:
- file_picker (from `.symlinks/plugins/file_picker/ios`)
- Flutter (from `Flutter`)
- - integration_test (from `.symlinks/plugins/integration_test/ios`)
- path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`)
- permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`)
+ - share_plus (from `.symlinks/plugins/share_plus/ios`)
+ - shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`)
+ - sqflite_darwin (from `.symlinks/plugins/sqflite_darwin/darwin`)
SPEC REPOS:
trunk:
@@ -65,22 +73,28 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/file_picker/ios"
Flutter:
:path: Flutter
- integration_test:
- :path: ".symlinks/plugins/integration_test/ios"
path_provider_foundation:
:path: ".symlinks/plugins/path_provider_foundation/darwin"
permission_handler_apple:
:path: ".symlinks/plugins/permission_handler_apple/ios"
+ share_plus:
+ :path: ".symlinks/plugins/share_plus/ios"
+ shared_preferences_foundation:
+ :path: ".symlinks/plugins/shared_preferences_foundation/darwin"
+ sqflite_darwin:
+ :path: ".symlinks/plugins/sqflite_darwin/darwin"
SPEC CHECKSUMS:
DKImagePickerController: 946cec48c7873164274ecc4624d19e3da4c1ef3c
DKPhotoGallery: b3834fecb755ee09a593d7c9e389d8b5d6deed60
file_picker: b159e0c068aef54932bb15dc9fd1571818edaf49
Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7
- integration_test: 252f60fa39af5e17c3aa9899d35d908a0721b573
path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46
permission_handler_apple: 9878588469a2b0d0fc1e048d9f43605f92e6cec2
SDWebImage: 066c47b573f408f18caa467d71deace7c0f8280d
+ share_plus: 8b6f8b3447e494cca5317c8c3073de39b3600d1f
+ shared_preferences_foundation: fcdcbc04712aee1108ac7fda236f363274528f78
+ sqflite_darwin: 5a7236e3b501866c1c9befc6771dfd73ffb8702d
SwiftyGif: 706c60cf65fa2bc5ee0313beece843c8eb8194d4
PODFILE CHECKSUM: 4305caec6b40dde0ae97be1573c53de1882a07e5
diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj
index cc658ca..43ec839 100644
--- a/ios/Runner.xcodeproj/project.pbxproj
+++ b/ios/Runner.xcodeproj/project.pbxproj
@@ -316,10 +316,14 @@
inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist",
);
+ inputPaths = (
+ );
name = "[CP] Copy Pods Resources";
outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist",
);
+ outputPaths = (
+ );
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n";
@@ -333,10 +337,14 @@
inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
);
+ inputPaths = (
+ );
name = "[CP] Embed Pods Frameworks";
outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
);
+ outputPaths = (
+ );
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
@@ -494,11 +502,12 @@
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = R25XLT6Z87;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
+ IPHONEOS_DEPLOYMENT_TARGET = 11;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
- PRODUCT_BUNDLE_IDENTIFIER = eu.mobisync.syncClient;
+ PRODUCT_BUNDLE_IDENTIFIER = eu.mobisync.home;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = MobiSync_App_Store_Profile2026;
@@ -517,7 +526,7 @@
CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
- PRODUCT_BUNDLE_IDENTIFIER = eu.mobisync.syncClient.RunnerTests;
+ PRODUCT_BUNDLE_IDENTIFIER = eu.mobisync.home.RunnerTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
@@ -535,7 +544,7 @@
CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
- PRODUCT_BUNDLE_IDENTIFIER = eu.mobisync.syncClient.RunnerTests;
+ PRODUCT_BUNDLE_IDENTIFIER = eu.mobisync.home.RunnerTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
@@ -551,7 +560,7 @@
CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
- PRODUCT_BUNDLE_IDENTIFIER = eu.mobisync.syncClient.RunnerTests;
+ PRODUCT_BUNDLE_IDENTIFIER = eu.mobisync.home.RunnerTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
@@ -679,11 +688,12 @@
DEVELOPMENT_TEAM = R25XLT6Z87;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
+ IPHONEOS_DEPLOYMENT_TARGET = 11;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
- PRODUCT_BUNDLE_IDENTIFIER = eu.mobisync.syncClient;
+ PRODUCT_BUNDLE_IDENTIFIER = eu.mobisync.home;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
@@ -702,11 +712,12 @@
DEVELOPMENT_TEAM = R25XLT6Z87;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
+ IPHONEOS_DEPLOYMENT_TARGET = 11;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
- PRODUCT_BUNDLE_IDENTIFIER = eu.mobisync.syncClient;
+ PRODUCT_BUNDLE_IDENTIFIER = eu.mobisync.home;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist
index 7655d80..934aa6e 100644
--- a/ios/Runner/Info.plist
+++ b/ios/Runner/Info.plist
@@ -7,7 +7,7 @@
CFBundleDevelopmentRegion
$(DEVELOPMENT_LANGUAGE)
CFBundleDisplayName
- Sync Client
+ SpaceItMobiSync
CFBundleExecutable
$(EXECUTABLE_NAME)
CFBundleIdentifier
@@ -15,7 +15,7 @@
CFBundleInfoDictionaryVersion
6.0
CFBundleName
- sync_client
+ SpaceItMobiSync
CFBundlePackageType
APPL
CFBundleShortVersionString
@@ -30,6 +30,8 @@
NSPhotoLibraryUsageDescription
Syncing photos and videos to your home server requires permissions to your files.
+ NSPhotoLibraryAddUsageDescription
+ Save downloaded photos to your photo library.
UIApplicationSupportsIndirectInputEvents
UILaunchScreen
@@ -38,6 +40,15 @@
LaunchScreen.storyboard
UIRequiresFullScreen
+
+ UISupportsDocumentBrowser
+
+ LSSupportsOpeningDocumentsInPlace
+
+
+
+ UIFileSharingEnabled
+
UISupportedInterfaceOrientations
UIInterfaceOrientationPortrait
diff --git a/ios_backup/.gitignore b/ios_backup/.gitignore
deleted file mode 100644
index 7a7f987..0000000
--- a/ios_backup/.gitignore
+++ /dev/null
@@ -1,34 +0,0 @@
-**/dgph
-*.mode1v3
-*.mode2v3
-*.moved-aside
-*.pbxuser
-*.perspectivev3
-**/*sync/
-.sconsign.dblite
-.tags*
-**/.vagrant/
-**/DerivedData/
-Icon?
-**/Pods/
-**/.symlinks/
-profile
-xcuserdata
-**/.generated/
-Flutter/App.framework
-Flutter/Flutter.framework
-Flutter/Flutter.podspec
-Flutter/Generated.xcconfig
-Flutter/ephemeral/
-Flutter/app.flx
-Flutter/app.zip
-Flutter/flutter_assets/
-Flutter/flutter_export_environment.sh
-ServiceDefinitions.json
-Runner/GeneratedPluginRegistrant.*
-
-# Exceptions to above rules.
-!default.mode1v3
-!default.mode2v3
-!default.pbxuser
-!default.perspectivev3
diff --git a/ios_backup/Flutter/AppFrameworkInfo.plist b/ios_backup/Flutter/AppFrameworkInfo.plist
deleted file mode 100644
index 7c56964..0000000
--- a/ios_backup/Flutter/AppFrameworkInfo.plist
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-
-
- CFBundleDevelopmentRegion
- en
- CFBundleExecutable
- App
- CFBundleIdentifier
- io.flutter.flutter.app
- CFBundleInfoDictionaryVersion
- 6.0
- CFBundleName
- App
- CFBundlePackageType
- FMWK
- CFBundleShortVersionString
- 1.0
- CFBundleSignature
- ????
- CFBundleVersion
- 1.0
- MinimumOSVersion
- 12.0
-
-
diff --git a/ios_backup/Flutter/Debug.xcconfig b/ios_backup/Flutter/Debug.xcconfig
deleted file mode 100644
index ec97fc6..0000000
--- a/ios_backup/Flutter/Debug.xcconfig
+++ /dev/null
@@ -1,2 +0,0 @@
-#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
-#include "Generated.xcconfig"
diff --git a/ios_backup/Flutter/Release.xcconfig b/ios_backup/Flutter/Release.xcconfig
deleted file mode 100644
index c4855bf..0000000
--- a/ios_backup/Flutter/Release.xcconfig
+++ /dev/null
@@ -1,2 +0,0 @@
-#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
-#include "Generated.xcconfig"
diff --git a/ios_backup/Podfile b/ios_backup/Podfile
deleted file mode 100644
index d97f17e..0000000
--- a/ios_backup/Podfile
+++ /dev/null
@@ -1,44 +0,0 @@
-# Uncomment this line to define a global platform for your project
-# platform :ios, '12.0'
-
-# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
-ENV['COCOAPODS_DISABLE_STATS'] = 'true'
-
-project 'Runner', {
- 'Debug' => :debug,
- 'Profile' => :release,
- 'Release' => :release,
-}
-
-def flutter_root
- generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__)
- unless File.exist?(generated_xcode_build_settings_path)
- raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first"
- end
-
- File.foreach(generated_xcode_build_settings_path) do |line|
- matches = line.match(/FLUTTER_ROOT\=(.*)/)
- return matches[1].strip if matches
- end
- raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get"
-end
-
-require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)
-
-flutter_ios_podfile_setup
-
-target 'Runner' do
- use_frameworks!
- use_modular_headers!
-
- flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
- target 'RunnerTests' do
- inherit! :search_paths
- end
-end
-
-post_install do |installer|
- installer.pods_project.targets.each do |target|
- flutter_additional_ios_build_settings(target)
- end
-end
diff --git a/ios_backup/Runner.xcodeproj/project.pbxproj b/ios_backup/Runner.xcodeproj/project.pbxproj
deleted file mode 100644
index 016765c..0000000
--- a/ios_backup/Runner.xcodeproj/project.pbxproj
+++ /dev/null
@@ -1,784 +0,0 @@
-// !$*UTF8*$!
-{
- archiveVersion = 1;
- classes = {
- };
- objectVersion = 77;
- objects = {
-
-/* Begin PBXBuildFile section */
- 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
- 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; };
- 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
- 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
- 79C02782CC4C4658ED480B0F /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 88F75A3CFE75ABA6A65DA9A0 /* Pods_Runner.framework */; };
- 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
- 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
- 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
- FF0FECB669E94892BF1B1C02 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B2F25154FEEB43DE15049B14 /* Pods_RunnerTests.framework */; };
-/* End PBXBuildFile section */
-
-/* Begin PBXContainerItemProxy section */
- 331C8085294A63A400263BE5 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 97C146E61CF9000F007C117D /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 97C146ED1CF9000F007C117D;
- remoteInfo = Runner;
- };
-/* End PBXContainerItemProxy section */
-
-/* Begin PBXCopyFilesBuildPhase section */
- 9705A1C41CF9048500538489 /* Embed Frameworks */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- );
- name = "Embed Frameworks";
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXCopyFilesBuildPhase section */
-
-/* Begin PBXFileReference section */
- 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; };
- 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; };
- 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; };
- 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
- 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; };
- 5AAF8B26ADDCBAC42F0F9702 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; };
- 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; };
- 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
- 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; };
- 88F75A3CFE75ABA6A65DA9A0 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
- 93C3C8DDEBA7505777ACE106 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; };
- 95DE71F53682F9F89A3AFCEE /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; };
- 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; };
- 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; };
- 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
- 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
- 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
- 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
- 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
- A07ECB11F51219881AD6652F /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; };
- B2F25154FEEB43DE15049B14 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
- CD447BE506F8D948D0CE3D6E /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; };
- DF24105E66062229FAC6EFEA /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; };
- F2416B472C59970B00197D8A /* RunnerRelease.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = RunnerRelease.entitlements; sourceTree = ""; };
- F2416B482C59971600197D8A /* RunnerProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = RunnerProfile.entitlements; sourceTree = ""; };
-/* End PBXFileReference section */
-
-/* Begin PBXFrameworksBuildPhase section */
- 577EE3DDA5F715628AEC013D /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- FF0FECB669E94892BF1B1C02 /* Pods_RunnerTests.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 97C146EB1CF9000F007C117D /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 79C02782CC4C4658ED480B0F /* Pods_Runner.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXFrameworksBuildPhase section */
-
-/* Begin PBXGroup section */
- 331C8082294A63A400263BE5 /* RunnerTests */ = {
- isa = PBXGroup;
- children = (
- 331C807B294A618700263BE5 /* RunnerTests.swift */,
- );
- path = RunnerTests;
- sourceTree = "";
- };
- 9740EEB11CF90186004384FC /* Flutter */ = {
- isa = PBXGroup;
- children = (
- 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,
- 9740EEB21CF90195004384FC /* Debug.xcconfig */,
- 7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
- 9740EEB31CF90195004384FC /* Generated.xcconfig */,
- );
- name = Flutter;
- sourceTree = "";
- };
- 97C146E51CF9000F007C117D = {
- isa = PBXGroup;
- children = (
- 9740EEB11CF90186004384FC /* Flutter */,
- 97C146F01CF9000F007C117D /* Runner */,
- 97C146EF1CF9000F007C117D /* Products */,
- 331C8082294A63A400263BE5 /* RunnerTests */,
- C458B3ABB921182D55CCE54F /* Pods */,
- E5475E869E537D6A55AA694C /* Frameworks */,
- );
- sourceTree = "";
- };
- 97C146EF1CF9000F007C117D /* Products */ = {
- isa = PBXGroup;
- children = (
- 97C146EE1CF9000F007C117D /* Runner.app */,
- 331C8081294A63A400263BE5 /* RunnerTests.xctest */,
- );
- name = Products;
- sourceTree = "";
- };
- 97C146F01CF9000F007C117D /* Runner */ = {
- isa = PBXGroup;
- children = (
- F2416B482C59971600197D8A /* RunnerProfile.entitlements */,
- F2416B472C59970B00197D8A /* RunnerRelease.entitlements */,
- 97C146FA1CF9000F007C117D /* Main.storyboard */,
- 97C146FD1CF9000F007C117D /* Assets.xcassets */,
- 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,
- 97C147021CF9000F007C117D /* Info.plist */,
- 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,
- 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,
- 74858FAE1ED2DC5600515810 /* AppDelegate.swift */,
- 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */,
- );
- path = Runner;
- sourceTree = "";
- };
- C458B3ABB921182D55CCE54F /* Pods */ = {
- isa = PBXGroup;
- children = (
- CD447BE506F8D948D0CE3D6E /* Pods-Runner.debug.xcconfig */,
- A07ECB11F51219881AD6652F /* Pods-Runner.release.xcconfig */,
- 93C3C8DDEBA7505777ACE106 /* Pods-Runner.profile.xcconfig */,
- 5AAF8B26ADDCBAC42F0F9702 /* Pods-RunnerTests.debug.xcconfig */,
- 95DE71F53682F9F89A3AFCEE /* Pods-RunnerTests.release.xcconfig */,
- DF24105E66062229FAC6EFEA /* Pods-RunnerTests.profile.xcconfig */,
- );
- path = Pods;
- sourceTree = "";
- };
- E5475E869E537D6A55AA694C /* Frameworks */ = {
- isa = PBXGroup;
- children = (
- 88F75A3CFE75ABA6A65DA9A0 /* Pods_Runner.framework */,
- B2F25154FEEB43DE15049B14 /* Pods_RunnerTests.framework */,
- );
- name = Frameworks;
- sourceTree = "";
- };
-/* End PBXGroup section */
-
-/* Begin PBXNativeTarget section */
- 331C8080294A63A400263BE5 /* RunnerTests */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */;
- buildPhases = (
- 90F19B15B8F6D0876EF9527D /* [CP] Check Pods Manifest.lock */,
- 331C807D294A63A400263BE5 /* Sources */,
- 331C807F294A63A400263BE5 /* Resources */,
- 577EE3DDA5F715628AEC013D /* Frameworks */,
- );
- buildRules = (
- );
- dependencies = (
- 331C8086294A63A400263BE5 /* PBXTargetDependency */,
- );
- name = RunnerTests;
- productName = RunnerTests;
- productReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */;
- productType = "com.apple.product-type.bundle.unit-test";
- };
- 97C146ED1CF9000F007C117D /* Runner */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
- buildPhases = (
- AE6492A4AA1B5F56C209CAE8 /* [CP] Check Pods Manifest.lock */,
- 9740EEB61CF901F6004384FC /* Run Script */,
- 97C146EA1CF9000F007C117D /* Sources */,
- 97C146EB1CF9000F007C117D /* Frameworks */,
- 97C146EC1CF9000F007C117D /* Resources */,
- 9705A1C41CF9048500538489 /* Embed Frameworks */,
- 3B06AD1E1E4923F5004D2608 /* Thin Binary */,
- AB4A1C9D17F53530E63C820A /* [CP] Embed Pods Frameworks */,
- 09B0034E148CBA82C4B6B4B9 /* [CP] Copy Pods Resources */,
- );
- buildRules = (
- );
- dependencies = (
- );
- name = Runner;
- productName = Runner;
- productReference = 97C146EE1CF9000F007C117D /* Runner.app */;
- productType = "com.apple.product-type.application";
- };
-/* End PBXNativeTarget section */
-
-/* Begin PBXProject section */
- 97C146E61CF9000F007C117D /* Project object */ = {
- isa = PBXProject;
- attributes = {
- BuildIndependentTargetsInParallel = YES;
- LastUpgradeCheck = 1510;
- ORGANIZATIONNAME = "";
- TargetAttributes = {
- 331C8080294A63A400263BE5 = {
- CreatedOnToolsVersion = 14.0;
- TestTargetID = 97C146ED1CF9000F007C117D;
- };
- 97C146ED1CF9000F007C117D = {
- CreatedOnToolsVersion = 7.3.1;
- LastSwiftMigration = 1100;
- };
- };
- };
- buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */;
- developmentRegion = en;
- hasScannedForEncodings = 0;
- knownRegions = (
- en,
- Base,
- );
- mainGroup = 97C146E51CF9000F007C117D;
- preferredProjectObjectVersion = 77;
- productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
- projectDirPath = "";
- projectRoot = "";
- targets = (
- 97C146ED1CF9000F007C117D /* Runner */,
- 331C8080294A63A400263BE5 /* RunnerTests */,
- );
- };
-/* End PBXProject section */
-
-/* Begin PBXResourcesBuildPhase section */
- 331C807F294A63A400263BE5 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 97C146EC1CF9000F007C117D /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,
- 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
- 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
- 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXResourcesBuildPhase section */
-
-/* Begin PBXShellScriptBuildPhase section */
- 09B0034E148CBA82C4B6B4B9 /* [CP] Copy Pods Resources */ = {
- isa = PBXShellScriptBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- inputFileListPaths = (
- "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist",
- );
- inputPaths = (
- );
- name = "[CP] Copy Pods Resources";
- outputFileListPaths = (
- "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist",
- );
- outputPaths = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- shellPath = /bin/sh;
- shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n";
- showEnvVarsInLog = 0;
- };
- 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
- isa = PBXShellScriptBuildPhase;
- alwaysOutOfDate = 1;
- buildActionMask = 2147483647;
- files = (
- );
- inputPaths = (
- "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}",
- );
- name = "Thin Binary";
- outputPaths = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- shellPath = /bin/sh;
- shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin\n";
- };
- 90F19B15B8F6D0876EF9527D /* [CP] Check Pods Manifest.lock */ = {
- isa = PBXShellScriptBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- inputPaths = (
- "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
- "${PODS_ROOT}/Manifest.lock",
- );
- name = "[CP] Check Pods Manifest.lock";
- outputPaths = (
- "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt",
- );
- runOnlyForDeploymentPostprocessing = 0;
- shellPath = /bin/sh;
- shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n\n";
- showEnvVarsInLog = 0;
- };
- 9740EEB61CF901F6004384FC /* Run Script */ = {
- isa = PBXShellScriptBuildPhase;
- alwaysOutOfDate = 1;
- buildActionMask = 2147483647;
- files = (
- );
- inputPaths = (
- );
- name = "Run Script";
- outputPaths = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- shellPath = /bin/sh;
- shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build\n";
- };
- AB4A1C9D17F53530E63C820A /* [CP] Embed Pods Frameworks */ = {
- isa = PBXShellScriptBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- inputFileListPaths = (
- "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
- );
- inputPaths = (
- );
- name = "[CP] Embed Pods Frameworks";
- outputFileListPaths = (
- "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
- );
- outputPaths = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- shellPath = /bin/sh;
- shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n\n";
- showEnvVarsInLog = 0;
- };
- AE6492A4AA1B5F56C209CAE8 /* [CP] Check Pods Manifest.lock */ = {
- isa = PBXShellScriptBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- inputPaths = (
- "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
- "${PODS_ROOT}/Manifest.lock",
- );
- name = "[CP] Check Pods Manifest.lock";
- outputPaths = (
- "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
- );
- runOnlyForDeploymentPostprocessing = 0;
- shellPath = /bin/sh;
- shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n\n";
- showEnvVarsInLog = 0;
- };
-/* End PBXShellScriptBuildPhase section */
-
-/* Begin PBXSourcesBuildPhase section */
- 331C807D294A63A400263BE5 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 97C146EA1CF9000F007C117D /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,
- 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXSourcesBuildPhase section */
-
-/* Begin PBXTargetDependency section */
- 331C8086294A63A400263BE5 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 97C146ED1CF9000F007C117D /* Runner */;
- targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */;
- };
-/* End PBXTargetDependency section */
-
-/* Begin PBXVariantGroup section */
- 97C146FA1CF9000F007C117D /* Main.storyboard */ = {
- isa = PBXVariantGroup;
- children = (
- 97C146FB1CF9000F007C117D /* Base */,
- );
- name = Main.storyboard;
- sourceTree = "";
- };
- 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = {
- isa = PBXVariantGroup;
- children = (
- 97C147001CF9000F007C117D /* Base */,
- );
- name = LaunchScreen.storyboard;
- sourceTree = "";
- };
-/* End PBXVariantGroup section */
-
-/* Begin XCBuildConfiguration section */
- 249021D3217E4FDB00AE95B9 /* Profile */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- CLANG_ANALYZER_NONNULL = YES;
- CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
- CLANG_CXX_LIBRARY = "libc++";
- CLANG_ENABLE_MODULES = YES;
- CLANG_ENABLE_OBJC_ARC = YES;
- CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
- CLANG_WARN_BOOL_CONVERSION = YES;
- CLANG_WARN_COMMA = YES;
- CLANG_WARN_CONSTANT_CONVERSION = YES;
- CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
- CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
- CLANG_WARN_EMPTY_BODY = YES;
- CLANG_WARN_ENUM_CONVERSION = YES;
- CLANG_WARN_INFINITE_RECURSION = YES;
- CLANG_WARN_INT_CONVERSION = YES;
- CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
- CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
- CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
- CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
- CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
- CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
- CLANG_WARN_STRICT_PROTOTYPES = YES;
- CLANG_WARN_SUSPICIOUS_MOVE = YES;
- CLANG_WARN_UNREACHABLE_CODE = YES;
- CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
- "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
- COPY_PHASE_STRIP = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- ENABLE_NS_ASSERTIONS = NO;
- ENABLE_STRICT_OBJC_MSGSEND = YES;
- ENABLE_USER_SCRIPT_SANDBOXING = NO;
- GCC_C_LANGUAGE_STANDARD = gnu99;
- GCC_NO_COMMON_BLOCKS = YES;
- GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
- GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
- GCC_WARN_UNDECLARED_SELECTOR = YES;
- GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
- GCC_WARN_UNUSED_FUNCTION = YES;
- GCC_WARN_UNUSED_VARIABLE = YES;
- IPHONEOS_DEPLOYMENT_TARGET = 12.0;
- MTL_ENABLE_DEBUG_INFO = NO;
- SDKROOT = iphoneos;
- SUPPORTED_PLATFORMS = iphoneos;
- TARGETED_DEVICE_FAMILY = "1,2";
- VALIDATE_PRODUCT = YES;
- };
- name = Profile;
- };
- 249021D4217E4FDB00AE95B9 /* Profile */ = {
- isa = XCBuildConfiguration;
- baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
- buildSettings = {
- ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
- ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES;
- CLANG_ENABLE_MODULES = YES;
- CODE_SIGN_ENTITLEMENTS = Runner/RunnerProfile.entitlements;
- CODE_SIGN_IDENTITY = "Apple Development";
- "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
- CODE_SIGN_STYLE = Manual;
- CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
- DEVELOPMENT_TEAM = "";
- "DEVELOPMENT_TEAM[sdk=iphoneos*]" = R25XLT6Z87;
- ENABLE_BITCODE = NO;
- INFOPLIST_FILE = Runner/Info.plist;
- INFOPLIST_KEY_CFBundleDisplayName = "Mobi Sync Client";
- INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.photography";
- LD_RUNPATH_SEARCH_PATHS = (
- "$(inherited)",
- "@executable_path/Frameworks",
- );
- MARKETING_VERSION = 1.0.4;
- PRODUCT_BUNDLE_IDENTIFIER = eu.mobisync.client;
- PRODUCT_NAME = "$(TARGET_NAME)";
- PROVISIONING_PROFILE_SPECIFIER = "";
- "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = MobiSync_App_Store_Profile2026;
- SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
- SWIFT_VERSION = 5.0;
- VERSIONING_SYSTEM = "apple-generic";
- };
- name = Profile;
- };
- 331C8088294A63A400263BE5 /* Debug */ = {
- isa = XCBuildConfiguration;
- baseConfigurationReference = 5AAF8B26ADDCBAC42F0F9702 /* Pods-RunnerTests.debug.xcconfig */;
- buildSettings = {
- BUNDLE_LOADER = "$(TEST_HOST)";
- CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 1;
- GENERATE_INFOPLIST_FILE = YES;
- MARKETING_VERSION = 1.0;
- PRODUCT_BUNDLE_IDENTIFIER = eu.mobisync.client.RunnerTests;
- PRODUCT_NAME = "$(TARGET_NAME)";
- SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
- SWIFT_OPTIMIZATION_LEVEL = "-Onone";
- SWIFT_VERSION = 5.0;
- TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
- };
- name = Debug;
- };
- 331C8089294A63A400263BE5 /* Release */ = {
- isa = XCBuildConfiguration;
- baseConfigurationReference = 95DE71F53682F9F89A3AFCEE /* Pods-RunnerTests.release.xcconfig */;
- buildSettings = {
- BUNDLE_LOADER = "$(TEST_HOST)";
- CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 1;
- GENERATE_INFOPLIST_FILE = YES;
- MARKETING_VERSION = 1.0;
- PRODUCT_BUNDLE_IDENTIFIER = eu.mobisync.client.RunnerTests;
- PRODUCT_NAME = "$(TARGET_NAME)";
- SWIFT_VERSION = 5.0;
- TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
- };
- name = Release;
- };
- 331C808A294A63A400263BE5 /* Profile */ = {
- isa = XCBuildConfiguration;
- baseConfigurationReference = DF24105E66062229FAC6EFEA /* Pods-RunnerTests.profile.xcconfig */;
- buildSettings = {
- BUNDLE_LOADER = "$(TEST_HOST)";
- CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 1;
- GENERATE_INFOPLIST_FILE = YES;
- MARKETING_VERSION = 1.0;
- PRODUCT_BUNDLE_IDENTIFIER = eu.mobisync.client.RunnerTests;
- PRODUCT_NAME = "$(TARGET_NAME)";
- SWIFT_VERSION = 5.0;
- TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
- };
- name = Profile;
- };
- 97C147031CF9000F007C117D /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- CLANG_ANALYZER_NONNULL = YES;
- CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
- CLANG_CXX_LIBRARY = "libc++";
- CLANG_ENABLE_MODULES = YES;
- CLANG_ENABLE_OBJC_ARC = YES;
- CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
- CLANG_WARN_BOOL_CONVERSION = YES;
- CLANG_WARN_COMMA = YES;
- CLANG_WARN_CONSTANT_CONVERSION = YES;
- CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
- CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
- CLANG_WARN_EMPTY_BODY = YES;
- CLANG_WARN_ENUM_CONVERSION = YES;
- CLANG_WARN_INFINITE_RECURSION = YES;
- CLANG_WARN_INT_CONVERSION = YES;
- CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
- CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
- CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
- CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
- CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
- CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
- CLANG_WARN_STRICT_PROTOTYPES = YES;
- CLANG_WARN_SUSPICIOUS_MOVE = YES;
- CLANG_WARN_UNREACHABLE_CODE = YES;
- CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
- "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
- COPY_PHASE_STRIP = NO;
- DEBUG_INFORMATION_FORMAT = dwarf;
- ENABLE_STRICT_OBJC_MSGSEND = YES;
- ENABLE_TESTABILITY = YES;
- ENABLE_USER_SCRIPT_SANDBOXING = NO;
- GCC_C_LANGUAGE_STANDARD = gnu99;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_NO_COMMON_BLOCKS = YES;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PREPROCESSOR_DEFINITIONS = (
- "DEBUG=1",
- "$(inherited)",
- );
- GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
- GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
- GCC_WARN_UNDECLARED_SELECTOR = YES;
- GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
- GCC_WARN_UNUSED_FUNCTION = YES;
- GCC_WARN_UNUSED_VARIABLE = YES;
- IPHONEOS_DEPLOYMENT_TARGET = 12.0;
- MTL_ENABLE_DEBUG_INFO = YES;
- ONLY_ACTIVE_ARCH = YES;
- SDKROOT = iphoneos;
- TARGETED_DEVICE_FAMILY = "1,2";
- };
- name = Debug;
- };
- 97C147041CF9000F007C117D /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- CLANG_ANALYZER_NONNULL = YES;
- CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
- CLANG_CXX_LIBRARY = "libc++";
- CLANG_ENABLE_MODULES = YES;
- CLANG_ENABLE_OBJC_ARC = YES;
- CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
- CLANG_WARN_BOOL_CONVERSION = YES;
- CLANG_WARN_COMMA = YES;
- CLANG_WARN_CONSTANT_CONVERSION = YES;
- CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
- CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
- CLANG_WARN_EMPTY_BODY = YES;
- CLANG_WARN_ENUM_CONVERSION = YES;
- CLANG_WARN_INFINITE_RECURSION = YES;
- CLANG_WARN_INT_CONVERSION = YES;
- CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
- CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
- CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
- CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
- CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
- CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
- CLANG_WARN_STRICT_PROTOTYPES = YES;
- CLANG_WARN_SUSPICIOUS_MOVE = YES;
- CLANG_WARN_UNREACHABLE_CODE = YES;
- CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
- "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
- COPY_PHASE_STRIP = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- ENABLE_NS_ASSERTIONS = NO;
- ENABLE_STRICT_OBJC_MSGSEND = YES;
- ENABLE_USER_SCRIPT_SANDBOXING = NO;
- GCC_C_LANGUAGE_STANDARD = gnu99;
- GCC_NO_COMMON_BLOCKS = YES;
- GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
- GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
- GCC_WARN_UNDECLARED_SELECTOR = YES;
- GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
- GCC_WARN_UNUSED_FUNCTION = YES;
- GCC_WARN_UNUSED_VARIABLE = YES;
- IPHONEOS_DEPLOYMENT_TARGET = 12.0;
- MTL_ENABLE_DEBUG_INFO = NO;
- SDKROOT = iphoneos;
- SUPPORTED_PLATFORMS = iphoneos;
- SWIFT_COMPILATION_MODE = wholemodule;
- SWIFT_OPTIMIZATION_LEVEL = "-O";
- TARGETED_DEVICE_FAMILY = "1,2";
- VALIDATE_PRODUCT = YES;
- };
- name = Release;
- };
- 97C147061CF9000F007C117D /* Debug */ = {
- isa = XCBuildConfiguration;
- baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
- buildSettings = {
- ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
- ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO;
- CLANG_ENABLE_MODULES = YES;
- CODE_SIGN_IDENTITY = "Apple Development";
- "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
- CODE_SIGN_STYLE = Manual;
- CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
- DEVELOPMENT_TEAM = "";
- "DEVELOPMENT_TEAM[sdk=iphoneos*]" = R25XLT6Z87;
- ENABLE_BITCODE = NO;
- INFOPLIST_FILE = Runner/Info.plist;
- INFOPLIST_KEY_CFBundleDisplayName = "Mobi Sync Client";
- INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.photography";
- LD_RUNPATH_SEARCH_PATHS = (
- "$(inherited)",
- "@executable_path/Frameworks",
- );
- MARKETING_VERSION = 1.0.4;
- PRODUCT_BUNDLE_IDENTIFIER = eu.mobisync.client;
- PRODUCT_NAME = "$(TARGET_NAME)";
- PROVISIONING_PROFILE_SPECIFIER = "";
- "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = MobiSync_App_Store_Profile2026;
- SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
- SWIFT_OPTIMIZATION_LEVEL = "-Onone";
- SWIFT_VERSION = 5.0;
- VERSIONING_SYSTEM = "apple-generic";
- };
- name = Debug;
- };
- 97C147071CF9000F007C117D /* Release */ = {
- isa = XCBuildConfiguration;
- baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
- buildSettings = {
- ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
- ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO;
- CLANG_ENABLE_MODULES = YES;
- CODE_SIGN_ENTITLEMENTS = Runner/RunnerRelease.entitlements;
- CODE_SIGN_IDENTITY = "Apple Development";
- "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
- CODE_SIGN_STYLE = Manual;
- CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
- DEVELOPMENT_TEAM = "";
- "DEVELOPMENT_TEAM[sdk=iphoneos*]" = R25XLT6Z87;
- ENABLE_BITCODE = NO;
- INFOPLIST_FILE = Runner/Info.plist;
- INFOPLIST_KEY_CFBundleDisplayName = "Mobi Sync Client";
- INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.photography";
- LD_RUNPATH_SEARCH_PATHS = (
- "$(inherited)",
- "@executable_path/Frameworks",
- );
- MARKETING_VERSION = 1.0.4;
- PRODUCT_BUNDLE_IDENTIFIER = eu.mobisync.client;
- PRODUCT_NAME = "$(TARGET_NAME)";
- PROVISIONING_PROFILE_SPECIFIER = "";
- "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = MobiSync_App_Store_Profile2026;
- SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
- SWIFT_VERSION = 5.0;
- VERSIONING_SYSTEM = "apple-generic";
- };
- name = Release;
- };
-/* End XCBuildConfiguration section */
-
-/* Begin XCConfigurationList section */
- 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 331C8088294A63A400263BE5 /* Debug */,
- 331C8089294A63A400263BE5 /* Release */,
- 331C808A294A63A400263BE5 /* Profile */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Release;
- };
- 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 97C147031CF9000F007C117D /* Debug */,
- 97C147041CF9000F007C117D /* Release */,
- 249021D3217E4FDB00AE95B9 /* Profile */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Release;
- };
- 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 97C147061CF9000F007C117D /* Debug */,
- 97C147071CF9000F007C117D /* Release */,
- 249021D4217E4FDB00AE95B9 /* Profile */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Release;
- };
-/* End XCConfigurationList section */
- };
- rootObject = 97C146E61CF9000F007C117D /* Project object */;
-}
diff --git a/ios_backup/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios_backup/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
deleted file mode 100644
index e3773d4..0000000
--- a/ios_backup/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
+++ /dev/null
@@ -1,101 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/ios_backup/Runner.xcworkspace/contents.xcworkspacedata b/ios_backup/Runner.xcworkspace/contents.xcworkspacedata
deleted file mode 100644
index 21a3cc1..0000000
--- a/ios_backup/Runner.xcworkspace/contents.xcworkspacedata
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
-
-
-
diff --git a/ios_backup/Runner/AppDelegate.swift b/ios_backup/Runner/AppDelegate.swift
deleted file mode 100644
index b636303..0000000
--- a/ios_backup/Runner/AppDelegate.swift
+++ /dev/null
@@ -1,13 +0,0 @@
-import UIKit
-import Flutter
-
-@main
-@objc class AppDelegate: FlutterAppDelegate {
- override func application(
- _ application: UIApplication,
- didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
- ) -> Bool {
- GeneratedPluginRegistrant.register(with: self)
- return super.application(application, didFinishLaunchingWithOptions: launchOptions)
- }
-}
diff --git a/ios_backup/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios_backup/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
deleted file mode 100644
index d36b1fa..0000000
--- a/ios_backup/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
+++ /dev/null
@@ -1,122 +0,0 @@
-{
- "images" : [
- {
- "size" : "20x20",
- "idiom" : "iphone",
- "filename" : "Icon-App-20x20@2x.png",
- "scale" : "2x"
- },
- {
- "size" : "20x20",
- "idiom" : "iphone",
- "filename" : "Icon-App-20x20@3x.png",
- "scale" : "3x"
- },
- {
- "size" : "29x29",
- "idiom" : "iphone",
- "filename" : "Icon-App-29x29@1x.png",
- "scale" : "1x"
- },
- {
- "size" : "29x29",
- "idiom" : "iphone",
- "filename" : "Icon-App-29x29@2x.png",
- "scale" : "2x"
- },
- {
- "size" : "29x29",
- "idiom" : "iphone",
- "filename" : "Icon-App-29x29@3x.png",
- "scale" : "3x"
- },
- {
- "size" : "40x40",
- "idiom" : "iphone",
- "filename" : "Icon-App-40x40@2x.png",
- "scale" : "2x"
- },
- {
- "size" : "40x40",
- "idiom" : "iphone",
- "filename" : "Icon-App-40x40@3x.png",
- "scale" : "3x"
- },
- {
- "size" : "60x60",
- "idiom" : "iphone",
- "filename" : "Icon-App-60x60@2x.png",
- "scale" : "2x"
- },
- {
- "size" : "60x60",
- "idiom" : "iphone",
- "filename" : "Icon-App-60x60@3x.png",
- "scale" : "3x"
- },
- {
- "size" : "20x20",
- "idiom" : "ipad",
- "filename" : "Icon-App-20x20@1x.png",
- "scale" : "1x"
- },
- {
- "size" : "20x20",
- "idiom" : "ipad",
- "filename" : "Icon-App-20x20@2x.png",
- "scale" : "2x"
- },
- {
- "size" : "29x29",
- "idiom" : "ipad",
- "filename" : "Icon-App-29x29@1x.png",
- "scale" : "1x"
- },
- {
- "size" : "29x29",
- "idiom" : "ipad",
- "filename" : "Icon-App-29x29@2x.png",
- "scale" : "2x"
- },
- {
- "size" : "40x40",
- "idiom" : "ipad",
- "filename" : "Icon-App-40x40@1x.png",
- "scale" : "1x"
- },
- {
- "size" : "40x40",
- "idiom" : "ipad",
- "filename" : "Icon-App-40x40@2x.png",
- "scale" : "2x"
- },
- {
- "size" : "76x76",
- "idiom" : "ipad",
- "filename" : "Icon-App-76x76@1x.png",
- "scale" : "1x"
- },
- {
- "size" : "76x76",
- "idiom" : "ipad",
- "filename" : "Icon-App-76x76@2x.png",
- "scale" : "2x"
- },
- {
- "size" : "83.5x83.5",
- "idiom" : "ipad",
- "filename" : "Icon-App-83.5x83.5@2x.png",
- "scale" : "2x"
- },
- {
- "size" : "1024x1024",
- "idiom" : "ios-marketing",
- "filename" : "Icon-App-1024x1024@1x.png",
- "scale" : "1x"
- }
- ],
- "info" : {
- "version" : 1,
- "author" : "xcode"
- }
-}
diff --git a/ios_backup/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/ios_backup/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png
deleted file mode 100644
index 1fa9c26..0000000
Binary files a/ios_backup/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png and /dev/null differ
diff --git a/ios_backup/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/ios_backup/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png
deleted file mode 100644
index 3cb85b2..0000000
Binary files a/ios_backup/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png and /dev/null differ
diff --git a/ios_backup/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/ios_backup/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png
deleted file mode 100644
index b30be03..0000000
Binary files a/ios_backup/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png and /dev/null differ
diff --git a/ios_backup/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/ios_backup/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png
deleted file mode 100644
index 3096457..0000000
Binary files a/ios_backup/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png and /dev/null differ
diff --git a/ios_backup/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/ios_backup/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png
deleted file mode 100644
index d61b1f9..0000000
Binary files a/ios_backup/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png and /dev/null differ
diff --git a/ios_backup/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/ios_backup/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png
deleted file mode 100644
index b6924e5..0000000
Binary files a/ios_backup/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png and /dev/null differ
diff --git a/ios_backup/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/ios_backup/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png
deleted file mode 100644
index a76b2c4..0000000
Binary files a/ios_backup/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png and /dev/null differ
diff --git a/ios_backup/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/ios_backup/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png
deleted file mode 100644
index b30be03..0000000
Binary files a/ios_backup/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png and /dev/null differ
diff --git a/ios_backup/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/ios_backup/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png
deleted file mode 100644
index ad70724..0000000
Binary files a/ios_backup/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png and /dev/null differ
diff --git a/ios_backup/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/ios_backup/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png
deleted file mode 100644
index a27b0bb..0000000
Binary files a/ios_backup/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png and /dev/null differ
diff --git a/ios_backup/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png b/ios_backup/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png
deleted file mode 100644
index 9dce117..0000000
Binary files a/ios_backup/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png and /dev/null differ
diff --git a/ios_backup/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png b/ios_backup/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png
deleted file mode 100644
index aa9cfec..0000000
Binary files a/ios_backup/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png and /dev/null differ
diff --git a/ios_backup/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png b/ios_backup/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png
deleted file mode 100644
index 2422216..0000000
Binary files a/ios_backup/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png and /dev/null differ
diff --git a/ios_backup/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png b/ios_backup/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png
deleted file mode 100644
index a11a98d..0000000
Binary files a/ios_backup/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png and /dev/null differ
diff --git a/ios_backup/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/ios_backup/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png
deleted file mode 100644
index a27b0bb..0000000
Binary files a/ios_backup/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png and /dev/null differ
diff --git a/ios_backup/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/ios_backup/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png
deleted file mode 100644
index dae3672..0000000
Binary files a/ios_backup/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png and /dev/null differ
diff --git a/ios_backup/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png b/ios_backup/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png
deleted file mode 100644
index d5ab121..0000000
Binary files a/ios_backup/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png and /dev/null differ
diff --git a/ios_backup/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png b/ios_backup/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png
deleted file mode 100644
index f698d80..0000000
Binary files a/ios_backup/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png and /dev/null differ
diff --git a/ios_backup/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/ios_backup/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png
deleted file mode 100644
index 8d1979e..0000000
Binary files a/ios_backup/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png and /dev/null differ
diff --git a/ios_backup/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/ios_backup/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
deleted file mode 100644
index 1b58725..0000000
Binary files a/ios_backup/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png and /dev/null differ
diff --git a/ios_backup/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/ios_backup/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
deleted file mode 100644
index 18a3983..0000000
Binary files a/ios_backup/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png and /dev/null differ
diff --git a/ios_backup/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/ios_backup/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
deleted file mode 100644
index 0bedcf2..0000000
--- a/ios_backup/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "images" : [
- {
- "idiom" : "universal",
- "filename" : "LaunchImage.png",
- "scale" : "1x"
- },
- {
- "idiom" : "universal",
- "filename" : "LaunchImage@2x.png",
- "scale" : "2x"
- },
- {
- "idiom" : "universal",
- "filename" : "LaunchImage@3x.png",
- "scale" : "3x"
- }
- ],
- "info" : {
- "version" : 1,
- "author" : "xcode"
- }
-}
diff --git a/ios_backup/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/ios_backup/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
deleted file mode 100644
index 9da19ea..0000000
Binary files a/ios_backup/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png and /dev/null differ
diff --git a/ios_backup/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/ios_backup/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
deleted file mode 100644
index 9da19ea..0000000
Binary files a/ios_backup/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png and /dev/null differ
diff --git a/ios_backup/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/ios_backup/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
deleted file mode 100644
index 9da19ea..0000000
Binary files a/ios_backup/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png and /dev/null differ
diff --git a/ios_backup/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/ios_backup/Runner/Assets.xcassets/LaunchImage.imageset/README.md
deleted file mode 100644
index 89c2725..0000000
--- a/ios_backup/Runner/Assets.xcassets/LaunchImage.imageset/README.md
+++ /dev/null
@@ -1,5 +0,0 @@
-# Launch Screen Assets
-
-You can customize the launch screen with your own desired assets by replacing the image files in this directory.
-
-You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images.
\ No newline at end of file
diff --git a/ios_backup/Runner/Base.lproj/LaunchScreen.storyboard b/ios_backup/Runner/Base.lproj/LaunchScreen.storyboard
deleted file mode 100644
index f2e259c..0000000
--- a/ios_backup/Runner/Base.lproj/LaunchScreen.storyboard
+++ /dev/null
@@ -1,37 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/ios_backup/Runner/Base.lproj/Main.storyboard b/ios_backup/Runner/Base.lproj/Main.storyboard
deleted file mode 100644
index f3c2851..0000000
--- a/ios_backup/Runner/Base.lproj/Main.storyboard
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/ios_backup/Runner/Info.plist b/ios_backup/Runner/Info.plist
deleted file mode 100644
index 7655d80..0000000
--- a/ios_backup/Runner/Info.plist
+++ /dev/null
@@ -1,55 +0,0 @@
-
-
-
-
- CADisableMinimumFrameDurationOnPhone
-
- CFBundleDevelopmentRegion
- $(DEVELOPMENT_LANGUAGE)
- CFBundleDisplayName
- Sync Client
- CFBundleExecutable
- $(EXECUTABLE_NAME)
- CFBundleIdentifier
- $(PRODUCT_BUNDLE_IDENTIFIER)
- CFBundleInfoDictionaryVersion
- 6.0
- CFBundleName
- sync_client
- CFBundlePackageType
- APPL
- CFBundleShortVersionString
- $(FLUTTER_BUILD_NAME)
- CFBundleSignature
- dst.stefanova@gmail.com
- CFBundleVersion
- $(FLUTTER_BUILD_NUMBER)
- LSApplicationCategoryType
- public.app-category.photography
- LSRequiresIPhoneOS
-
- NSPhotoLibraryUsageDescription
- Syncing photos and videos to your home server requires permissions to your files.
- UIApplicationSupportsIndirectInputEvents
-
- UILaunchScreen
- LaunchScreen
- UILaunchStoryboardName
- LaunchScreen.storyboard
- UIRequiresFullScreen
-
- UISupportedInterfaceOrientations
-
- UIInterfaceOrientationPortrait
- UIInterfaceOrientationLandscapeLeft
- UIInterfaceOrientationLandscapeRight
-
- UISupportedInterfaceOrientations~ipad
-
- UIInterfaceOrientationPortrait
- UIInterfaceOrientationPortraitUpsideDown
- UIInterfaceOrientationLandscapeLeft
- UIInterfaceOrientationLandscapeRight
-
-
-
diff --git a/ios_backup/Runner/Runner-Bridging-Header.h b/ios_backup/Runner/Runner-Bridging-Header.h
deleted file mode 100644
index 308a2a5..0000000
--- a/ios_backup/Runner/Runner-Bridging-Header.h
+++ /dev/null
@@ -1 +0,0 @@
-#import "GeneratedPluginRegistrant.h"
diff --git a/ios_backup/Runner/RunnerProfile.entitlements b/ios_backup/Runner/RunnerProfile.entitlements
deleted file mode 100644
index 903def2..0000000
--- a/ios_backup/Runner/RunnerProfile.entitlements
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
- aps-environment
- development
-
-
diff --git a/ios_backup/Runner/RunnerRelease.entitlements b/ios_backup/Runner/RunnerRelease.entitlements
deleted file mode 100644
index 903def2..0000000
--- a/ios_backup/Runner/RunnerRelease.entitlements
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
- aps-environment
- development
-
-
diff --git a/ios_backup/RunnerTests/RunnerTests.swift b/ios_backup/RunnerTests/RunnerTests.swift
deleted file mode 100644
index 86a7c3b..0000000
--- a/ios_backup/RunnerTests/RunnerTests.swift
+++ /dev/null
@@ -1,12 +0,0 @@
-import Flutter
-import UIKit
-import XCTest
-
-class RunnerTests: XCTestCase {
-
- func testExample() {
- // If you add code to the Runner application, consider adding tests here.
- // See https://developer.apple.com/documentation/xctest for more information about using XCTest.
- }
-
-}
diff --git a/lib/config/config.dart b/lib/config/config.dart
index 92cc866..fb96266 100644
--- a/lib/config/config.dart
+++ b/lib/config/config.dart
@@ -13,6 +13,8 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
+export 'gallery_refresh_cubit.dart';
+export 'gallery_refresh_state.dart';
export 'router/app_router.dart';
export 'theme/app_theme.dart';
export 'theme/app_bar.dart';
diff --git a/lib/config/gallery_refresh_cubit.dart b/lib/config/gallery_refresh_cubit.dart
new file mode 100644
index 0000000..9df29a4
--- /dev/null
+++ b/lib/config/gallery_refresh_cubit.dart
@@ -0,0 +1,30 @@
+/*
+ Copyright 2023 Take Control - Software & Infrastructure
+*/
+
+import 'package:bloc/bloc.dart';
+import 'package:sync_client/config/gallery_refresh_state.dart';
+
+class GalleryRefreshCubit extends Cubit {
+ GalleryRefreshCubit() : super(const GalleryRefreshState());
+
+ void requestHomeRefresh() {
+ emit(state.copyWith(homeNeedsRefresh: true));
+ }
+
+ void requestTrashRefresh() {
+ emit(state.copyWith(trashNeedsRefresh: true));
+ }
+
+ void clearHomeRefresh() {
+ if (state.homeNeedsRefresh) {
+ emit(state.copyWith(homeNeedsRefresh: false));
+ }
+ }
+
+ void clearTrashRefresh() {
+ if (state.trashNeedsRefresh) {
+ emit(state.copyWith(trashNeedsRefresh: false));
+ }
+ }
+}
diff --git a/lib/config/gallery_refresh_state.dart b/lib/config/gallery_refresh_state.dart
new file mode 100644
index 0000000..967cde0
--- /dev/null
+++ b/lib/config/gallery_refresh_state.dart
@@ -0,0 +1,28 @@
+/*
+ Copyright 2023 Take Control - Software & Infrastructure
+*/
+
+import 'package:equatable/equatable.dart';
+
+class GalleryRefreshState extends Equatable {
+ const GalleryRefreshState({
+ this.homeNeedsRefresh = false,
+ this.trashNeedsRefresh = false,
+ });
+
+ final bool homeNeedsRefresh;
+ final bool trashNeedsRefresh;
+
+ GalleryRefreshState copyWith({
+ bool? homeNeedsRefresh,
+ bool? trashNeedsRefresh,
+ }) {
+ return GalleryRefreshState(
+ homeNeedsRefresh: homeNeedsRefresh ?? this.homeNeedsRefresh,
+ trashNeedsRefresh: trashNeedsRefresh ?? this.trashNeedsRefresh,
+ );
+ }
+
+ @override
+ List