Files
smoa/docs/reference/DEVICE-COMPATIBILITY.md

111 lines
7.4 KiB
Markdown
Raw Normal View History

# Device compatibility Samsung Galaxy Z Fold5 (primary target)
This document describes SMOA compatibility with the **Samsung Galaxy Z Fold5** (model **SM-F946U1**) as the primary target device, and what has been done to ensure the app works correctly on it.
---
## Required target (mandatory minimum)
| Aspect | Required minimum |
|--------|-------------------|
| **Device** | Samsung Galaxy Z Fold5 (SM-F946U1) or equivalent (foldable, 4G/5G capable). |
| **OS** | Android 10 (API 29) or higher; primary target Android 16 (API 36). |
| **App SDK** | `minSdk 24`, `targetSdk 34` (forward compatible on Android 16). |
| **Network** | Cellular (4G LTE or 5G NR) and/or WiFi; optional dual SIM. |
| **Permissions** | INTERNET, ACCESS_NETWORK_STATE; RECORD_AUDIO, CAMERA for meetings; READ_BASIC_PHONE_STATE optional for 5G MW detection. |
Below minSdk 24 the app does not build. For full Android 16 behavior and testing, targetSdk 36 is recommended once the project upgrades the Android Gradle Plugin.
---
## Target device summary
| Attribute | Value |
|-----------|--------|
| **Device** | Samsung Galaxy Z Fold5 (SM-F946U1) |
| **OS** | Android 16, One UI 8.0 |
| **Cellular** | 4G LTE, 5G NR, 5G millimeter wave (5G MW) capable |
| **Connectivity** | Dual SIM (physical + eSIM), e.g. Dark Star + US Mobile |
| **Security** | SE for Android (Enforcing), Knox 3.12, DualDAR 1.8.0 |
| **Form factor** | Foldable (cover screen + inner large screen) |
## App compatibility measures
### 1. SDK and API level
- **Current:** `compileSdk = 34`, `targetSdk = 34`, `minSdk = 24` (see `buildSrc/.../AppConfig.kt`).
- **Android 16** uses **API level 36**. The app is **forward compatible**: it runs on Android 16 with existing targetSdk 34; the system applies compatibility behavior.
- **Recommendation for full Android 16 optimization:** When upgrading the projects Android Gradle Plugin (e.g. to 8.9+), set `compileSdk = 36` and `targetSdk = 36` and test against Android 16.
### 2. Foldable support
- **FoldableStateManager** (`core/common`) tracks folded vs unfolded state using a 600 dp width threshold, suitable for Z Fold5 (narrow cover vs wide inner screen).
- **MainActivity** calls `foldableStateManager.updateFoldState(configuration)` in `onCreate` and **onConfigurationChanged**, so fold/unfold updates the UI without requiring an activity recreate when combined with manifest `configChanges`.
- **Manifest:** `MainActivity` declares
`android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout"`
so that fold/unfold and size changes are delivered to `onConfigurationChanged` and the activity is not recreated unnecessarily.
- **MainScreen** receives `foldableStateManager` and can adapt layout (e.g. list/detail, panels) for folded vs unfolded.
- **PolicyManager** supports a “lock on fold” option for security when the device is folded.
### 3. 4G LTE, 5G, and 5G MW (smart routing)
- **ConnectivityManager** (`core/common`):
- **getActiveTransportType()** WIFI, CELLULAR, VPN, ETHERNET, UNKNOWN.
- **getCellularGeneration()** when transport is CELLULAR, returns LTE_4G, NR_5G, or NR_5G_MW.
- **Cellular generation logic:**
- LTE → `LTE_4G`.
- NR (5G) + `TelephonyDisplayInfo.overrideNetworkType == OVERRIDE_NETWORK_TYPE_NR_ADVANCED` (value 5) → **NR_5G_MW** (millimeter wave); otherwise → **NR_5G**.
- **Permissions:** `READ_BASIC_PHONE_STATE` is declared (optional) to improve accuracy of 4G/5G/5G MW detection on API 29+. Not required for basic connectivity.
- **Smart routing** (e.g. `MediaRoutingPolicy`, `NetworkPathSelector`) uses transport type and cellular generation to prefer 5G / 5G MW over 4G where appropriate.
### 4. Dual SIM / multi-carrier
- The app uses the systems **default data network** and **active network capabilities** via `ConnectivityManager` and `NetworkCapabilities`. It does not bind to a specific subscription ID.
- On dual-SIM devices (e.g. physical SIM + eSIM), the system chooses the active data subscription; SMOAs connectivity and cellular generation logic apply to whichever subscription is currently used for data. No code changes are required for dual SIM per se.
### 5. Permissions (manifest)
- **Network:** INTERNET, ACCESS_NETWORK_STATE.
- **Phone state (optional):** READ_BASIC_PHONE_STATE (for 4G/5G/5G MW detection).
- **Communications:** RECORD_AUDIO, MODIFY_AUDIO_SETTINGS, CAMERA (meetings).
- **Security:** USE_BIOMETRIC, USE_FINGERPRINT, BIND_VPN_SERVICE.
- **Storage:** READ/WRITE_EXTERNAL_STORAGE with `maxSdkVersion="32"` where applicable.
### 6. Knox and SE Android
- The app does not use Knox APIs. It runs as a normal Android app; Knox/SE for Android enforce system policy (e.g. device attestation, MDM) independently.
- If future versions need Knox integration (e.g. Knox SDK for secure storage or VPN), the same device and OS support the required Knox API level (e.g. 39).
## Testing on Z Fold5
- **Fold/unfold:** Open app on cover screen, unfold and fold; confirm layout updates and no unnecessary activity restarts.
- **Network:** Switch between WiFi and cellular; on cellular, confirm 4G vs 5G (and 5G+ where available) is reflected if you surface cellular generation in UI or logs.
- **Dual SIM:** Use one SIM for data, then switch default data to the other; confirm connectivity and routing still work.
- **Meetings/WebRTC:** Verify camera, microphone, and smart routing (e.g. path selection, codec selection) on both WiFi and 5G.
---
## Aspects which scale (client / device)
These dimensions scale with usage, device variety, or backend load. The required target above is the floor.
| Aspect | What it scales with | How it scales |
|--------|---------------------|----------------|
| **API level (minSdk / targetSdk)** | Newer devices, Android 16+ features | Raise minSdk/targetSdk when dropping older OS support; use `Build.VERSION.SDK_INT` checks for optional APIs (e.g. 5G MW on API 31+). |
| **Screen size / density** | Folded vs unfolded, different devices | `FoldableStateManager` (600 dp threshold); responsive layouts; `configChanges` so fold/unfold doesnt recreate Activity. |
| **Network type** | WiFi vs 4G vs 5G vs 5G MW | `ConnectivityManager.getActiveTransportType()` and `getCellularGeneration()`; smart routing and adaptive codecs use these. |
| **Concurrent backend load** | Number of devices syncing / pulling | Backend scales (see [PROXMOX-VE-TEMPLATE-REQUIREMENTS.md](../infrastructure/PROXMOX-VE-TEMPLATE-REQUIREMENTS.md)); app uses rate limit and retries. |
| **WebRTC sessions** | Number of participants, video quality | Adaptive codec policy and connection-quality tier; TURN/signaling and backend infra scale with sessions. |
| **Sync volume** | Directory/orders/evidence/reports per device | Backend disk and DB; app queues and syncs by type; no fixed device-side limit. |
| **Dual SIM / multi-carrier** | Multiple subscriptions | App uses default data network; no per-SIM logic; scales to any number of SIMs as chosen by system. |
| **Permissions** | Features used (meetings, 5G detection) | Optional permissions (e.g. READ_BASIC_PHONE_STATE) scale with feature set; core works without them. |
---
## References
- **Smart routing / QoS:** [SMART-ROUTING-AND-QOS.md](SMART-ROUTING-AND-QOS.md)
- **Media codecs (P2M, adaptive):** [MEDIA-CODECS-AND-P2M.md](MEDIA-CODECS-AND-P2M.md)
- **Backend sync:** `backend/README.md`, `backend/docs/BACKEND-GAPS-AND-ROADMAP.md`
- **Backend/infra scaling:** [PROXMOX-VE-TEMPLATE-REQUIREMENTS.md](../infrastructure/PROXMOX-VE-TEMPLATE-REQUIREMENTS.md)