ΠΠΎΠ΄ΡΠ»ΡΠ½ΡΠΉ ΠΌΡΠ»ΡΡΠΈΠΏΠ»Π°ΡΡΠΎΡΠΌΠ΅Π½Π½ΡΠΉ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ½ΡΠΉ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ, ΡΠ΅Π°ΠΊΡΠΈΠ²Π½ΡΠ΅ Ρ ΡΠΊΠΈ, ΡΠ΅ΡΠ΅Π²ΠΎΠΉ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³, Π½Π°Π²ΠΈΠ³Π°ΡΠΈΡ ΠΈ UI-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ Π΄Π»Ρ Compose Multiplatform.
Compose Foundation β Π²ΡΡΠΎΠΊΠΎΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½Π°Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΠΎΠ±ΡΠ΅Π³ΠΎ Π½Π°Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΈ Π°ΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΠ½ΡΠΉ ΡΡΠ½Π΄Π°ΠΌΠ΅Π½Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΠΈ WHAT Technologies. Π‘ΠΎΠ·Π΄Π°Π½Π° Π΄Π»Ρ ΡΡΠ°Π½Π΄Π°ΡΡΠΈΠ·Π°ΡΠΈΠΈ ΠΈ ΡΡΠΊΠΎΡΠ΅Π½ΠΈΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ Π½Π° Kotlin Multiplatform ΠΈ Compose Multiplatform Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΎΠΉ Android, JVM Desktop (Windows, macOS, Linux), Apple iOS (arm64, simulator, x64) ΠΈ Π±ΡΠ°ΡΠ·Π΅ΡΠ° ΡΠ΅ΡΠ΅Π· WebAssembly (wasmJs).
ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ ΠΏΡΠΎΠ²Π΅ΡΠ΅Π½Π½ΡΠ΅ ΠΏΡΠ°ΠΊΡΠΈΠΊΠΎΠΉ Π°ΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΠ½ΡΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΡ: Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΠ΅ Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ Π½Π°ΡΡΡΠΎΠ΅ΠΊ Ρ Π°ΠΏΠΏΠ°ΡΠ°ΡΠ½ΡΠΌ ΡΠΈΡΡΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ (Android Keystore), React-style ΡΠ΅Π°ΠΊΡΠΈΠ²Π½ΡΠ΅ Ρ
ΡΠΊΠΈ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ (useState, useChange), ΡΠΈΠΏΠΎΠ±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡΡ Π½Π°Π²ΠΈΠ³Π°ΡΠΈΡ Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΎΠΉ ΠΏΠΎΠ»Π½ΠΎΡΠΊΡΠ°Π½Π½ΡΡ
Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ² ΠΈ ΡΡΠΎΡΠΎΠΊ, ΠΈΠ½ΡΠΏΠ΅ΠΊΡΠΎΡ ΡΠ΅ΡΠ΅Π²ΠΎΠ³ΠΎ ΡΡΠ°ΡΠΈΠΊΠ° Ktor, Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ ΠΈ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³ Π΄ΠΎΡΡΡΠΏΠ½ΠΎΡΡΠΈ Π²Π½Π΅ΡΠ½ΠΈΡ
ΡΠ΅ΡΠ²ΠΈΡΠΎΠ².
- ΠΠΎΠ»Π½Π°Ρ ΠΌΡΠ»ΡΡΠΈΠΏΠ»Π°ΡΡΠΎΡΠΌΠ΅Π½Π½ΠΎΡΡΡ β Π΅Π΄ΠΈΠ½ΡΠΉ ΡΠ½ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ API Π΄Π»Ρ Android (AAR), JVM Desktop, iOS ΠΈ WebAssembly.
- ΠΠΎΠ΄ΡΠ»ΡΠ½Π°Ρ Π°ΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΠ° β Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°ΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ ΡΠΎΡΠ΅ΡΠ½ΠΎ (
core,navigation,state,ui,network,updater,preferences,scraper,healthcheck,delivery) Π»ΠΈΠ±ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ umbrella-Π°ΡΡΠ΅ΡΠ°ΠΊΡcompose-foundation. - DX-ΠΎΡΠΈΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΡΠ΅Π°ΠΊΡΠΈΠ²Π½ΡΠ΅ Ρ
ΡΠΊΠΈ β Π»Π°ΠΊΠΎΠ½ΠΈΡΠ½ΡΠ΅ ΠΏΡΠΈΠΌΠΈΡΠΈΠ²Ρ
useState,useChange,useInterval,useTimeout,useSaveΠΈuseRestoreΠ΄Π»Ρ Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΈΠ²Π½ΠΎΠ³ΠΎ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΆΠΈΠ·Π½Π΅Π½Π½ΡΠΌ ΡΠΈΠΊΠ»ΠΎΠΌ ΠΈ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ΠΌ UI. - Π’ΠΈΠΏΠΎΠ±Π΅Π·ΠΎΠΏΠ°ΡΠ½Π°Ρ Π½Π°Π²ΠΈΠ³Π°ΡΠΈΡ β
NavigationHostΡ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠ΅ΠΉ ΡΠΊΡΠ°Π½ΠΎΠ² Π±Π΅Π· ΡΠ΅ΡΠ»Π΅ΠΊΡΠΈΠΈ, Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΠΉRootNavigationContext, Π½Π°Π²ΠΈΠ³Π°ΡΠΈΠΎΠ½Π½ΡΠ΅ ΠΏΠ°Π½Π΅Π»ΠΈ (BottomNavBar), ΠΌΠΎΠ΄Π°Π»ΡΠ½ΡΠ΅ ΡΡΠΎΡΠΊΠΈ ΠΈ Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΡΠ΅ ΡΡΠ΅ΠΊΠΎΠ²ΡΠ΅ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΈ. - ΠΠ°ΡΠΈΡΠ΅Π½Π½ΡΠ΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ (Secure Key-Value) β ΡΠ΅Π°ΠΊΡΠΈΠ²Π½ΠΎΠ΅ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ Π½Π° Π±Π°Π·Π΅ AES-GCM Ρ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠ΅ΠΉ Π°ΠΏΠΏΠ°ΡΠ°ΡΠ½ΠΎΠ³ΠΎ Android Keystore ΠΈ JSON-ΠΏΠ΅ΡΡΠΈΡΡΠ΅Π½ΡΠ½ΠΎΡΡΡΡ Π½Π° Desktop/Web.
- ΠΠ½ΡΠΏΠ΅ΠΊΡΠΎΡ ΡΡΠ°ΡΠΈΠΊΠ° ΠΈ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³ β ΠΏΠΎΡΠΎΠΊΠΎΠ±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡΠΉ ΠΏΠ΅ΡΠ΅Ρ
Π²Π°ΡΡΠΈΠΊ ΡΠ΅ΡΠ΅Π²ΡΡ
Π²ΡΠ·ΠΎΠ²ΠΎΠ² Ktor (
NetworkMonitorPlugin) Ρ ΡΠ°Π½ΠΈΡΠΈΠ·Π°ΡΠΈΠ΅ΠΉ ΡΡΠ²ΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΡΡ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ² ΠΈ Π·Π°ΡΠΈΡΠΎΠΉ ΠΎΡ OOM. - ΠΠ°Π΄Π΅ΠΆΠ½ΡΠ΅ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ ΠΈ Π΄ΠΈΡΡΡΠΈΠ±ΡΡΠΈΡ β ΠΊΠ»ΠΈΠ΅Π½ΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΡΠ΅Π»ΠΈΠ·ΠΎΠ² ΡΠ΅ΡΠ΅Π· GitHub Releases ΠΈ RuStore, ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎΠ΅ ΡΠΊΠ°ΡΠΈΠ²Π°Π½ΠΈΠ΅ Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΎΠΉ Π²ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΡΠ΅Π»ΠΎΡΡΠ½ΠΎΡΡΠΈ APK.
- ΠΠ°ΡΡΠΈΠ½Π³ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΡΠ°Π±ΠΎΡΠΎΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΠΈ ΡΠ΅ΡΠ²ΠΈΡΠΎΠ² β Π³ΠΎΡΠΎΠ²ΡΠ΅ ΠΌΠΎΠ΄ΡΠ»ΠΈ Π²Π΅Π±-ΡΠΊΡΠ°ΠΏΠΈΠ½Π³Π° (
foundation-scraperΠ½Π° Π±Π°Π·Π΅ Ksoup) ΠΈ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³Π° ΡΠ΅ΡΠ΅Π²ΡΡ ΡΠ½Π΄ΠΏΠΎΠΈΠ½ΡΠΎΠ² (foundation-healthcheck,foundation-delivery).
ΠΠΎΠ΄ΡΠ»ΡΠ½Π°Ρ ΡΡΡΡΠΊΡΡΡΠ° ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π³ΠΈΠ±ΠΊΠΎ ΡΠΏΡΠ°Π²Π»ΡΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡΠΌΠΈ ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠΉ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»:
graph TD
subgraph Meta["ΠΠ΅ΡΠ°-ΠΏΠ°ΠΊΠ΅Ρ"]
ALL["compose-foundation<br/><i>ΠΠΊΠ»ΡΡΠ°Π΅Ρ Π²ΡΠ΅ ΠΌΠΎΠ΄ΡΠ»ΠΈ ΡΡΠ°Π½Π·ΠΈΡΠΈΠ²Π½ΠΎ</i>"]
end
subgraph CoreLayer["ΠΠ°Π·ΠΎΠ²ΡΠΉ ΡΠ»ΠΎΠΉ"]
CORE["foundation-core<br/><i>UIController, Logging, Auditor, Platform, Coroutines</i>"]
end
subgraph StateAndDataLayer["Π‘ΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΠΈ Π₯ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅"]
STATE["foundation-state<br/><i>useState, useChange, useInterval, Controllers</i>"]
PREF["foundation-preferences<br/><i>PreferenceStorage, Android Keystore AES-GCM</i>"]
end
subgraph UiAndNavigationLayer["ΠΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ ΠΈ ΠΠ°Π²ΠΈΠ³Π°ΡΠΈΡ"]
UI["foundation-ui<br/><i>Icons, Themes, Base Components, LiquidBackground</i>"]
NAV["foundation-navigation<br/><i>NavigationHost, BottomNavBar, Sheets, Dialogs</i>"]
end
subgraph NetworkAndServicesLayer["Π‘Π΅ΡΠ΅Π²ΠΎΠΉ ΡΡΠ΅ΠΊ ΠΈ Π‘Π΅ΡΠ²ΠΈΡΡ"]
NET["foundation-network<br/><i>NetworkMonitor, Ktor NetworkMonitorPlugin</i>"]
SCRAPER["foundation-scraper<br/><i>Ksoup HTML Scraper, Multiplatform Document Parser</i>"]
HEALTH["foundation-healthcheck<br/><i>Healthcheck Service, UI Ping & Latency Monitors</i>"]
DELIVERY["foundation-delivery<br/><i>Delivery Engine, Remote Sync & Cache</i>"]
UPDATER["foundation-updater<br/><i>GitHubUpdateService, APK Manager, Downloader</i>"]
RUSTORE["foundation-updater-rustore<br/><i>RuStoreUpdateManager</i>"]
FIREBASE["foundation-firebase<br/><i>FirebaseCrashReporter, FirebaseAnalytics</i>"]
CRASH["foundation-crash<br/><i>CrashHandler, Bootloop Guard, CrashScreen</i>"]
end
ALL --> CORE
ALL --> STATE
ALL --> PREF
ALL --> UI
ALL --> NAV
ALL --> NET
ALL --> SCRAPER
ALL --> HEALTH
ALL --> DELIVERY
ALL --> UPDATER
ALL --> RUSTORE
ALL --> FIREBASE
ALL --> CRASH
STATE --> CORE
PREF --> CORE
PREF --> STATE
UI --> CORE
UI --> STATE
UI --> PREF
NAV --> CORE
NAV --> UI
NET --> CORE
SCRAPER --> CORE
SCRAPER --> NET
HEALTH --> CORE
HEALTH --> UI
HEALTH --> NET
DELIVERY --> CORE
DELIVERY --> UI
DELIVERY --> NET
DELIVERY --> PREF
DELIVERY --> UPDATER
UPDATER --> CORE
UPDATER --> UI
RUSTORE --> UPDATER
FIREBASE --> CORE
CRASH --> CORE
CRASH --> UI
| ΠΠΎΠ΄ΡΠ»Ρ | ΠΡΡΠ΅ΡΠ°ΠΊΡ | ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ | ΠΠ»ΡΡΠ΅Π²ΡΠ΅ ΠΊΠ»Π°ΡΡΡ ΠΈ API |
|---|---|---|---|
:foundation-core |
app.what.foundation:foundation-core |
ΠΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ½ΠΎΠ΅ ΡΠ΄ΡΠΎ, MVI-ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΡ, ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ΅Π½Π½ΡΠ΅ ΡΡΠΈΠ»ΠΈΡΡ ΠΈ Π°ΡΠ΄ΠΈΡ Π»ΠΎΠ³ΠΎΠ² | UIController, AppLogger, Auditor, TimeUtils, Platform |
:foundation-state |
app.what.foundation:foundation-state |
Π Π΅Π°ΠΊΡΠΈΠ²Π½ΡΠ΅ Ρ ΡΠΊΠΈ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΠΈ ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΡ ΠΌΠΎΠ΄Π°Π»ΡΠ½ΡΡ ΠΎΠΊΠΎΠ½ | useState, useChange, useInterval, useSave, DialogController, SheetController |
:foundation-preferences |
app.what.foundation:foundation-preferences |
Π Π΅Π°ΠΊΡΠΈΠ²Π½ΠΎΠ΅ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ Π½Π°ΡΡΡΠΎΠ΅ΠΊ Ρ Π°ΠΏΠΏΠ°ΡΠ°ΡΠ½ΡΠΌ ΡΠΈΡΡΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Keystore | PreferenceStorage, AndroidPreferenceEncryptor, KeyValueStorage |
:foundation-ui |
app.what.foundation:foundation-ui |
UI-ΠΏΡΠΈΠΌΠΈΡΠΈΠ²Ρ, Π½Π°Π±ΠΎΡ Π²Π΅ΠΊΡΠΎΡΠ½ΡΡ ΠΈΠΊΠΎΠ½ΠΎΠΊ, ΡΠ΅ΠΌΡ ΠΎΡΠΎΡΠΌΠ»Π΅Π½ΠΈΡ ΠΈ ΡΡΡΠ΅ΠΊΡΡ | SearchBox, StyledTextField, LiquidBackground, WHATIcons |
:foundation-navigation |
app.what.foundation:foundation-navigation |
ΠΠΎΠ΄ΡΠ»ΡΠ½Π°Ρ Π½Π°Π²ΠΈΠ³Π°ΡΠΈΡ Π΄Π»Ρ Compose Multiplatform, ΡΡΠΎΡΠΊΠΈ, ΠΏΠ°Π½Π΅Π»ΠΈ ΠΈ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΈ | Navigator, NavigationHost, BottomNavBar, ProvideGlobalDialog, ProvideGlobalSheet |
:foundation-network |
app.what.foundation:foundation-network |
ΠΠΎΡΠΎΠΊΠΎΠ±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡΠΉ ΠΈΠ½ΡΠΏΠ΅ΠΊΡΠΎΡ ΡΠ΅ΡΠ΅Π²ΡΡ Π·Π°ΠΏΡΠΎΡΠΎΠ² ΠΈ Ktor ΠΏΠ»Π°Π³ΠΈΠ½ | NetworkMonitor, NetworkRequest, NetworkMonitorPlugin |
:foundation-scraper |
app.what.foundation:foundation-scraper |
KMP-ΠΏΠ°ΡΡΠ΅Ρ Π²Π΅Π±-ΡΡΡΠ°Π½ΠΈΡ Π½Π° Π±Π°Π·Π΅ Π»Π΅Π³ΠΊΠΎΠ²Π΅ΡΠ½ΠΎΠ³ΠΎ Ksoup-lite | HtmlDocument, Element, KsoupParser |
:foundation-healthcheck |
app.what.foundation:foundation-healthcheck |
ΠΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³ Π΄ΠΎΡΡΡΠΏΠ½ΠΎΡΡΠΈ ΠΈ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΎΡΠΊΠ»ΠΈΠΊΠ° Π²Π½Π΅ΡΠ½ΠΈΡ ΡΠ΅ΡΠ²Π΅ΡΠΎΠ² ΠΈ ΡΠ½Π΄ΠΏΠΎΠΈΠ½ΡΠΎΠ² | HealthcheckClient, ServiceHealth, HealthIndicator |
:foundation-delivery |
app.what.foundation:foundation-delivery |
ΠΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ ΡΠΎΠ½ΠΎΠ²ΠΎΠΉ Π΄ΠΎΡΡΠ°Π²ΠΊΠΈ ΠΈ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΊΡΡΠ° | DeliveryEngine, SyncCoordinator, RemoteCacheManager |
:foundation-updater |
app.what.foundation:foundation-updater |
ΠΠ²ΡΠΎΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΡΠ΅ΡΠ΅Π· GitHub Releases | GitHubUpdateService, GitHubUpdateManager, DownloadState |
:foundation-updater-rustore |
app.what.foundation:foundation-updater-rustore |
ΠΠ΄Π°ΠΏΡΠ΅Ρ Π°Π²ΡΠΎΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΉ ΡΠ΅ΡΠ΅Π· ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΡΠΉ RuStore SDK | RuStoreUpdateManager |
:foundation-firebase |
app.what.foundation:foundation-firebase |
ΠΡΠ»ΡΡΠΈΠΏΠ»Π°ΡΡΠΎΡΠΌΠ΅Π½Π½ΡΠΉ ΡΠ°ΡΠ°Π΄ Π΄Π»Ρ Firebase Analytics ΠΈ Crashlytics | FirebaseAnalyticsTracker, FirebaseCrashReporter |
:foundation-crash |
app.what.foundation:foundation-crash |
ΠΠ΅ΡΠ΅Ρ Π²Π°ΡΡΠΈΠΊ ΡΠ±ΠΎΠ΅Π², Π·Π°ΡΠΈΡΠ° ΠΎΡ bootloop ΠΈ ΡΠΊΡΠ°Π½ ΠΎΡΡΠ΅ΡΠ° ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅ | CrashHandler, CurrentActivityHolder, CrashScreen |
:compose-foundation |
app.what.foundation:compose-foundation |
ΠΠ΅ΡΠ°-ΠΏΠ°ΠΊΠ΅Ρ (Umbrella), Π²ΠΊΠ»ΡΡΠ°ΡΡΠΈΠΉ Π²ΡΠ΅ ΠΌΠΎΠ΄ΡΠ»ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ | Π’ΡΠ°Π½Π·ΠΈΡΠΈΠ²Π½ΡΠΉ Π΄ΠΎΡΡΡΠΏ ΠΊΠΎ Π²ΡΠ΅ΠΌ ΠΌΠΎΠ΄ΡΠ»ΡΠΌ ΡΠΊΠΎΡΠΈΡΡΠ΅ΠΌΡ |
ΠΠΎΠ±Π°Π²ΡΡΠ΅ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ GitHub Packages ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΠΈ whatrushki Π² Π²Π°Ρ settings.gradle.kts:
dependencyResolutionManagement {
repositories {
google()
mavenCentral()
maven {
url = uri("https://maven.pkg.github.com/whatrushki/compose-foundation")
credentials {
username = providers.gradleProperty("gpr.user").orNull
?: System.getenv("GITHUB_ACTOR")
password = providers.gradleProperty("gpr.key").orNull
?: System.getenv("GITHUB_TOKEN")
}
}
}
}ΠΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΠ΅ ΠΏΠΎΠ»Π½ΡΠΉ ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡ ΠΈΠ»ΠΈ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠ΅ ΠΌΠΎΠ΄ΡΠ»ΠΈ Π² Π²Π°ΡΠ΅ΠΌ build.gradle.kts (Π² Π±Π»ΠΎΠΊΠ΅ commonMain.dependencies):
// ΠΠΎΠ»Π½ΡΠΉ ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡ Π²ΡΠ΅Ρ
ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ²:
implementation("app.what.foundation:compose-foundation:1.1.6")
// ΠΠ»ΠΈ ΡΠΎΡΠ΅ΡΠ½ΠΎ ΠΏΠΎ ΠΌΠΎΠ΄ΡΠ»ΡΠΌ:
implementation("app.what.foundation:foundation-core:1.1.6")
implementation("app.what.foundation:foundation-navigation:1.1.6")
implementation("app.what.foundation:foundation-state:1.1.6")
implementation("app.what.foundation:foundation-preferences:1.1.6")
implementation("app.what.foundation:foundation-ui:1.1.6")
implementation("app.what.foundation:foundation-network:1.1.6")
implementation("app.what.foundation:foundation-scraper:1.1.6")
implementation("app.what.foundation:foundation-healthcheck:1.1.6")
implementation("app.what.foundation:foundation-delivery:1.1.6")
implementation("app.what.foundation:foundation-updater:1.1.6")Π£ΠΏΡΠΎΡΠ°ΡΡ Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΈΠ²Π½ΠΎΠ΅ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠΌ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ΠΌ Π±Π΅Π· Π»ΠΈΡΠ½Π΅Π³ΠΎ boilerplate-ΠΊΠΎΠ΄Π°:
@Composable
fun SearchBar() {
var query by useState("")
// ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠ°Ρ ΡΠ΅Π°ΠΊΡΠΈΡ Π½Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ
useChange(query) {
println("ΠΠΎΠΈΡΠΊΠΎΠ²ΡΠΉ Π·Π°ΠΏΡΠΎΡ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΡΡ: $query")
}
StyledTextField(
value = query,
onValueChange = { query = it },
placeholder = "ΠΠΎΠΈΡΠΊ..."
)
}Π’ΠΈΠΏΠΎΠ±Π΅Π·ΠΎΠΏΠ°ΡΠ½Π°Ρ Π½Π°Π²ΠΈΠ³Π°ΡΠΈΡ Ρ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠ΅ΠΉ ΡΠΊΡΠ°Π½ΠΎΠ² ΠΈ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΎΠΉ Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΡΡ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ² ΠΈ ΡΡΠΎΡΠΎΠΊ:
@Serializable
data object MainRoute : NavProvider()
val appRegistry: Registry = {
register(MainScreen::class) { MainScreen(it) }
}
@Composable
fun App() {
ProvideGlobalDialog {
ProvideGlobalSheet {
NavigationHost(
start = MainRoute,
registry = appRegistry
)
}
}
}ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΡΠΈΡΡΠΎΠ²Π°Π½ΠΈΡ AES-GCM (Android Keystore), ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ ΠΈ ΡΠ΅Π°ΠΊΡΠΈΠ²Π½ΠΎΡΡΠΈ Π² Compose:
@Serializable
data class UserProfile(val name: String, val role: String)
object AppSettings : PreferenceStorage(KeyValueStorageProvider.create()) {
var isDarkTheme by boolean("dark_theme", defaultValue = false)
var profile by model("user_profile", defaultValue = UserProfile("ΠΠΎΡΡΡ", "ΠΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ"))
}
@Composable
fun ThemeToggle() {
val isDark by AppSettings::isDarkTheme.collect()
Switch(checked = isDark, onCheckedChange = { AppSettings.isDarkTheme = it })
}ΠΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³Π° ΠΊ ΡΠ΅ΡΠ΅Π²ΠΎΠΌΡ ΠΊΠ»ΠΈΠ΅Π½ΡΡ Ktor:
val client = HttpClient {
install(NetworkMonitor.Plugin) {
maxMemoryLogs = 200
sanitizeHeaders = listOf("Authorization", "Cookie")
}
}Π‘Π±ΠΎΡΠΊΠ° Π²ΡΠ΅Ρ ΡΠ°ΡΠ³Π΅ΡΠΎΠ² Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎ:
./gradlew assembleΠΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΡ Π² Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠΉ ΠΊΡΡ Maven:
./gradlew publishToMavenLocalΠΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΡ Π² GitHub Packages:
./gradlew publishAllPublicationsToGitHubPackagesRepository- ΠΠ°Π³-ΡΡΠ΅ΠΊΠ΅Ρ ΠΈ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΡ: GitHub Issues.
- ΠΡΠΈΡΠΈΠ°Π»ΡΠ½ΡΠ΅ ΠΊΠ°Π½Π°Π»Ρ ΠΊΠΎΠΌΠΌΡΠ½ΠΈΠΊΠ°ΡΠΈΠΈ: Telegram @whatrushki.