From 11da3904f7619ef9468132d60fbe22dd52be72aa Mon Sep 17 00:00:00 2001 From: Hermes Agent Date: Tue, 15 Sep 2026 23:59:31 +0300 Subject: [PATCH] chore: prepare FlowPilot 1.1.0 release --- .github/workflows/release.yml | 147 ++++++++++++++++++---------------- CHANGELOG.md | 19 +++-- README.md | 6 +- README.tr.md | 4 +- app/build.gradle.kts | 4 +- docs/IMPLEMENTATION.md | 23 +++--- docs/RELEASE_NOTES_1.1.0.md | 73 +++++++++++++++++ docs/ROADMAP.md | 14 ++-- docs/STATUS.md | 9 ++- docs/assets/js/app.js | 46 ++++++----- docs/index.html | 39 ++++----- 11 files changed, 241 insertions(+), 143 deletions(-) create mode 100644 docs/RELEASE_NOTES_1.1.0.md diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 1b0dba2..1601b32 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -68,11 +68,7 @@ jobs: fi ci_runs_url="https://api.github.com/repos/${GITHUB_REPOSITORY}/actions/workflows/ci.yml/runs?head_sha=${release_commit}&event=push&status=completed&per_page=100" - curl --fail --silent --show-error \ - --header 'Accept: application/vnd.github+json' \ - --header "Authorization: Bearer $GH_TOKEN" \ - --header 'X-GitHub-Api-Version: 2022-11-28' \ - "$ci_runs_url" > "$RUNNER_TEMP/ci-runs.json" + gh api "$ci_runs_url" > "$RUNNER_TEMP/ci-runs.json" ci_run_id=$(jq --exit-status --raw-output --arg commit "$release_commit" ' [.workflow_runs[] | select(.head_sha == $commit and .event == "push" and .head_branch == "main" and .status == "completed")] | max_by(.run_started_at) | select(.conclusion == "success") | .id @@ -80,11 +76,7 @@ jobs: echo "ERROR: Android CI push run for $release_commit on main has not completed successfully" exit 1 } - curl --fail --silent --show-error \ - --header 'Accept: application/vnd.github+json' \ - --header "Authorization: Bearer $GH_TOKEN" \ - --header 'X-GitHub-Api-Version: 2022-11-28' \ - "https://api.github.com/repos/${GITHUB_REPOSITORY}/actions/runs/${ci_run_id}/jobs?filter=latest&per_page=100" > "$RUNNER_TEMP/ci-jobs.json" + gh api "repos/${GITHUB_REPOSITORY}/actions/runs/${ci_run_id}/jobs?filter=latest&per_page=100" > "$RUNNER_TEMP/ci-jobs.json" if ! jq --exit-status ' any(.jobs[]; .name == "Build & Test" and .status == "completed" and .conclusion == "success") ' "$RUNNER_TEMP/ci-jobs.json" > /dev/null; then @@ -92,24 +84,35 @@ jobs: exit 1 fi - release_url="https://api.github.com/repos/${GITHUB_REPOSITORY}/releases/tags/${GITHUB_REF_NAME}" - release_status=$(curl --silent --show-error --output "$RUNNER_TEMP/existing-release.json" --write-out '%{http_code}' \ - --header 'Authorization: Bearer $GH_TOKEN' \ - --header 'Accept: application/vnd.github+json' \ - --header 'X-GitHub-Api-Version: 2022-11-28' \ - "$release_url") - case "$release_status" in - 404) ;; - 200) - jq --exit-status --raw-output '.body | strings' "$RUNNER_TEMP/existing-release.json" > "$RUNNER_TEMP/existing-release-body.md" - echo "ERROR: release for $GITHUB_REF_NAME already exists; refusing to overwrite its notes or assets" + if gh api "repos/${GITHUB_REPOSITORY}/releases/tags/${GITHUB_REF_NAME}" > "$RUNNER_TEMP/existing-release.json" 2> "$RUNNER_TEMP/existing-release-error.txt"; then + if ! jq --exit-status --arg tag "$GITHUB_REF_NAME" ' + .draft == true and .tag_name == $tag and (.assets | length) == 0 + ' "$RUNNER_TEMP/existing-release.json" > /dev/null; then + echo "ERROR: release for $GITHUB_REF_NAME already exists and is not an empty recoverable draft" exit 1 - ;; - *) - echo "ERROR: unable to query existing release for $GITHUB_REF_NAME (HTTP $release_status)" + fi + echo "Recovering empty draft release for $GITHUB_REF_NAME" + elif ! grep --fixed-strings --quiet 'HTTP 404' "$RUNNER_TEMP/existing-release-error.txt"; then + cat "$RUNNER_TEMP/existing-release-error.txt" + echo "ERROR: unable to query existing release for $GITHUB_REF_NAME" + exit 1 + fi + + gh api "repos/${GITHUB_REPOSITORY}/releases/latest" > "$RUNNER_TEMP/latest-release.json" + jq --exit-status --raw-output '.body | strings' "$RUNNER_TEMP/latest-release.json" > "$RUNNER_TEMP/latest-release-body.md" + for heading in '## 🧪 Verification' '## 📥 Installation' '## 📱 Compatibility'; do + grep --fixed-strings --quiet "$heading" "$RUNNER_TEMP/latest-release-body.md" || { + echo "ERROR: latest release notes missing expected structure: $heading" exit 1 - ;; - esac + } + done + + notes_source="docs/RELEASE_NOTES_${GITHUB_REF_NAME#v}.md" + [[ -s "$notes_source" ]] || { echo "ERROR: missing prepared release notes: $notes_source"; exit 1; } + grep --fixed-strings --quiet "## [${GITHUB_REF_NAME#v}]" CHANGELOG.md || { + echo "ERROR: CHANGELOG.md missing release section for ${GITHUB_REF_NAME#v}" + exit 1 + } release: name: Build & Publish Release APK @@ -141,11 +144,14 @@ jobs: - name: Grant execute permission for gradlew run: chmod +x gradlew + - name: Run resource contracts + run: python scripts/test_lint_resource_contracts.py + - name: Run Debug Unit Tests run: ./gradlew testDebugUnitTest --no-daemon - - name: Run Debug Lint - run: ./gradlew lintDebug --no-daemon + - name: Run Debug Lint and assemble APK + run: ./gradlew lintDebug assembleDebug --no-daemon - name: Validate signing environment env: @@ -195,51 +201,54 @@ jobs: release_apk_name="FlowPilot-${GITHUB_REF_NAME}.apk" release_apk_path="$release_dir/$release_apk_name" mv "$release_apk" "$release_apk_path" - release_checksum_path="${release_apk_path}.sha256" - sha256sum "$release_apk_path" > "$release_checksum_path" - sha256sum --check "$release_checksum_path" - release_sha256=$(awk '{print $1}' "$release_checksum_path") - - release_title="FlowPilot ${GITHUB_REF_NAME}" - release_notes_path="$RUNNER_TEMP/release-notes.md" - cat > "$release_notes_path" < "${release_apk_name}.sha256" + sha256sum --check "${release_apk_name}.sha256" + ) + release_sha256=$(awk '{print $1}' "$release_checksum_path") - for heading in '## ✨ Highlights' '## 🧪 Verification' '## 📥 Installation' '### SHA-256 Checksum' '## 📱 Compatibility' '## 🇹🇷 Türkçe Özet'; do + release_title="FlowPilot ${GITHUB_REF_NAME} — Safer Automations, Conflict Warnings & Privacy Hardening" + release_notes_path="$RUNNER_TEMP/release-notes.md" + notes_source="docs/RELEASE_NOTES_${GITHUB_REF_NAME#v}.md" + [[ -s "$notes_source" ]] || { echo "ERROR: missing prepared release notes: $notes_source"; exit 1; } + python3 - "$notes_source" "$release_notes_path" "$release_apk_name" "$release_sha256" "$RELEASE_COMMIT" <<'PY' + from pathlib import Path + import sys + + source, target, apk_name, digest, commit = sys.argv[1:] + notes = Path(source).read_text(encoding="utf-8") + replacements = { + "{{APK_NAME}}": apk_name, + "{{SHA256}}": digest, + "{{RELEASE_COMMIT}}": commit, + } + for marker, value in replacements.items(): + if marker not in notes: + raise SystemExit(f"ERROR: release notes missing marker {marker}") + notes = notes.replace(marker, value) + if "{{" in notes or "}}" in notes: + raise SystemExit("ERROR: unresolved release-note marker") + Path(target).write_text(notes, encoding="utf-8") + PY + + for heading in '## ✨ Safer Rule Management' '## 🛡️ Automation Security' '## 🔒 History Privacy' '## 🌐 Language & Background Notifications' '## 🧪 Verification' '## 📥 Installation' '### SHA-256 Checksum' '## 📱 Compatibility' '## 🇹🇷 Türkçe Özet'; do grep --fixed-strings --quiet "$heading" "$release_notes_path" || { echo "ERROR: release notes missing $heading"; exit 1; } done grep --fixed-strings --quiet "SHA256 (${release_apk_name}) = ${release_sha256}" "$release_notes_path" || { echo 'ERROR: release notes checksum mismatch'; exit 1; } diff --git a/CHANGELOG.md b/CHANGELOG.md index 6978fb4..7c3906d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,28 +4,33 @@ All notable FlowPilot changes are documented here. ## [Unreleased] -Changes completed after `1.0.2` and intended for the next release. +## [1.1.0] - 2026-09-15 ### Added - Safe rule duplication from the Home list: creates a disabled, immediately editable copy with a new identity and reset runtime state. Webhook secrets are decrypted and re-encrypted with fresh Android Keystore ciphertext; TTS cache files are copied independently with failure-safe cleanup. - Non-blocking conflict warnings before saving or enabling automations: detects opposing state actions with likely/possible confidence, links to the conflicting rule for inspection, preserves the pending operation across inspection, and requires a deliberate override. Trigger overlap follows runtime wildcard semantics without exposing notification keywords or other sensitive arguments. +### Changed + +- Foreground engine and startup-failure notifications now follow the persisted English, Turkish, or system-language selection across boot, service restart, process recreation, and task removal. Language changes refresh active notification text, channel metadata, and widget state immediately. +- GitHub Pages now has improved mobile navigation, browser-language selection, accessible brand navigation, modular assets, and release-aligned installation guidance. + ### Security - Background NFC discovery now opens a confirmation gate before it can run matching automations; only foreground Android ReaderMode scans execute automatically. - Webhooks pin initial TCP connections to prevalidated public IP addresses, preserve TLS hostname verification, reject unsafe rendered headers, and use bounded HTTP/1.1 parsing. - Sensitive SMS and notification events are accepted only while the engine is enabled, bounded and freshness-limited, and reauthorized immediately before execution. - Automatic rule runs now use durable execution leases and revision checks, preventing cooldown bypasses and revoking queued work after rule changes. -- Release workflow now requires a current `main` commit, exact successful CI, matching version tag, and protected signing environment before signing. -- Enabled Dependabot vulnerability alerts and security update pull requests. -- Enabled secret scanning, push protection, and private vulnerability reporting for the public repository. -- Protected `main`: pull requests, a current successful `Build & Test` check, and resolved review conversations are required; force-push and branch deletion are disabled. +- Execution-history rule names, trigger snapshots, action arguments, and failure messages are sanitized before persistence and during legacy migration; raw provider errors and embedded sensitive markers are not retained. +- Release workflow now requires a current `main` commit, exact successful CI, matching version tag, detailed prepared notes, verified APK identity/signature, and signing environment before publication. +- Enabled Dependabot vulnerability alerts, security update pull requests, secret scanning, push protection, private vulnerability reporting, and protected `main` rules. ### Verification -- GitHub `Build & Test` passed after both feature branches were reconciled on `main`. -- Android instrumentation remains a manual emulator gate; physical-device validation for these two features is still pending. +- GitHub `Build & Test` passed for the merged feature and security changes. +- Physical-device validation passed for safe rule duplication, conflict warnings, background NFC confirmation, and language switching. +- Android instrumentation remains a manual emulator gate. ## [1.0.2] - 2026-09-13 diff --git a/README.md b/README.md index 991629e..2572121 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ ### The private, battery-first Android automation engine — without root. -Automate your device seamlessly with event-driven triggers, privileged system actions via Shizuku, and a fluid Material 3 interface. No telemetry, no cloud accounts, and zero background battery drain. +Automate your device with event-driven triggers, privileged system actions via Shizuku, and a fluid Material 3 interface. No telemetry or cloud accounts, with battery-efficient demand-driven listeners.
@@ -165,7 +165,7 @@ FlowPilot listens to a rich spectrum of hardware, radio, and system events: - **Device Flip:** Face-down on table or turned face-up (Proximity + Gravity Z-axis with 500ms debounce). - **Shake:** Firm shake detection with configurable sensitivity slider. - **Ambient Light:** Lux drops below or rises above target threshold. -- 📍 **Hardware Geofencing:** Enter or exit defined geographical zones using Google Play Services `GeofencingClient`. Zero idle battery drain, up to 50 persistent queued events across engine restarts, and coordinate reuse for template variables. +- 📍 **Hardware Geofencing:** Enter or exit defined geographical zones using Google Play Services `GeofencingClient`. Uses no idle CPU wake-lock, keeps up to 50 queued events across engine restarts, and reuses transition coordinates for template variables. - 🏷️ **NFC Tags:** Instant hex UID matching on physical scans. Foreground ReaderMode scans run matching rules automatically; background Android discovery opens FlowPilot and requires explicit confirmation before any matching NFC automation runs. - 📞 **Phone & SMS:** Call ringing, answered, outgoing dialed, call ended; SMS received with keyword, prefix, regex, or exact sender matching. - 🔔 **Notifications:** Incoming notifications from selected apps with keyword filtering. @@ -231,7 +231,7 @@ FlowPilot is engineered with an uncompromised commitment to user privacy: - 🚫 **Zero Telemetry:** No Firebase Analytics, no Sentry, no remote crash reporters, and zero tracking SDKs. - 📵 **No Cloud Synchronization:** Your automations, logs, and secrets never touch any third-party cloud. -- 🛡️ **Hardware Keystore Protection:** Webhook secrets, tokens, and sensitive headers are encrypted with AES-256-GCM using hardware-backed Android Keystore keys. +- 🛡️ **Android Keystore Protection:** Webhook secrets, tokens, and sensitive headers are encrypted with AES-256-GCM using Android Keystore keys, hardware-backed when supported by the device. - 🙈 **Strict Log Sanitization:** Phone numbers, webhook credentials, and sensitive headers are masked across all UI screens and audit logs. ### Transparent Permission Disclosures diff --git a/README.tr.md b/README.tr.md index 788cb1a..3f46068 100644 --- a/README.tr.md +++ b/README.tr.md @@ -165,7 +165,7 @@ FlowPilot zengin bir donanım, radyo ve sistem olayı yelpazesini dinler: - **Cihazı Çevirme:** Yüzüstü masaya konma veya tekrar çevrilme (Yakınlık + Yerçekimi Z-ekseni, 500ms kararlılık filtresi). - **Sallama:** Hassasiyet ayarlı telefon sallama algılaması. - **Ortam Işığı:** Lüks değerinin belirlenen sınırın altına düşmesi veya üstüne çıkması. -- 📍 **Donanım Coğrafi Çit (Geofence):** Google Play Services `GeofencingClient` ile belirlenen alana giriş/çıkış. Boşta sıfır pil tüketimi, yeniden başlatmada kaybolmayan 50 olaylık kalıcı kuyruk ve şablon değişkenlerinde doğrudan koordinat kullanımı. +- 📍 **Donanım Coğrafi Çit (Geofence):** Google Play Services `GeofencingClient` ile belirlenen alana giriş/çıkış. Boşta CPU wake-lock kullanmaz; yeniden başlatmada kaybolmayan 50 olaylık kalıcı kuyruk ve şablon değişkenlerinde doğrudan koordinat kullanımı sağlar. - 🏷️ **NFC Etiketleri:** Fiziksel taramalarda anında hex UID eşleşmesi. Ön plandaki ReaderMode taramaları eşleşen kuralları otomatik çalıştırır; Android arka plan keşfi FlowPilot'ı açar ve eşleşen NFC otomasyonu çalışmadan önce açık onay ister. - 📞 **Arama & SMS:** Gelen arama çalıyor, yanıtlandı, giden arama başladı, arama bitti; SMS gönderen numaraya ve kelime, önek veya regex kalıbına göre tetikleme. - 🔔 **Bildirimler:** Seçili uygulamalardan gelen bildirimler ve anahtar kelime filtreleme. @@ -231,7 +231,7 @@ FlowPilot kullanıcı gizliliğine tavizsiz bir bağlılıkla tasarlanmıştır: - 🚫 **Sıfır Telemetri:** Firebase Analytics, Sentry, uzaktan çökme raporlayıcıları veya takip SDK'ları yer almaz. - 📵 **Bulut Eşitlemesi Yok:** Kurallarınız, günlükleriniz ve anahtarlarınız asla üçüncü taraf bir buluta gönderilmez. -- 🛡️ **Donanım Destekli Keystore:** Webhook şifreleri ve özel başlıklar Android Keystore donanım anahtarlarıyla AES-256-GCM ile korunur. +- 🛡️ **Android Keystore Koruması:** Webhook şifreleri ve özel başlıklar AES-256-GCM ile Android Keystore içinde, cihaz desteklediğinde donanım destekli olarak korunur. - 🙈 **Kişisel Veri Maskeleme:** Telefon numaraları, webhook anahtarları ve gizli başlıklar arayüzde ve loglarda maskelenmiş olarak tutulur. ### Şeffaf İzin Açıklamaları diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 2f3b80b..441ca82 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -13,8 +13,8 @@ android { applicationId = "com.flowpilot.app" minSdk = 26 targetSdk = 36 - versionCode = 3 - versionName = "1.0.2" + versionCode = 4 + versionName = "1.1.0" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } diff --git a/docs/IMPLEMENTATION.md b/docs/IMPLEMENTATION.md index 766bbf3..efed60a 100644 --- a/docs/IMPLEMENTATION.md +++ b/docs/IMPLEMENTATION.md @@ -78,7 +78,9 @@ app/src/main/java/com/flowpilot/app/ DetailScreen.kt rule detail, manual run test action, delete, and IME-safe form scrolling PermissionsScreen.kt setup wizard and background location guide SettingsScreen.kt - components/ toggle, cards, picker controls, action reordering (ReorderableActionList), focus-gated bring-into-view modifier + components/ toggle, cards, picker controls, action reordering, conflict warning dialog, focus-gated bring-into-view modifier + analysis/ + AutomationConflictAnalyzer.kt opposing-action analysis aligned with runtime trigger matching data/ model/Automation.kt kotlinx.serialization data model with encrypted secret mapping security/SecretCipher.kt Android Keystore AES-256-GCM authenticated encryption at rest @@ -99,6 +101,10 @@ app/src/main/java/com/flowpilot/app/ DeviceFlipTracker.kt motion sensor listener with dynamic lifecycle and battery-saving unregistering NfcTagHandoff.kt transient platform-reader tag UID queue and UI capture state NfcTagUtils.kt pure tag UID normalization and validation + NfcBackgroundConfirmationGate.kt holds untrusted background UID until explicit confirmation + NfcIntentSession.kt blocks ReaderMode bypass during NFC-intent handling + EventExecutionAuthorization.kt freshness and engine-state authorization for sensitive events + TriggerTargetMatcher.kt shared runtime/conflict trigger-target matching FlowPilotNotificationListener.kt transient notification listener, dedupe, and engine watchdog GeofenceState.kt pure geofence models, config validation, registration diff, and prerequisites evaluator GeofenceTracker.kt Google Play Services GeofencingClient hardware geofence synchronizer with process-local registration state @@ -136,13 +142,12 @@ tests (Robolectric + Truth) for rule/charger/battery/schedule matching, foregrou ## Engine loop -1. AutomationEngine polls foreground events, queued charger/battery broadcasts, NFC tags, notifications, SMS, geofence transitions, and schedules every 500 ms. -2. On foreground package change -> report `AppOpened(pkg)` / `AppClosed(pkg)` event. -3. RuleEvaluator matches enabled rules whose trigger app == pkg, event matches, conditions match live state, and cooldown period has expired (`now - lastTriggeredAt >= cooldown`). -4. For each match, check `lastTriggeredAt`/active-lock dedupe (a rule for "app opened" fires once - per open, not while app stays foreground). -5. Execute actions via capability-aware executors. Battery Saver uses direct access when available or Shizuku fallback. -6. If at least one action succeeds, update `lastTriggeredAt` to current epoch time and persist. Cooldown begins counting down from this timestamp. Suppressed runs during cooldown produce no history records. +1. AutomationEngine polls foreground events, queued charger/battery broadcasts, confirmed NFC tags, authorized notifications/SMS, geofence transitions, and schedules every 500 ms. +2. Sensitive notification and SMS events are accepted only while the engine is enabled, kept in bounded freshness-limited queues, and reauthorized immediately before evaluation. +3. On foreground package change, report `AppOpened(pkg)` / `AppClosed(pkg)` event. +4. RuleEvaluator matches enabled rules whose event, target, live conditions, and cooldown all match. +5. Before execution, repository-backed leases atomically reserve the current rule revision; rule edits, disablement, deletion, and engine stop revoke queued work. +6. Execute actions through capability-aware executors. If at least one action succeeds, persist `lastTriggeredAt`; always release the execution lease. Suppressed or revoked runs do not create misleading history. ChargerStateTracker registers only while the engine runs. It queues `ACTION_POWER_CONNECTED` and `ACTION_POWER_DISCONNECTED`, dedupes consecutive identical states, and does not query current charger state @@ -199,7 +204,7 @@ URL. Both intents carry `FLAG_ACTIVITY_NEW_TASK` because the automation engine r Launch failure is logged and returned to the engine; target app removal, missing URL resolver, and OEM background-activity restrictions remain explicit failure cases. -WebhookExecutor dispatches HTTP/HTTPS requests via standard `HttpURLConnection`. Validates strict `http` or `https` schemes with host, enforces bounded timeouts (1-60s), renders known variables in headers/body only (`${time}`, `${timestamp}`, `${batteryPercent}`, `${isCharging}`, `${wifiSsid}`, `${trigger}`, `${location.lat}`, `${location.lng}`, `${location.coords}`, `${location.maps_url}`), sets headers and request body, and considers strictly HTTP 2xx status codes as success. Location coordinates are obtained live via `LocationFetcher` which checks for fresh cache (<60s, <50m accuracy), triggers an active GPS/network fix with 5-second timeout, and falls back to best cached coordinates. URL templates are excluded because URL encoding context differs; unknown and malformed variables are preserved and rendering is non-recursive. Sensitive headers (`Authorization`, `Cookie`, tokens, secrets) and sensitive parameter values are redacted from log entries and execution failure messages to prevent credential leakage. +WebhookExecutor dispatches HTTPS requests through `PinnedHttpsTransport`, pinning the initial connection to a prevalidated public IP while preserving TLS hostname verification. It validates strict `https` URLs with a host, enforces bounded timeouts (1-60s), renders known variables in headers/body only (`${time}`, `${timestamp}`, `${batteryPercent}`, `${isCharging}`, `${wifiSsid}`, `${trigger}`, `${location.lat}`, `${location.lng}`, `${location.coords}`, `${location.maps_url}`), sets headers and request body, and considers strictly HTTP 2xx status codes as success. Location coordinates are obtained live via `LocationFetcher` which checks for fresh cache (<60s, <50m accuracy), triggers an active GPS/network fix with 5-second timeout, and falls back to best cached coordinates. URL templates are excluded because URL encoding context differs; unknown and malformed variables are preserved and rendering is non-recursive. Sensitive headers (`Authorization`, `Cookie`, tokens, secrets) and sensitive parameter values are redacted from log entries and execution failure messages to prevent credential leakage. Manual test runs execute a saved rule's effective actions on `Dispatchers.IO`, bypassing its trigger and conditions without altering `enabled` or `lastTriggeredAt`. The manual webhook context uses `MANUAL` as its trigger and reads current battery, charger, Wi-Fi state, and live GPS coordinates via `LocationFetcher`; result summaries redact sensitive error values before reaching UI. diff --git a/docs/RELEASE_NOTES_1.1.0.md b/docs/RELEASE_NOTES_1.1.0.md new file mode 100644 index 0000000..bbc19d4 --- /dev/null +++ b/docs/RELEASE_NOTES_1.1.0.md @@ -0,0 +1,73 @@ +This release adds safer rule management, strengthens automation trust boundaries, and improves privacy-safe English and Turkish background behavior. + +--- + +## ✨ Safer Rule Management + +- Duplicate any rule from Home into a disabled, immediately editable copy with a new identity and reset runtime state. +- Duplicated webhook secrets receive fresh Android Keystore ciphertext; cached TTS audio is copied independently with failure-safe cleanup. +- Conflict warnings detect opposing state actions before saving or enabling a rule. +- Warnings distinguish likely and possible conflicts, preserve the pending operation, allow inspection of the conflicting rule, and require deliberate override. + +## 🛡️ Automation Security + +- Background NFC discovery now requires visible confirmation before a matching automation can run; trusted foreground ReaderMode scans remain automatic. +- Webhook connections pin initial delivery to prevalidated public IP addresses while preserving TLS hostname verification. +- Rendered webhook headers reject unsafe input, and HTTP/1.1 response parsing is bounded. +- SMS and notification events are accepted only while the engine is enabled, freshness-limited, bounded, and reauthorized immediately before execution. +- Durable execution leases and rule-revision checks prevent cooldown races and revoke queued work after a rule changes. + +## 🔒 History Privacy + +- Execution-history rule names, trigger snapshots, action arguments, and failure messages are sanitized before persistence and during legacy migration. +- Raw provider errors, private URIs, local paths, credentials, phone numbers, and embedded synthetic markers are not retained in history. +- Executors and dispatcher failures use stable privacy-safe outcomes instead of persisting raw exception text. + +## 🌐 Language & Background Notifications + +- Engine and startup-failure notifications follow saved English, Turkish, or system-language selection across boot, service restart, process recreation, and task removal. +- Changing language refreshes active notification text, channel metadata, and widget state immediately. +- System-language mode no longer remains stuck on a previously selected app language. + +## 🌍 Project Site & Release Integrity + +- Project site gains improved mobile layout, browser-language selection, accessible brand navigation, honest network/runtime claims, and v1.1.0 installation guidance. +- Release automation requires exact version/tag alignment, current `main`, successful `Build & Test` for exact release commit, prepared notes, verified APK identity/signature, and signed APK output. + +## 🧪 Verification + +- Required GitHub `Build & Test` completed successfully for exact release commit `{{RELEASE_COMMIT}}`. +- Release workflow completed resource contracts, debug unit tests, Android lint, debug APK assembly, and signed release APK assembly. +- Physical-device checks passed for safe rule duplication, conflict warnings, background NFC confirmation, and language switching. +- Release workflow verified APK SHA-256 before publication. + +## 📥 Installation + +1. Download **`{{APK_NAME}}`** from Assets below. +2. Download **`{{APK_NAME}}.sha256`** or copy checksum below. +3. Verify APK checksum before installation. +4. Install on Android 8.0+ (API 26–36). Configure Shizuku only for privileged system actions. + +### SHA-256 Checksum + +```text +SHA256 ({{APK_NAME}}) = {{SHA256}} +``` + +## 📱 Compatibility + +Developed and tested primarily on Xiaomi HyperOS (Xiaomi 15T Pro). Android OEM background restrictions can differ. Background NFC discovery requires explicit confirmation; foreground ReaderMode scans remain automatic. Privileged system actions require active Shizuku permission. + +--- + +## 🇹🇷 Türkçe Özet + +- Ana ekrandan kurallar güvenli biçimde çoğaltılabilir; kopya devre dışı oluşturulur, hemen düzenlemeye açılır ve çalışma durumu sıfırlanır. +- Kural kaydedilirken veya etkinleştirilirken karşıt işlemler için olası çakışma uyarıları gösterilir. +- Arka plan NFC keşfi otomasyonu çalıştırmadan önce görünür kullanıcı onayı ister; ön plandaki ReaderMode taramaları otomatik çalışmaya devam eder. +- Webhook bağlantıları doğrulanmış genel IP adreslerine sabitlenir; TLS ana makine doğrulaması korunur ve güvenli olmayan başlıklar reddedilir. +- SMS ve bildirim olayları yalnız motor etkinken, süre ve boyut sınırlarıyla kabul edilir; çalıştırmadan hemen önce yeniden yetkilendirilir. +- Çalıştırma geçmişindeki hata, argüman, kural adı ve tetikleyici verileri kaydedilmeden önce gizlilik için temizlenir. +- Motor bildirimleri, başlangıç hata bildirimleri ve kanal bilgileri seçilen uygulama dilini kullanır; dil değişikliği etkin bildirimlere hemen uygulanır. +- Kural çoğaltma, çakışma uyarısı, NFC onayı ve dil değişikliği fiziksel cihazda doğrulandı. +- Kurulumdan önce `{{APK_NAME}}` dosyasının SHA-256 değerini doğrulayın. diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md index 9b257d1..acbe186 100644 --- a/docs/ROADMAP.md +++ b/docs/ROADMAP.md @@ -63,7 +63,7 @@ Do not bundle unrelated features. One feature family at a time. - Selected bonded device MAC address matching; cached name for UI - Android public ACL broadcasts only while engine runs; no discovery, pairing, scan history, or startup replay - Android 12+ `BLUETOOTH_CONNECT` runtime permission required -9. **NFC tag scanned** (complete; Xiaomi configured-tag smoke test passed) +9. **NFC tag scanned** (complete; Xiaomi foreground and background-confirmation smoke tests passed) - Selected normalized tag UID matching, with no NDEF payload or tag-tech persistence - Tag UID capture in Create/Edit while FlowPilot is open - Foreground `NfcAdapter.ReaderCallback` handoff evaluates automatically; background discovery opens explicit confirmation before any matching rule runs @@ -211,9 +211,10 @@ Each must expose its required permission or Shizuku state. Do not show success u - Restart engine while device remains connected; verify no replay. - Unpair selected device; verify no crash and no false match. - Stop/deny Shizuku and verify Bluetooth on/off failures remain explicit. -6. **NFC tag and action delay** - - Scan different tag UID with engine running; verify it does not fire. - - Send forged `TAG_DISCOVERED` and `TECH_DISCOVERED` intents with configured UIDs; verify no action before confirmation and no action after dismissal. Confirm a configured background scan; verify matching rule fires. Scan configured physical tag while FlowPilot is foreground; verify it fires automatically. +6. **NFC negative paths and action delay** + - Background confirmation and foreground ReaderMode execution passed Xiaomi physical-device validation. + - Scan a different tag UID with engine running; verify it does not fire. + - Send forged `TAG_DISCOVERED` and `TECH_DISCOVERED` intents with configured UIDs; verify no action before confirmation and no action after dismissal. - Add a visible action after 5 seconds; verify timing, order, stop cancellation, and history. 7. **Action reordering and delay sequence validation** - Add multiple actions with distinct delays (e.g. Action A with 3s delay, Action B with 2s delay). @@ -230,11 +231,12 @@ Each must expose its required permission or Shizuku state. Do not show success u - Verify rule evaluation correctly filters `ENTER` vs `EXIT` triggers. - Verify transition coordinates populate `${location.lat}` and `${location.lng}` without performing redundant fresh GPS lookups for notification-only actions. - Disable rule or stop engine: verify geofences are unregistered from Google Play Services and status reflects `Unregistered`. -10. **Encrypted backup and localization device smoke test** +10. **Encrypted backup and localized-history device smoke test** + - App language switching passed Xiaomi physical-device validation. - Export a normal JSON backup; verify webhook URL/headers/body are absent and imported rules are disabled. - Export an encrypted full backup with a six-character-or-longer password; verify plaintext secrets are absent from file, wrong password leaves rules unchanged, and correct password restores secrets plus enabled state. - Share/import one encrypted rule and verify its full configuration is restored. - - Switch app language to Turkish; execute notification, SMS, and location actions, then verify History results and newly generated automatic rule names are Turkish. Verify custom rule names are unchanged. + - Execute notification, SMS, and location actions in Turkish, then verify History results and newly generated automatic rule names are Turkish. Verify custom rule names are unchanged. ## Acceptance Gate diff --git a/docs/STATUS.md b/docs/STATUS.md index 3b82ec9..f0d7455 100644 --- a/docs/STATUS.md +++ b/docs/STATUS.md @@ -1,6 +1,6 @@ # FlowPilot Status -Last updated: 2026-09-14 +Last updated: 2026-09-15 ## Build state @@ -13,7 +13,7 @@ Last updated: 2026-09-14 - Encrypted backup unit coverage verifies full-secret round trips, enabled-state preservation, plaintext non-leakage, wrong-password/tamper rejection, format/version/KDF bounds, single-rule backup, normal-export regression, and cross-device Android Keystore re-encryption. - History localization unit coverage verifies locale-neutral outcome records, masked SMS result arguments, legacy successful outcome mapping, technical failure fallback, and Turkish automatic rule-name generation. - Service locale and notification refresh contract verified: persisted app locale drives foreground engine and startup-failure notification channels and text across boot, service restart, process recreation, and task removal; language switch refreshes active notifications and channel metadata immediately (#23). -- Conflict analyzer and pre-save/pre-enable warning implemented: runtime-aligned trigger overlap, opposing state-action matrix, likely/possible confidence, conflict rule inspection with pending-state restoration, and deliberate non-blocking override. GitHub `Build & Test` passed; physical-device validation remains pending. +- Conflict analyzer and pre-save/pre-enable warning implemented: runtime-aligned trigger overlap, opposing state-action matrix, likely/possible confidence, conflict rule inspection with pending-state restoration, and deliberate non-blocking override. GitHub `Build & Test` and physical-device validation passed. - GitHub Pages site modularized: split single monolithic `docs/index.html` into external stylesheet (`docs/assets/css/style.css`) and script (`docs/assets/js/app.js`), unified brand favicon (`docs/assets/favicon.svg`), converted brand into accessible home link, compacted desktop footer, and added mobile-first responsive pass (#2, #3). ## Background stability & engine keepalive @@ -27,6 +27,7 @@ Last updated: 2026-09-14 ## Device-verified features +- Safe rule duplication, pre-save/pre-enable conflict warnings, background NFC confirmation, and app language switching. - Time schedules, charger, battery threshold, screen, Wi-Fi, and notification triggers. - Notifications, app launch, URL opening, alarm, timer, offline TTS, media volume, vibration, Play sound, webhook base action, NFC, Battery Saver, Auto-rotate, Do Not Disturb, and Dark theme actions. - Webhook header/body template variables and unknown-token preservation. @@ -43,7 +44,6 @@ Last updated: 2026-09-14 ## Implemented; device validation pending -- Safe rule duplication from the Home list overflow menu: creates a disabled copy with a new UUID/creation time, resets `lastTriggeredAt` and transient registration state, preserves complete configuration, re-encrypts webhook secrets with fresh Android Keystore ciphertext, and opens the copy in Edit immediately. GitHub unit/build verification and SDK-free static/resource contracts passed; physical-device validation remains pending. - Time Window (`TIME_BETWEEN`) and Days of the Week (`DAYS_OF_WEEK`) conditions (unit tests passed; device smoke tests pending): - Time interval filtering with overnight span support (e.g. 23:00 - 07:00 crossing midnight). - Day of week filtering with Daily, Weekdays, Weekends, and custom day toggles. @@ -76,9 +76,10 @@ Last updated: 2026-09-14 - AES-256-GCM portable envelope with PBKDF2-HMAC-SHA256 (100,000 iterations), random salt/IV, and six-character minimum password. - Encrypted export/share retains full rule data and enabled state; wrong passwords, altered payloads, unsupported versions/formats, and unsafe KDF bounds fail before import mutation. - Normal JSON export/share remains sanitized and normal import disables imported rules. -- Localized history results and automatic rule names (unit tests passed; Turkish UI smoke test pending): +- Localized history results and automatic rule names (unit tests passed): - New records store locale-neutral result codes; known legacy successful results render in current app language. - SMS recipients stay masked; raw technical failures remain redacted fallback text. + - English, Turkish, and system-language switching passed physical-device validation; active background notification text and channel metadata refresh immediately. - Sound profile denied Notification Policy Access behavior. - Run history screen smoke test on Xiaomi 15T Pro / HyperOS 3. - NFC tag trigger non-matching/engine-stopped paths. diff --git a/docs/assets/js/app.js b/docs/assets/js/app.js index e0be930..38968ce 100644 --- a/docs/assets/js/app.js +++ b/docs/assets/js/app.js @@ -1,4 +1,4 @@ -// Rule definitions for Interactive Workbench +// Conceptual examples for Interactive Workbench; not serialized exports const rules = [ { screen: "home_screen", @@ -34,18 +34,18 @@ const translations = { nav_install: "Kurulum", hero_badge: "Açık Kaynak & Bağımsız", hero_title: "Root Gerektirmeyen Android Otomasyon Motoru.", - hero_desc: "Gereksiz pil tüketen sürekli arka plan servisleri ve hantal yapılar yerine; Shizuku IPC, Kotlin Coroutines ve modern Android olay yayınlarıyla çalışan hafif, gizlilik odaklı otomasyon.", - btn_download: "APK İndir (v1.0.2)", + hero_desc: "Olay tabanlı Android yayınları ve yalnız etkin kurallar gerektiğinde çalışan dinleyicilerle; Shizuku IPC ve Kotlin Coroutines kullanan gizlilik odaklı otomasyon.", + btn_download: "APK İndir (v1.1.0)", btn_copy: "KOPYALA", copied: "✓ KOPYALANDI", stat_apk_label: "APK Boyutu", stat_runtime_label: "Çalışma Modeli", stat_shizuku_label: "Yetki Katmanı", stat_telemetry_label: "Telemetri & Ağ", - stat_telemetry_val: "0 telemetri (Yalnızca yapılandırılan webhook'lar ağ kullanır)", + stat_telemetry_val: "0 telemetri (Kullanıcının açıkça kullandığı ağ, SMS ve paylaşım özellikleri hariç)", wb_label: "İnteraktif Kural Mühendisliği", wb_title: "Uygulamayı ve Otomasyon Mantığını İnceleyin", - wb_desc: "Aşağıdaki hazır kuralları seçerek hem cihaz ekranındaki görünümünü hem de arkasındaki veri/eylem yapısını canlı olarak görün.", + wb_desc: "Aşağıdaki hazır kuralları seçerek cihaz ekranını ve kavramsal otomasyon örneklerini inceleyin; gösterilen kod serileştirilmiş dışa aktarma biçimi değildir.", rule_0_title: "Gece Rutini (Sessiz & Ekran)", rule_0_tag: "ZAMAN", rule_0_summary: "Saat 23:00 olunca otomatik parlaklığı kapat, seviyeyi %10 yap ve Rahatsız Etmeyin'e geç.", @@ -65,20 +65,20 @@ const translations = { th_legacy: "Geleneksel / Diğer Araçlar", comp_row_1_title: "Arka Plan Kaynak Tüketimi", comp_row_1_old: "Sürekli çalışan Foreground Service ve Wake-Lock", - comp_row_1_new: "Olay tabanlı (Event-driven) Broadcast & WorkManager", + comp_row_1_new: "Olay tabanlı alıcılar ve ihtiyaç odaklı dinleyiciler", comp_row_2_title: "Ayrıcalıklı Sistem Erişimi", comp_row_2_old: "Root veya karmaşık ADB WRITE_SECURE_SETTINGS betikleri", comp_row_2_new: "Standart Shizuku IPC (Root gerektirmez)", comp_row_3_title: "Uygulama Boyutu & Şişkinlik", comp_row_4_title: "Gizlilik & Telemetri", comp_row_4_old: "Crashlytics, analitik SDK'ları, hesap zorunluluğu", - comp_row_4_new: "Sıfır telemetri, sıfır hesap, yalnızca kullanıcı yapılandırırsa ağ", + comp_row_4_new: "Sıfır telemetri ve hesap; dış iletişim yalnız açıkça kullanılan özelliklerle", comp_row_5_title: "Kaynak Kod Lisansı", comp_row_5_old: "Kapalı kaynak (Proprietary / Ücretli)", comp_row_5_new: "%100 Açık Kaynak (GitHub / Bağımsız)", mat_label: "Yetkinlik Haritası", mat_title: "Desteklenen Tetikleyiciler ve Eylemler", - mat_desc: "FlowPilot, Android'in yerel API sınırları dahilinde çalışırken, ayrıcalıklı işlemler için Shizuku'dan yararlanır.", + mat_desc: "FlowPilot; NFC arka plan onayı, güvenli kural çoğaltma, çakışma uyarıları ve İngilizce/Türkçe uygulama diliyle Android'in yerel API sınırları içinde çalışır.", cat_triggers: "Tetikleyiciler (Triggers)", trig_time: "Belirli Saat / Periyot", trig_geofence: "Coğrafi Konum Alanı (Geofence)", @@ -87,6 +87,7 @@ const translations = { trig_wifi_state: "Wi-Fi Bağlandı / Kesildi", trig_wifi_ssid: "Belirli SSID Eşleşmesi", trig_bt_state: "Bluetooth Cihaz Durumu", + trig_nfc: "NFC Etiketi (arka planda onaylı)", cat_display_audio: "Ekran, Güç ve Ses", act_bright_level: "Ekran Parlaklığı Ayarı", act_bright_auto: "Otomatik Parlaklık Aç/Kapa", @@ -96,7 +97,7 @@ const translations = { cat_hardware: "Donanım & Sistem Kontrolü", act_wifi_toggle: "Wi-Fi Aç / Kapat", act_bt_toggle: "Bluetooth Aç / Kapat", - act_hotspot: "Taşınabilir Erişim Noktası", + act_hotspot: "Mobil Veri / Uçak Modu", act_launch_app: "Uygulama / Aktivite Başlat", act_notify: "Özel Sistem Bildirimi", gal_label: "Arayüz Vitrini", @@ -112,10 +113,10 @@ const translations = { gal_4_sub: "Sürüm, lisans ve cihaz ayrıcalık durumu.", inst_label: "Hızlı Dağıtım", inst_title: "Kurulum & Shizuku Yapılandırması", - inst_desc: "Root gerekmez. Kablosuz Hata Ayıklama (Android 11+) veya tek bir ADB komutuyla 60 saniyede hazır.", + inst_desc: "Root gerekmez. Shizuku, Android 11+ Kablosuz Hata Ayıklama veya USB üzerinden başlatılabilir.", step_1_badge: "ADIM 01", step_1_title: "APK'yı Yükleyin", - step_1_desc: "GitHub Releases sayfasından derlenmiş FlowPilot-v1.0.2.apk dosyasını indirin veya ADB ile doğrudan cihaza kurun.", + step_1_desc: "GitHub Releases sayfasından derlenmiş FlowPilot-v1.1.0.apk dosyasını indirin veya ADB ile doğrudan cihaza kurun.", step_2_badge: "ADIM 02", step_2_title: "Shizuku'yu Başlatın", step_2_desc: "Geliştirici Seçenekleri'nden Kablosuz Hata Ayıklama üzerinden eşleyin veya cihazınızı USB ile bağlayıp terminalden başlatın.", @@ -138,18 +139,18 @@ const translations = { nav_install: "Installation", hero_badge: "Open Source & Independent", hero_title: "Rootless Android Automation Engine.", - hero_desc: "Forget bloated battery-draining foreground wake-locks and complex background services. FlowPilot delivers lean, privacy-first automation powered by Shizuku IPC, Kotlin Coroutines, and native Android broadcasts.", - btn_download: "Download APK (v1.0.2)", + hero_desc: "Privacy-focused automation using Shizuku IPC, Kotlin Coroutines, event-driven Android broadcasts, and listeners activated only when enabled rules need them.", + btn_download: "Download APK (v1.1.0)", btn_copy: "COPY", copied: "✓ COPIED", stat_apk_label: "APK Size", stat_runtime_label: "Runtime Model", stat_shizuku_label: "Privilege Layer", stat_telemetry_label: "Telemetry & Network", - stat_telemetry_val: "Zero telemetry (network only for configured webhooks)", + stat_telemetry_val: "Zero telemetry (excluding explicitly used network, SMS, and sharing features)", wb_label: "Interactive Rule Engineering", wb_title: "Inspect the App & Automation Logic", - wb_desc: "Select any rule preset below to inspect both its on-device screenshot and the underlying structured rule definition AST.", + wb_desc: "Select a preset to inspect its on-device screen and a conceptual automation example; shown code is not the serialized export format.", rule_0_title: "Night Routine (Silent & Display)", rule_0_tag: "TIME", rule_0_summary: "At 23:00, turn off auto-brightness, set display brightness to 10%, and enable Do Not Disturb.", @@ -169,20 +170,20 @@ const translations = { th_legacy: "Legacy / Other Tools", comp_row_1_title: "Background Resource Footprint", comp_row_1_old: "Continuous Foreground Service & persistent Wake-Lock", - comp_row_1_new: "Event-driven BroadcastReceiver & WorkManager", + comp_row_1_new: "Event-driven receivers and demand-driven listeners", comp_row_2_title: "Privileged System Access", comp_row_2_old: "Root or brittle ADB WRITE_SECURE_SETTINGS scripts", comp_row_2_new: "Standard Shizuku IPC (No root required)", comp_row_3_title: "App Size & Bloat", comp_row_4_title: "Privacy & Telemetry", comp_row_4_old: "Crashlytics, third-party analytics SDKs, mandatory account", - comp_row_4_new: "Zero telemetry, zero accounts, network only when user configures it", + comp_row_4_new: "Zero telemetry and accounts; external communication only through explicitly used features", comp_row_5_title: "Source Code License", comp_row_5_old: "Closed source (Proprietary / Paid subscriptions)", comp_row_5_new: "100% Open Source (GitHub / Independent)", mat_label: "Capability Matrix", mat_title: "Supported Triggers and Actions", - mat_desc: "FlowPilot operates within Android's official permission framework and leverages Shizuku for privileged hardware toggles.", + mat_desc: "FlowPilot works within Android's native API boundaries with background NFC confirmation, safe rule duplication, conflict warnings, and English/Turkish app language selection.", cat_triggers: "Triggers", trig_time: "Specific Time / Interval", trig_geofence: "Geofence Area (Enter / Exit)", @@ -191,6 +192,7 @@ const translations = { trig_wifi_state: "Wi-Fi Connected / Disconnected", trig_wifi_ssid: "Specific SSID Match", trig_bt_state: "Bluetooth Device State", + trig_nfc: "NFC Tag (background confirmation)", cat_display_audio: "Display, Power & Audio", act_bright_level: "Manual Screen Brightness", act_bright_auto: "Auto-Brightness Toggle", @@ -200,7 +202,7 @@ const translations = { cat_hardware: "Hardware & System Controls", act_wifi_toggle: "Wi-Fi Toggle", act_bt_toggle: "Bluetooth Toggle", - act_hotspot: "Portable Hotspot", + act_hotspot: "Mobile Data / Airplane Mode", act_launch_app: "Launch App / Activity", act_notify: "Custom System Notification", gal_label: "UI Showcase", @@ -216,10 +218,10 @@ const translations = { gal_4_sub: "Build version, license, and device privilege status.", inst_label: "Fast Deployment", inst_title: "Installation & Shizuku Setup", - inst_desc: "No root required. Ready in under 60 seconds via Wireless Debugging (Android 11+) or a single ADB shell command.", + inst_desc: "No root required. Shizuku can be started through Wireless Debugging on Android 11+ or over USB.", step_1_badge: "STEP 01", step_1_title: "Install the APK", - step_1_desc: "Download FlowPilot-v1.0.2.apk from GitHub Releases or sideload it directly with adb install.", + step_1_desc: "Download FlowPilot-v1.1.0.apk from GitHub Releases or sideload it directly with adb install.", step_2_badge: "STEP 02", step_2_title: "Start Shizuku", step_2_desc: "Pair via Wireless Debugging in Developer Options or start it over USB via the standard start script.", @@ -340,7 +342,7 @@ function setLang(lang, persist = true) { } function copyAdbInstall(el) { - const cmd = "adb install FlowPilot-v1.0.2.apk"; + const cmd = "adb install FlowPilot-v1.1.0.apk"; if (window.getSelection) { window.getSelection().removeAllRanges(); } diff --git a/docs/index.html b/docs/index.html index 935af63..421e5a8 100644 --- a/docs/index.html +++ b/docs/index.html @@ -26,7 +26,7 @@ FlowPilot - v1.0.2 + v1.1.0
@@ -82,21 +82,21 @@

- Gereksiz pil tüketen sürekli arka plan servisleri ve hantal yapılar yerine; Shizuku IPC, Kotlin Coroutines ve modern Android olay yayınlarıyla çalışan hafif, gizlilik odaklı otomasyon. + Olay tabanlı Android yayınları ve yalnız etkin kurallar gerektiğinde çalışan dinleyicilerle; Shizuku IPC ve Kotlin Coroutines kullanan gizlilik odaklı otomasyon.

- + - APK İndir (v1.0.2) + APK İndir (v1.1.0)
- adb install FlowPilot-v1.0.2.apk + adb install FlowPilot-v1.1.0.apk KOPYALA
@@ -105,11 +105,11 @@

APK Boyutu
-
~20.6 MB (Debug APK; release is optimized)
+
Release asset (see GitHub Releases)
Çalışma Modeli
-
Event-Driven (0 Wake-Lock)
+
Event-Driven (No persistent wake-locks)
Yetki Katmanı
@@ -117,7 +117,7 @@

Telemetri & Ağ
-
0 telemetri (Yalnızca yapılandırılan webhook'lar ağ kullanır)
+
0 telemetri (Kullanıcının açıkça kullandığı ağ, SMS ve paylaşım özellikleri hariç)

@@ -130,7 +130,7 @@

Uygulamayı ve Otomasyon Mantığını İnceleyin

- Aşağıdaki hazır kuralları seçerek hem cihaz ekranındaki görünümünü hem de arkasındaki veri/eylem yapısını canlı olarak görün. + Aşağıdaki hazır kuralları seçerek cihaz ekranını ve kavramsal otomasyon örneklerini inceleyin; gösterilen kod serileştirilmiş dışa aktarma biçimi değildir.

@@ -179,7 +179,7 @@

Uygulamayı ve Otomasyon Mantığ
flowpilot_rule_night_mode.json - PARSED AST + CONCEPT

           
@@ -212,7 +212,7 @@

Neden Geleneksel Araçlar Yerin Arka Plan Kaynak Tüketimi Sürekli çalışan Foreground Service ve Wake-Lock - Olay tabanlı (Event-driven) Broadcast & WorkManager + Olay tabanlı alıcılar ve ihtiyaç odaklı dinleyiciler Ayrıcalıklı Sistem Erişimi @@ -221,13 +221,13 @@

Neden Geleneksel Araçlar Yerin Uygulama Boyutu & Şişkinlik - 60 MB - 140 MB - ~20.6 MB (Debug APK; release is optimized) + Varies by app and configuration + Release asset size published on GitHub Gizlilik & Telemetri Crashlytics, analitik SDK'ları, hesap zorunluluğu - Sıfır telemetri, sıfır hesap, yalnızca kullanıcı yapılandırırsa ağ + Sıfır telemetri ve hesap; dış iletişim yalnız açıkça kullanılan özelliklerle Kaynak Kod Lisansı @@ -247,7 +247,7 @@

Neden Geleneksel Araçlar Yerin

Desteklenen Tetikleyiciler ve Eylemler

- FlowPilot, Android'in yerel API sınırları dahilinde çalışırken, ayrıcalıklı işlemler için Shizuku'dan yararlanır. + FlowPilot; NFC arka plan onayı, güvenli kural çoğaltma, çakışma uyarıları ve İngilizce/Türkçe uygulama diliyle Android'in yerel API sınırları içinde çalışır.

@@ -266,6 +266,7 @@

Desteklenen Tetikleyiciler ve Ey
  • Wi-Fi Bağlandı / KesildiNetworkCallback
  • Belirli SSID EşleşmesiLocation/Wifi
  • Bluetooth Cihaz DurumuBluetoothAdapter
  • +
  • NFC Etiketi (arka planda onaylı)ReaderMode
  • @@ -293,7 +294,7 @@

    Desteklenen Tetikleyiciler ve Ey
    • Wi-Fi Aç / KapatShizuku IPC
    • Bluetooth Aç / KapatShizuku / API
    • -
    • Taşınabilir Erişim NoktasıShizuku IPC
    • +
    • Mobil Veri / Uçak ModuShizuku IPC
    • Uygulama / Aktivite BaşlatPackageManager
    • Özel Sistem BildirimiNotificationManager
    @@ -356,7 +357,7 @@

    Material 3 Expressive Tasarımı

    Kurulum & Shizuku Yapılandırması

    - Root gerekmez. Kablosuz Hata Ayıklama (Android 11+) veya tek bir ADB komutuyla 60 saniyede hazır. + Root gerekmez. Shizuku, Android 11+ Kablosuz Hata Ayıklama veya USB üzerinden başlatılabilir.

    @@ -367,7 +368,7 @@

    Kurulum & Shizuku Yapılandırm
    ADIM 01
    APK'yı Yükleyin
    - GitHub Releases sayfasından derlenmiş FlowPilot-v1.0.2.apk dosyasını indirin veya ADB ile doğrudan cihaza kurun. + GitHub Releases sayfasından derlenmiş FlowPilot-v1.1.0.apk dosyasını indirin veya ADB ile doğrudan cihaza kurun.
    @@ -426,7 +427,7 @@

    Kurulum & Shizuku Yapılandırm
    List of devices attached
    2407FRK8EC    device # Xiaomi 15T Pro

    -
    $ adb install FlowPilot-v1.0.2.apk
    +
    $ adb install FlowPilot-v1.1.0.apk
    Performing Streamed Install
    Success