Skip to content

Release 2.15.0#691

Merged
AndreyEmtsov merged 68 commits intomasterfrom
release/2.15.0
Apr 6, 2026
Merged

Release 2.15.0#691
AndreyEmtsov merged 68 commits intomasterfrom
release/2.15.0

Conversation

@itmindbox
Copy link
Copy Markdown
Contributor

Updates the release version to 2.15.0. Automated PR: merge release/2.15.0 into master

itmindbox and others added 30 commits January 16, 2026 11:26
Merge 'master' into 'develop' after release
* MOBILEWEBVIEW-3 Added Facade using spi

* MOBILEWEBVIEW-3 Updated WebViewController

* MOBILEWEBVIEW-3 Updated transparentView

* MOBILEWEBVIEW-3 Added MindboxWebView

* MOBILEWEBVIEW-3 PR Fix

* MOBILEWEBVIEW-3 PR Fix Lint

* MOBILEWEBVIEW-3 PR Fix naming

---------

Co-authored-by: Vailence <utekeshev@mindbox.cloud>
Solution without GItLab API token

With manual distribution, you can specify the branch name for the app. If there is no such branch, the workflow will fail and the logs will show an error stating that the branch could not be found.
In all other cases, I always try to trigger a build on GitLab with the exact same branch as the one on which the distribution workflow runs. If there is no such branch, it triggers a build in GitLab on develop.
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
* WMSDK-Bridge Message

* WMSDK- Move down extensions in WebViewController

* WMSDK-Added WebView + JS Bridge

* WMSDK-Simple variation

* WMSDK-Second iteration

* WMSDK-Third iteration

all good yet

* WMSDK-Old script from Native side

* WMSDK-Added customPage

* WMSDK-Updated error message

* WMSDK-Added direct BridgeMessage delegate

* WMSDK-Update id save/remove

* WMSDK-0000 Refactor code

* WMSDK-0000 Bridge Message dispatcher

* WMSDK-0000 Remove custom JS from SDK

* WMSDK-0000 Remove unused MindboxWebView

* WMSDK-0000 Added protocol

* WMSDK-0000 Update test html (remove later)

* WMSDK-0000 Fix warnings

* WMSDK-0000 Add start method after init

* WMSDK-0000 Ready event

* WMSDK-0000 Fix PR Comments

* WMSDK-0000 Added TODOs for future generations

* WMSDK-0000 Fix linter

* WMSDK-0000 Uncomment bridge.send

* WMSDK-0000 Updated log about SDKBridge missing

---------

Co-authored-by: Vailence <utekeshev@mindbox.cloud>
#644)

- Always call `decisionHandler` in `decidePolicyFor`
- Call `completion` when `webView` is deallocated in `evaluateJavaScript`
- Call `onFailure` when `webView` is deallocated in `loadHTML`
…d/ID

- RequestMessageHandler now skips automatic response for "ready" action
- sendReadyEvent now accepts request ID to send single response with correct ID and payload
- Fixes issue where iOS sent two ready responses: first with {success: true}, second with params string
- Log all incoming messages from JS (reception + handling)
- Log all outgoing messages to JS (sending + delivery status)
- Log parsing errors and delivery failures
- Add version and timestamp info to all logs
MOBILEWEBVIEW-23: Fix duplicate ready responses with incorrect payload/ID
MOBILEWEBVIEW-23: Add detailed logging for WebView Bridge traffic
… `MindboxWebBridge`

Changed `webView` reference from `strong` to `weak` in `MindboxWebBridge` to break the retain cycle between `WKWebView` and its `scriptMessageHandler`.
Pass operation name and body through InApp presentation layers to WebView, centralizing payload building in `MindboxWebViewFacade.buildStartPayload()`.
…e` and pass to `WebView`

- Add `lastTrackVisit` property to `SessionTemporaryStorage`
- Store `source` (`direct`/`link`/`push`) and `requestUrl` on each `track-visit`
- Pass `trackVisitSource` and `trackVisitRequestUrl` to `WebView` startup payload
- Use `TrackVisitSource` enum for type safety
Implemented infrastructure for passing device capabilities and system
information to WebView on initialization:

- Created Permissions module with cross-platform compatible models
  (PermissionStatus, PermissionStatusValue) designed to work with Android SDK
- Implemented PermissionProvider for checking notification, camera,
  microphone, photo library, and location permissions
- Created SystemInfoProvider for collecting theme, platform, locale,
  app version, and safe area insets
- Integrated providers into WebView initialization payload
- Added DI registration for new providers

The WebView now receives:
- System info: theme, platform (ios), locale, version
- Safe area insets: top, left, bottom, right
- Permissions: only granted permissions are included
- All existing data: trackVisit, operation, userVisitCount, etc.
MOBILEWEBVIEW-25: Pass info to WebView initialization
- Bump sdkVersionNumeric to 12
- Remove webview from variant-level types (modal/snackbar/webview → modal/snackbar)
- Remove payload workaround (getWebviewFromPayload)
- Parse webview as $type in background layers inside modal variant
- Support arbitrary JSON in params via JSONValue
- Remove unused type field from WebviewContentBackgroundLayer
- Fix missing webview case in ContentBackgroundLayer equality comparison
* MOBILEWEBVIEW-22: Remove JSON stubs for ConfigParsing tests

* MOBILEWEBVIEW-22: Update PKL stubs

* MOBILEWEBVIEW-22: Add InApp stubs

* MOBILEWEBVIEW-22: Add unit tests

* MOBILEWEBVIEW-22: Add WebView InApp tests

* MOBILEWEBVIEW-22: Add params tests

* MOBILEWEBVIEW-22: Fix ABTests unit tests with `sdkVersion.min = 999`

* MOBILEWEBVIEW:22: Add webview layer filter tests
- Add 4 JSON stubs for webview layer validation scenarios
- Add tests: valid webview layer, missing baseUrl/contentUrl, mixed image+webview layers
* MOBILEWEBVIEW-51 Added featureToggles

* MOBILEWEBVIEW-51 Renamed param

* MOBILEWEBVIEW-51 Shared

* MOBILEWEBVIEW-51 Scalable features

* MOBILEWEBVIEW-51: Register FeatureToggleManager via DI instead of singleton

---------

Co-authored-by: Vailence <utekeshev@mindbox.cloud>
…nd bridge improvements

- Add onClickAction callback for WebView to handle click with URL/payload
- Implement asyncOperation (queue to DB) and syncOperation (send and await response) via JS bridge
- Centralize bridge action names in BridgeMessage.Action
- Use deferredActions set for actions that send custom bridge responses
- Pass inAppId to WebView facade for start payload
- Fix payload parsing to handle plain string values without double encoding
- Remove unused InAppMessageUIModel
… and WebView

Replace dual callbacks (onTapAction + onClickAction) with a single
onTapAction: (URL?, String) -> Void for all InApp types.

- Simplify UseCase protocol to execute() -> (url, payload)? — UseCases
  now only extract data without tracking or closing
- Move click tracking from UseCases to PresentationDisplayUseCase
- Add ContentBackgroundLayerAction.handleTap() as shared extraction facade
- Remove InAppActionHandler layer (no longer needed)
- Unify onClose handling in Modal and Snackbar
Vailence and others added 26 commits March 3, 2026 15:22
…ng (#656)

* MOBILEWEBVIEW-27: Add InappShowFailureManager with DI and tests

Introduce a thread-safe in-app show failure manager with deduplication and buffered event enqueueing, then wire it into the event operation map and DI container.
Add targeted unit and DI registration tests to validate failure buffering behavior and container resolution.

* MOBILEWEBVIEW-27: Add feature toggle guard for failure sending

Check shouldSendInAppShowError at the start of sendFailures and skip enqueueing when disabled.
Update DI wiring and unit tests to cover disabled and re-enabled toggle behavior.

* MOBILEWEBVIEW-27: Fix 5xx handling for geo network requests

Return serverError for HTTP 5xx when needBaseResponse is false and add geo tests for success and 5xx cases using URLProtocol-based session injection.

* MOBILEWEBVIEW-27: Add pull request template

Add a repository pull request template file to standardize PR descriptions and review checklist formatting.

* MOBILEWEBVIEW-27: Refactor handleResponse complexity without behavior changes

* [MOBILEWEBVIEW-27]: Stabilize in-app show failure flow (#657)

* MOBILEWEBVIEW-27: Inject failure manager into in-app scheduler

* MOBILEWEBVIEW-27: Do not buffer in-app failures when disabled

* MOBILEWEBVIEW-27: Make InappShowFailureManager asynchronous and stabilize tests

* MOBILEWEBVIEW-27: Add debug logs and tests for in-app failure flow

- Replace prints with Logger.common(.debug) when feature is disabled
- Add schedule manager tests for clearFailures/sendFailures callbacks

---------

Co-authored-by: Vailence <utekeshev@mindbox.cloud>

* [MOBILEWEBVIEW-27]: Geo/segmentation caching and targeting failure handling (#658)

* MOBILEWEBVIEW-27: Inject failure manager into in-app scheduler

* MOBILEWEBVIEW-27: Do not buffer in-app failures when disabled

* MOBILEWEBVIEW-27: Make InappShowFailureManager asynchronous and stabilize tests

* MOBILEWEBVIEW-27: Add prioritized targeting failure handling

Propagate geo/segment/product-segment server errors into InappShowFailureManager with per-inapp priority, cache geo request result for repeat completions, and skip failure collection during remaining targeting pass to avoid duplicate addFailure entries.

* MOBILEWEBVIEW-27: Cache segmentation request result

Cache segmentation success/failure in session storage and reuse it on retries.

* MOBILEWEBVIEW-27: Simplify InappShowFailureManager queue handling and add event assertions in tests

---------

Co-authored-by: Vailence <utekeshev@mindbox.cloud>

* [MOBILEWEBVIEW-27]: Image download refactor and in-app show failure integration (#660)

* MOBILEWEBVIEW-27: Inject failure manager into in-app scheduler

* MOBILEWEBVIEW-27: Do not buffer in-app failures when disabled

* MOBILEWEBVIEW-27: Make InappShowFailureManager asynchronous and stabilize tests

* MOBILEWEBVIEW-27: Add prioritized targeting failure handling

Propagate geo/segment/product-segment server errors into InappShowFailureManager with per-inapp priority, cache geo request result for repeat completions, and skip failure collection during remaining targeting pass to avoid duplicate addFailure entries.

* MOBILEWEBVIEW-27: Cache segmentation request result

Cache segmentation success/failure in session storage and reuse it on retries.

* MOBILEWEBVIEW-27: Type image download errors as MindboxError

* MOBILEWEBVIEW-27: Refactors ImageDownloadService logic

Extracts the complex download result processing, error handling, and image reading logic from the main `downloadImage` method into dedicated private functions.

Improves code readability, maintainability, and separation of concerns within the image download service.

* MOBILEWEBVIEW-27: Align in-app failure reasons and image failure tracking

---------

Co-authored-by: Vailence <utekeshev@mindbox.cloud>

* [MOBILEWEBVIEW-27]: Stabilize in-app presentation and extend unit coverage (#663)

* MOBILEWEBVIEW-27: Inject failure manager into in-app scheduler

* MOBILEWEBVIEW-27: Do not buffer in-app failures when disabled

* MOBILEWEBVIEW-27: Make InappShowFailureManager asynchronous and stabilize tests

* MOBILEWEBVIEW-27: Add prioritized targeting failure handling

Propagate geo/segment/product-segment server errors into InappShowFailureManager with per-inapp priority, cache geo request result for repeat completions, and skip failure collection during remaining targeting pass to avoid duplicate addFailure entries.

* MOBILEWEBVIEW-27: Cache segmentation request result

Cache segmentation success/failure in session storage and reuse it on retries.

* MOBILEWEBVIEW-27: Type image download errors as MindboxError

* MOBILEWEBVIEW-27: Refactors ImageDownloadService logic

Extracts the complex download result processing, error handling, and image reading logic from the main `downloadImage` method into dedicated private functions.

Improves code readability, maintainability, and separation of concerns within the image download service.

* MOBILEWEBVIEW-27: Align in-app failure reasons and image failure tracking

* MOBILEWEBVIEW-27: Propagate in-app presentation errors consistently

Route presentation and webview runtime failures to the schedule-level error handler so show-failure reporting stays consistent, while enforcing single-shot error handling for each presentation flow.

* MOBILEWEBVIEW-27: Trigger WebView onPresented on JS init

Align WebView presentation semantics with actual visual readiness by firing onPresented after JS init makes the window visible, while keeping the callback single-shot.

* MOBILEWEBVIEW-27 Clearing failures if not passed business validation

* [MOBILEWEBVIEW-27]: Add unit tests for in-app presentation error handling

Add unit coverage for error mapping and new presentation failure paths, and introduce small test seams for display use case and WebView window access to make these scenarios testable.

* MOBILEWEBVIEW-27: Replace debug prints in in-app failure manager

* MOBILEWEBVIEW-27: Update in-app failure manager logging

---------

Co-authored-by: Vailence <utekeshev@mindbox.cloud>

* [MOBILEWEBVIEW-27]: Improve error handling in InappShowFailureManager (#667)

* [MOBILEWEBVIEW-27]: Unify 500 error handling regardless of needBaseResponse flag

* [MOBILEWEBVIEW-27]: Add log on successful Inapp.ShowFailure event send

* [MOBILEWEBVIEW-27]: Add detailed errorDetails for server errors in addFailure

Include statusCode, networkTimeMs and response body in the error message
instead of generic "Internal Server error" text.

* [MOBILEWEBVIEW-27]: Handle unknown errors in image download failure tracking

* [MOBILEWEBVIEW-27]: Distinguish connection errors from other failures in image download

* [MOBILEWEBVIEW-27]: Simplify pull request template

* [MOBILEWEBVIEW-27]: Fix SwiftLint warnings

* [MOBILEWEBVIEW-27]: Move networkTimeMs into ResponseContext to reduce parameter count

* MOBILEWEBVIEW-27: Extract NSError extension into a dedicated file

---------

Co-authored-by: Vailence <utekeshev@mindbox.cloud>

---------

Co-authored-by: Vailence <utekeshev@mindbox.cloud>
Co-authored-by: Sergei Semko <28645140+justSmK@users.noreply.github.com>
* MOBILEWEBVIEW-27: Restrict addFailure to filtered inapps only

Save failure-eligible inapp sets (segmentInapps, geoInapps,
productSegmentInapps) before expanding context with all valid inapps,
then restore them after. This ensures API requests use full segment data
while failures are only recorded for inapps that passed all filters.

* MOBILEWEBVIEW-27: Restrict addFailure to filtered inapps only

Use failedTargetingInappIds parameter name and optimize Set creation in InappMapper.

* MOBILEWEBVIEW-27: Include image URL in image download failure details

---------

Co-authored-by: Vailence <utekeshev@mindbox.cloud>
…669)

* MOBILEWEBVIEW-63: Add optional tags field to InApp config

* MOBILEWEBVIEW-63: Extend Inapp.Show request with tags and timeToDisplay

* MOBILEWEBVIEW-63: Add trigger-to-display performance metric for in-app messages

* MOBILEWEBVIEW-63: Move trackView with timeToDisplay into InappScheduleManager

Move InApp.View tracking from PresentationDisplayUseCase into
InappScheduleManager so that timeToDisplay is computed and sent
alongside the view event. Store processingDuration directly in
ScheduledInapp instead of a separate dictionary. Increase WebView
quiz init timeout from 7s to 20s.

* MOBILEWEBVIEW-63: Extract WebView timeout into constant and add tests

* MOBILEWEBVIEW-63: Simplify optional tags decoding

---------

Co-authored-by: Vailence <utekeshev@mindbox.cloud>
#671)

Implement native key-value storage for WebView InApps via bridge actions
`localState.get`, `localState.set`, and `localState.init`. Data is stored in
a separate UserDefaults suite with key prefix to filter out Apple system
keys. `Version` is stored in `PersistenceStorage` and passed in the `ready` event payload for JS migration logic.

Add unit tests for `WebViewLocalStateStorage` (Swift Testing).
…tion (#672)

* MOBILEWEBVIEW-96: Add firstInitializationDateTime to PersistenceStorage

Add write-once firstInitializationDateTime property to track the
original SDK initialization date. Inline migration in install()
preserves existing installationDate for upgrading users before it
gets overwritten on config changes.

* MOBILEWEBVIEW-96: Send firstInitializationDateTime in ready payload

Pass firstInitializationDateTime as ISO 8601 string in the WebView
bridge ready response. Extract track-visit logic into a helper to
keep cyclomatic complexity within limits.

* MOBILEWEBVIEW-96: Extract ISO 8601 formatter and add unit tests

Move fileprivate ISO 8601 Date formatter from MBDate.swift into
shared Date+Extensions.swift. Add MockPersistenceStorage support
and unit tests covering inline migration, write-once semantics,
reset and softReset behavior.

* MOBILEWEBVIEW-96: Add firstInitializationDateTime migration

* MOBILEWEBVIEW-96: Split firstInitialization runtime tests

* MOBILEWEBVIEW-96: Move firstInitialization migration to dedicated file

* MOBILEWEBVIEW-96: Move firstInitializationDateTime earlier and fix ISO8601 parsing

* MOBILEWEBVIEW-96: Migrate firstInitializationDateTime tests to Swift Testing

Migration tests fully converted to Swift Testing struct suite.
Runtime tests split: storage-only tests moved to Swift Testing,
CoreController-dependent tests kept on XCTest (no TEST_HOST).

---------

Co-authored-by: Vailence <utekeshev@mindbox.cloud>
* MOBILEWEBVIEW-101: Add PermissionHandler protocol, result type, and registry

* MOBILEWEBVIEW-101: Add PushNotificationsPermissionHandler and move Permissions to shared location

Move Permissions/ from WebView/Bridge/ to InAppMessages/ since
permissions are a cross-cutting concern reused outside of the bridge.
PushPermissionHelper now delegates to PushNotificationsPermissionHandler
as the single source of truth.

* MOBILEWEBVIEW-101: Add LocationPermissionHandler with Info.plist validation

* MOBILEWEBVIEW-101: Add PushNotificationsPermissionHandler and move Permissions to shared location

Move Permissions/ from WebView/Bridge/ to InAppMessages/ since
permissions are a cross-cutting concern reused outside of the bridge.
PushPermissionHelper now delegates to PushNotificationsPermissionHandler
as the single source of truth.

* MOBILEWEBVIEW-101: Add unit tests for permission handlers and bridge messages

* MOBILEWEBVIEW-101: Update permission handlers and add bridge contract docs

* MOBILEWEBVIEW-101: Rename status to result and remove dialogShown from permission response

* MOBILEWEBVIEW-101: Add camera, microphone, photoLibrary permission handlers

* MOBILEWEBVIEW-101: Add parameterized test for all permission types parsing

* MOBILEWEBVIEW-101: Add new permission handler files to Xcode project

* MOBILEWEBVIEW-101: Apply code review fixes to permission handlers

- Add PermissionHandlerRegistryProtocol for DI abstraction
- Wrap LocationPermissionHandler in DispatchQueue.main for run loop safety
- Block re-entrant location permission requests with isRequestInProgress flag
- Fix PushPermissionHelper to use DI registry instead of direct instantiation
- Rename requestOrOpenSettings to requestPermission
- Standardize log category to .webViewInAppMessages and add [WebView] prefix
- Add Equatable conformance to PermissionRequestResult
- Extract sendPermissionResponse helper to reduce duplication
- Merge .authorized and .limited cases in PhotoLibraryPermissionHandler
- Remove outdated docs/permission-request-bridge-contract.md

---------

Co-authored-by: Vailence <utekeshev@mindbox.cloud>
…ages (#674)

* MOBILEWEBVIEW-99: Add haptic feedback support for WebView in-app messages

Supported haptic types:
- selection (UISelectionFeedbackGenerator)
- impact: light, medium, heavy, soft (iOS 13+), rigid (iOS 13+)
- notification: success, warning, error (iOS only)
- pattern: custom Core Haptics sequences (iOS 13+)

Architecture:
- HapticRequest — typed model parsed from bridge payload
- HapticRequestParser — BridgeMessage → HapticRequest conversion
- HapticRequestValidator — pattern validation (max 128 events, 30s total, 5s per event, intensity/sharpness 0...1)
- HapticService — executes haptic with generator caching and prepare() pre-warming

* MOBILEWEBVIEW-99: Inject `HapticService` via DI container
…rmissionHelper (#675)

* MOBILEWEBVIEW-132: Keep only pushNotifications permission, add dialogShown and settings redirect

Remove location, camera, microphone, photoLibrary permission handlers — only pushNotifications remains.
Add dialogShown flag to PermissionRequestResult to indicate whether the system dialog was shown.
Split behavior: WebView InApp returns dialogShown in response without navigating to settings,
regular InApp opens notification settings when permission was previously denied.

* MOBILEWEBVIEW-132: Move PushPermissionHelper to Permissions folder

Extract PushPermissionHelper from PushPermissionActionUseCase.swift
into its own file under Permissions/ where it logically belongs
alongside the handler registry and permission infrastructure.

* MOBILEWEBVIEW-132: Add PushPermissionHelper tests, fix registry scope, improve testability

- Add PushPermissionHelperTests covering granted/denied/dialogShown scenarios
- Change PermissionHandlerRegistry scope from .transient to .container
  to avoid redundant re-creation on each resolve
- Add registry parameter to PushPermissionHelper.requestPermission
  for dependency injection in tests

* MOBILEWEBVIEW-132: Revert PermissionHandlerRegistry scope back to .transient

Registry is lightweight (one handler) and resolved only on user action,
no need to keep it in memory for the entire SDK lifetime.

---------

Co-authored-by: Vailence <utekeshev@mindbox.cloud>
…` or `universal link` fires (#677)

- Add `skipNextDirectTrackVisit` flag to `TrackVisitManager`
- `trackForeground` (keepalive) no longer overwrites `lastTrackVisit` in `SessionTemporaryStorage`
- Add `TrackVisitManagerTests` (10 tests covering deduplication, flag reset, keepalive)
… `lastTrackVisitTimestamp` (#678)

On cold start via `push/link`, the duplicate `direct` was the only call that set `lastTrackVisitTimestamp` after SDK initialization. Removing the duplicate left the `timestamp` `nil`, preventing `session expiration` until the next foreground.
* MOBILE-41: Add openSettings bridge action constant

* MOBILE-41: Add SettingsType enum and openSettings handler to TransparentView

* MOBILE-41: Add unit tests for openSettings bridge action

* MOBILE-41: Extract SettingsType and SettingsRequestParser into separate files

MOBILE-41: Add Settings group files to Xcode project

* MOBILE-41: Inline application settings handler, reuse openViaUIApplication

* MOBILE-41: Rename openSettings to settings.open, use target instead of type

* MOBILE-41: Inline SettingsType into SettingsRequestParser, remove separate file

---------

Co-authored-by: Vailence <utekeshev@mindbox.cloud>
…eground (#683)

Cancel the in-app timeout timer when the app enters background and restart
it when returning to foreground, preventing false timeouts during backgrounding.

Co-authored-by: Vailence <utekeshev@mindbox.cloud>
…notifications (#684)

Previously `notifications` sent success to JS synchronously before
iOS confirmed the settings screen was opened, while `application`
waited for the UIApplication.open completion handler. Now both
targets wait for the iOS callback before responding to JS.

Added optional completion handler to
PushPermissionHelper.openPushNotificationSettings to avoid
duplicating URL construction logic.

Co-authored-by: Vailence <utekeshev@mindbox.cloud>
Replace raw CACurrentMediaTime() timestamp with ForegroundStopwatch
that pauses during app background, so timeToDisplay only reflects
foreground time spent loading and presenting in-app messages.

Co-authored-by: Vailence <utekeshev@mindbox.cloud>
…p messages (#681)

* MOBILE-42: Add motion gestures (`shake` & `flip`) for `WebView` in-app messages

Bridge protocol: `motion.start`, `motion.stop` (JS→Native), `motion.event` (Native→JS).
Shake uses system `UIResponder.motionEnded`, flip uses `CMMotionManager` deviceMotion gravity across 3 axes with hysteresis (enter 0.8g / exit 0.6g) to detect 6 device positions without flickering.

Sensors auto-suspend on app background and resume on foreground.
Returns error via bridge if requested sensors are unavailable.

Suppresses system Undo Typing alert when shake is active (saves and restores host app's `applicationSupportsShakeToEdit`).
Gravity processing on background queue, JS callbacks on main thread.
Unit tests for hysteresis-based position resolution.

* MOBILE-42: Fix `applicationSupportsShakeToEdit` not being restored on deallocation

- Add stopMonitoring() in TransparentView.deinit to clean up motion resources
- Restore applicationSupportsShakeToEdit in MotionService.deinit (restoreShakeToEdit
  with [weak self] won't fire during deallocation chain)
- Guard handleSystemShake() to avoid lazy init of unused MotionService
- Add MotionServiceShakeToEditTests covering deinit, stop, and restart paths
- Migrate FirstInitializationDateTimeRuntimeTests from XCTest to Swift Testing

* MOBILE-42: Skip `stopMonitoring()` when no active gestures

* MOBILE-0000: Document bridge actions and refactor code organization (#682)

Add comprehensive doc comments to all `BridgeMessage.Action` cases with `payload/response` examples in Apple DocC format.
Group actions by domain (Lifecycle, Operations, Navigation, Local State, Haptic, Motion) in enum, switch dispatcher, and `isDeferred`.
Remove unused `userAgent` action.
- stopMonitoring without prior startMonitoring is a no-op
- Double stopMonitoring does not crash or alter state
- Repeated startMonitoring replaces previous gesture set
Also move misplaced no-op test out of ShakeToEditTests.
Delete 7 BuildFile records with missing fileRef that were left behind as stale references in the Xcode project file.
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
* MOBILE-0000: Wrap `isInspectable` in #if DEBUG and fix file headers

* MOBILE-0000: Simplify and translate PR template to English
@justSmK justSmK marked this pull request as draft April 1, 2026 11:15
@justSmK justSmK marked this pull request as ready for review April 3, 2026 11:33
@AndreyEmtsov AndreyEmtsov merged commit 0f3f064 into master Apr 6, 2026
10 of 15 checks passed
@AndreyEmtsov AndreyEmtsov deleted the release/2.15.0 branch April 6, 2026 07:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants