goodm4ven/nativephp-muttasiq-patches
NativePHP Muttasiq Patches
An internal package for Muttasiq that applies the NativePHP build patches required on top of nativephp/mobile during Android and iOS builds.
This package is not meant to be a broad, general-purpose plugin. It is a small compatibility layer for Muttasiq that replaces manual patch scripts with an official NativePHP plugin hook.
Compatibility
- NativePHP Mobile
3.2.x(verified against3.2.2). - Patch anchors are maintained against the current
resources/androidstudioandresources/xcodesources shipped by NativePHP Mobile 3.2.
Objectives
- Applies the required
EDGEpatches innativephp/mobileso empty navigation components are not rendered and nested native component trees are preserved correctly. - Patches
MainActivity.ktto improve system bars,safe-areainjection, native back handling, and WebView state behavior. - Adds Android splash-timing guard so warm launches keep splash visible for a short minimum duration (~1.6s floor), and harmonizes splash backdrop color with dark/light system theme to reduce startup flash.
- Adds Android Quran startup lifecycle tracing from
MainActivity.kt(onResume/onPause) to bothlogcatand in-WebView custom events (quran-native-lifecycle) for debugging reader boot visibility/calibration issues. - Adds Android bridge method
getAppFirstInstallTime()so WebView-side state can detect reinstall fingerprints and reset stale Quran reader local storage when Android restores old WebView data. - Adds Android bridge method
restartApplication()so WebView flows can request a full native app restart (finish + process exit + relaunch intent) after first-run Quran data bootstrap. - Adds Android bridge method
setScreenAwake(boolean)so WebView readers can toggleFLAG_KEEP_SCREEN_ONonly while immersive reading is active. - Adds iOS WebKit bridge handler
screenAwakeso WebView readers can toggleUIApplication.shared.isIdleTimerDisabledwhile immersive reading is active. - Patches Android
AndroidManifest.xml+ backup rule XMLs to disable cloud/device-transfer backup for app storage domains, preventing restored stale WebView/localStorage reader state after uninstall/reinstall. - Patches
WebViewManager.ktto install early request capture forLivewireandFilament, while preserving NativePHP 3.2 request-id forwarding (X-NativePHP-Req-Id) used by Android POST body replay. - Keeps
WebViewManager.ktrequest inspector hooks and noisy per-request logging debug-aware, reducing release-build interception/log overhead without removing request capture compatibility. - Patches
PHPBridge.ktto validate that persistent runtime boot is actually usable before enabling persistent mode, and auto-fallbacks to classic request handling if runtime boot state is lost. - Patches
PHPWebViewClient.ktso Muttasiq's Quran page fonts are streamed directly from the bundled raw-data files, and binary asset misses no longer fall back through the unsafe JNI string bridge. - Includes route-aware Android Quran font interception for
qpc-v2-fonts,quran-surah-header-font, and supportedquran-basmallah-font/*requests so those font responses never flow through the PHP JNI string bridge. - Patches
LaravelEnvironment.ktbundle extraction to stream ZIP entries directly to disk (instead of buffering large files in memory), preventing first-launchOutOfMemoryErrorduring Laravel bundle extraction. - Adds Android startup phase timing logs (bundle unzip, native bootstrap, environment initialize, persistent runtime boot, onReady dispatch, splash dismiss) so cold-start bottlenecks can be profiled directly from
logcat. - Rewrites Android's
laravel_bundle.zipafter NativePHP builds it so the dormant Quran exegesis payload, generated local Quran snapshot artifacts (database/native-quran-reader.*), build debug sidecars (public/build/assets/*.map,*.LICENSE.txt), and stale Vite files not referenced bypublic/build/manifest.jsonare removed before the APK is packaged, avoiding Composer autoload regressions from vendor-package pruning while shrinking first-launch extraction. - Skips extracting the dormant Quran exegesis database bundle on Android first launch as a second line of defense when older or unpruned bundles are still present.
- Keeps Android startup database bootstrap minimal (empty sqlite +
storage:linkwhen needed +app:native-bootstrap) so Quran payload can be delivered later by the app-level download flow instead of inflating first-launch extraction. - Forces Android native runtime queue execution to
syncso app-level bootstrap/download jobs do not depend on a separate queue worker process. - Propagates optional build-time
NATIVE_*_ENDPOINToverrides into Android runtime environment variables so local-source API broadcasts can be consumed by app HTTP jobs and startup sync, and auto-rewrites loopback overrides (127.0.0.1/localhost) to detected LAN IPv4 unless explicitly pinned. - Emits a concise Android runtime environment summary in
logcatfor queue + endpoint variables after NativePHP environment setup, so local broadcast endpoint issues are visible without digging through bundled files. - Patches
PHPQueueWorker.ktto runqueue:workin verbose mode and log queue command output, making native snapshot/import failures visible during Android debugging. - Keeps Android
LaravelEnvironment.ktsummary logging idempotent across repeated patch runs. - Patches iOS
ContentView.swiftto keep Muttasiq's edge-swipe back handling aligned with the app's in-web navigation behavior, while warning if upstream system UI layout expectations change. - Patches iOS
NativePHPApp.swiftandAppUpdateManager.swiftso native startup and app updates stay on sqlite and use the app-specific bootstrap command instead of rawmigrate --force. - Patches
MainActivity.ktwith a small JavaScript bridge so Muttasiq can opt into Quran page navigation via the Android hardware volume buttons. - Keeps patch anchors tolerant of upstream engine refactors where possible, including Compose modifier-chain changes in
MainActivity.kt. - Runs as a NativePHP
pre_compilehook, so separate shell patch scripts are no longer needed during builds.
Patches
native-edge: patchesTopBar,BottomNav, andEdgeinternals.native-system-ui: patchesMainActivity.ktfor system bars,safe-area, first-launch reload behavior, and disabled WebView state saving.native-system-ui: includes startup timing traces for environment boot lifecycle phases and splash dismiss timing.native-system-ui: includes Quran lifecycle startup tracing dispatch (quran-native-lifecycle) from Android activity lifecycle hooks for runtime diagnostics.native-system-ui: includes Android bridge exposure ofgetAppFirstInstallTime()for native reinstall fingerprinting on the WebView side.native-system-ui: includes Android bridge exposure ofrestartApplication()for app-driven full restart flows after native Quran bootstrap completion.native-system-ui: includes Android bridge exposure ofsetScreenAwake(boolean)to controlFLAG_KEEP_SCREEN_ONfrom WebView reader lifecycles.native-ios-back: includes iOSscreenAwakeWebKit message handler and injected JS bridge (window.AndroidBridge.setScreenAwake) to controlisIdleTimerDisabledfrom WebView reader lifecycles.native-back-handler: upgrades native back button delegation so it first closes any open Filament modal in the WebView, then falls back to app navigation logic.native-back-handler: includes close-button fallback dispatch for Filament modals to ensure hardware back consumes open modals before view navigation.native-back-handler: includes explicit root-hash (#main-menu/#) exit fallback so Android system back quits the app when web navigation is already at the main menu.native-google-reviews: applies the app-specific Google review handling adjustments inside the activity.native-request-capture: installs reliable early interception forLivewireandFilamentrequests.native-request-capture: debug-gates request inspector work and verbose per-request logging for lower release runtime overhead.native-persistent-runtime-guard: verifies persistent runtime readiness after boot, and degrades to classic handling if Android ever returnsRuntime not bootedduring persistent dispatch.native-android-assets: resolves Quran page fonts directly from the bundled raw-data tree and blocks binary-asset PHP fallback that would otherwise crash Android onNewStringUTF.native-android-assets: also resolves the route-backed Quran header and supported basmallah font endpoints from the bundled raw-data tree to avoid JNI crashes on binary font responses.native-bundle-extract: prunes the dormant Quran exegesis payload, generated local Quran snapshot artifacts (database/native-quran-reader.*), build debug sidecars (public/build/assets/*.map,*.LICENSE.txt), stalepublic/build/assets/*entries not referenced bypublic/build/manifest.json, dev-only Composer package directories fromcomposer.lock(packages-dev), Arabicable raw-data source artifacts (vendor/goodm4ven/arabicable/resources/raw-data/**/source-*), and additional non-runtime bundle paths/files (vendor docs/tests/fixtures/.github, vendor source maps, and root build/test metadata likephpstan.neon,phpunit.xml,pest.php) from Android's generatedlaravel_bundle.zip; also stores already-compressed binary asset types (woff2, images, sqlite/db, gzip/zip, etc.) without re-deflating while rewriting the archive to reduce cold-start unzip CPU overhead. It patchesLaravelEnvironment.ktunzip behavior to use streaming extraction with ZIP slip protection (including normalized path guards and a larger extraction buffer for lower per-entry overhead), keeps a runtime exegesis skip fallback, forces native queue execution tosync, applies optionalNATIVE_*_ENDPOINTruntime overrides (with loopback-to-LAN normalization unlessNATIVE_ANDROID_KEEP_LOOPBACK_ENDPOINTS=1), and swaps rawmigrate --forceforapp:native-bootstrap --no-interaction.native-bundle-extract: includes unzip and bootstrap timing summaries inlogcatto isolate cold-start delays by phase.native-queue-worker-verbosity: patchesPHPQueueWorker.ktso Android queue ticks run with verbose Artisan output and include queue output logs inlogcat.native-no-backup: patches Android manifest backup flags and backup rule XMLs to disable backup/restore for file, database, shared-pref, external, and root app domains.native-ios-system-ui: verifies the upstream iOS layout structure still exposes the top and bottom native chrome that Muttasiq expects.native-ios-back: patchesContentView.swiftso the native left-edge gesture delegates to the app's web back action before falling back to WebView history.native-ios-db-bootstrap: patchesNativePHPApp.swiftso iOS startup and embedded artisan execution stay on sqlite, and classic/fallback startup paths still run migrations before serving requests.native-ios-app-updates: patchesAppUpdateManager.swiftso app updates also use the app-specific bootstrap command.native-quran-volume-buttons: patchesMainActivity.ktso Muttasiq can enable Android hardware volume keys for Quran page navigation only while the reader is active.
iOS SQLite startup fix
This package includes an iOS startup fix for a failure mode where the app launches but immediately fails with:
SQLSTATE[HY000]: General error: 1 no such table: settings
The issue happens when native startup or embedded artisan execution uses a non-sqlite default connection inside iOS runtime, so migrations never apply to the simulator/device sqlite database, or only run on one startup path.
The native-ios-db-bootstrap patch addresses this by:
- forcing sqlite context for iOS native runtime environment setup
- forcing sqlite context for embedded artisan execution in
NativePHPApp.swift - ensuring the classic and persistent-fallback startup paths still run migrations before the first request
Installation
composer require goodm4ven/nativephp-muttasiq-patches
php artisan vendor:publish --tag=nativephp-plugins-provider --no-interaction
php artisan native:plugin:register goodm4ven/nativephp-muttasiq-patches --no-interaction
Usage
This package does not expose a Facade, bridge functions, or native events for app-level consumption. It is a build-time plugin only.
Once registered, NativePHP will invoke the following dispatcher automatically during builds:
php artisan nativephp:muttasiq:patches
That dispatcher is wired through the pre_compile hook declared in nativephp.json, and forwards to the platform-specific commands:
php artisan nativephp:muttasiq:patches-android
php artisan nativephp:muttasiq:patches-ios
Development
If you are developing this package locally alongside the main app, wire it into the project as a path repository or local Composer dependency, then rebuild the native project you need:
php artisan native:install android --force --no-interaction
php artisan native:run android
php artisan native:install ios --force --no-interaction
php artisan native:run ios
The app-side native prepare wrappers refresh nativephp/<platform> whenever the plugin patch sources change. If you bypass those wrappers, reinstall manually before retesting so the pruned Android bundle is regenerated.
[!NOTE] Internal package: this package was written primarily for Muttasiq. It may still be reusable elsewhere, but its assumptions currently follow this app's engine behavior and integration constraints.
License
This package is licensed under the GNU Affero General Public License v3.0 (AGPL-3.0-only). See LICENSE.