From cea9a97b1f588ff0a3f9e9d00beece61db30b0db Mon Sep 17 00:00:00 2001 From: Viktor Savchik Date: Tue, 13 Jan 2026 23:35:30 +0100 Subject: [PATCH 1/3] Add screen ignore list management APIs Adds removeScreenNameToIgnore() and removeAllScreenNamesToIgnore() to dynamically manage which screens are excluded from recording. Addresses #13 --- .../src/androidMain/kotlin/dev/onexeor/uxcam/UXCam.kt | 8 ++++++++ .../src/commonMain/kotlin/dev/onexeor/uxcam/UXCam.kt | 4 ++++ .../src/iosMain/kotlin/dev/onexeor/uxcam/UXCam.kt | 8 ++++++++ 3 files changed, 20 insertions(+) diff --git a/uxcam-kmp-shared/src/androidMain/kotlin/dev/onexeor/uxcam/UXCam.kt b/uxcam-kmp-shared/src/androidMain/kotlin/dev/onexeor/uxcam/UXCam.kt index daf3df6..798aca0 100644 --- a/uxcam-kmp-shared/src/androidMain/kotlin/dev/onexeor/uxcam/UXCam.kt +++ b/uxcam-kmp-shared/src/androidMain/kotlin/dev/onexeor/uxcam/UXCam.kt @@ -46,6 +46,14 @@ actual object UXCam { UXCam.addScreenNamesToIgnore(screenNames) } + actual fun removeScreenNameToIgnore(screenName: String) { + UXCam.removeScreenNameToIgnore(screenName) + } + + actual fun removeAllScreenNamesToIgnore() { + UXCam.removeAllScreenNamesToIgnore() + } + actual fun allowShortBreakForAnotherApp(b: Boolean) { UXCam.allowShortBreakForAnotherApp(b) } diff --git a/uxcam-kmp-shared/src/commonMain/kotlin/dev/onexeor/uxcam/UXCam.kt b/uxcam-kmp-shared/src/commonMain/kotlin/dev/onexeor/uxcam/UXCam.kt index 7eca0c1..01fafb4 100644 --- a/uxcam-kmp-shared/src/commonMain/kotlin/dev/onexeor/uxcam/UXCam.kt +++ b/uxcam-kmp-shared/src/commonMain/kotlin/dev/onexeor/uxcam/UXCam.kt @@ -16,6 +16,10 @@ expect object UXCam { fun addScreenNamesToIgnore(screenNames: List) + fun removeScreenNameToIgnore(screenName: String) + + fun removeAllScreenNamesToIgnore() + fun allowShortBreakForAnotherApp(b: Boolean) fun pauseScreenRecording() diff --git a/uxcam-kmp-shared/src/iosMain/kotlin/dev/onexeor/uxcam/UXCam.kt b/uxcam-kmp-shared/src/iosMain/kotlin/dev/onexeor/uxcam/UXCam.kt index 0a5c0ae..d313615 100644 --- a/uxcam-kmp-shared/src/iosMain/kotlin/dev/onexeor/uxcam/UXCam.kt +++ b/uxcam-kmp-shared/src/iosMain/kotlin/dev/onexeor/uxcam/UXCam.kt @@ -36,6 +36,14 @@ actual object UXCam { UXCam.addScreenNamesToIgnore(screenNames) } + actual fun removeScreenNameToIgnore(screenName: String) { + UXCam.removeScreenNameToIgnore(screenName) + } + + actual fun removeAllScreenNamesToIgnore() { + UXCam.removeAllScreenNamesToIgnore() + } + actual fun allowShortBreakForAnotherApp(b: Boolean) { UXCam.allowShortBreakForAnotherApp(b) } From 21b344f7489849e505d34e9a7ccf764ecd59e1b2 Mon Sep 17 00:00:00 2001 From: Viktor Savchik Date: Tue, 13 Jan 2026 23:37:10 +0100 Subject: [PATCH 2/3] Add view-level occlusion APIs Adds occludeSensitiveView() and unOccludeSensitiveView() to hide sensitive views from recordings. Takes platform-specific view type (Android View / iOS UIView) as Any parameter. Addresses #9 --- .../androidMain/kotlin/dev/onexeor/uxcam/UXCam.kt | 9 +++++++++ .../src/commonMain/kotlin/dev/onexeor/uxcam/UXCam.kt | 12 ++++++++++++ .../src/iosMain/kotlin/dev/onexeor/uxcam/UXCam.kt | 9 +++++++++ 3 files changed, 30 insertions(+) diff --git a/uxcam-kmp-shared/src/androidMain/kotlin/dev/onexeor/uxcam/UXCam.kt b/uxcam-kmp-shared/src/androidMain/kotlin/dev/onexeor/uxcam/UXCam.kt index 798aca0..961fbf1 100644 --- a/uxcam-kmp-shared/src/androidMain/kotlin/dev/onexeor/uxcam/UXCam.kt +++ b/uxcam-kmp-shared/src/androidMain/kotlin/dev/onexeor/uxcam/UXCam.kt @@ -2,6 +2,7 @@ package dev.onexeor.uxcam +import android.view.View import com.uxcam.OnVerificationListener import com.uxcam.UXCam import com.uxcam.datamodel.UXConfig @@ -38,6 +39,14 @@ actual object UXCam { UXCam.tagScreenName(screenName) } + actual fun occludeSensitiveView(view: Any) { + (view as? View)?.let { UXCam.occludeSensitiveView(it) } + } + + actual fun unOccludeSensitiveView(view: Any) { + (view as? View)?.let { UXCam.unOccludeSensitiveView(it) } + } + actual fun addScreenNameToIgnore(screenName: String) { UXCam.addScreenNameToIgnore(screenName) } diff --git a/uxcam-kmp-shared/src/commonMain/kotlin/dev/onexeor/uxcam/UXCam.kt b/uxcam-kmp-shared/src/commonMain/kotlin/dev/onexeor/uxcam/UXCam.kt index 01fafb4..d4889c0 100644 --- a/uxcam-kmp-shared/src/commonMain/kotlin/dev/onexeor/uxcam/UXCam.kt +++ b/uxcam-kmp-shared/src/commonMain/kotlin/dev/onexeor/uxcam/UXCam.kt @@ -12,6 +12,18 @@ expect object UXCam { fun tagScreenName(screenName: String) + /** + * Marks a view as sensitive to be hidden from recordings. + * @param view Platform-specific view: Android View or iOS UIView + */ + fun occludeSensitiveView(view: Any) + + /** + * Removes occlusion from a previously occluded view. + * @param view Platform-specific view: Android View or iOS UIView + */ + fun unOccludeSensitiveView(view: Any) + fun addScreenNameToIgnore(screenName: String) fun addScreenNamesToIgnore(screenNames: List) diff --git a/uxcam-kmp-shared/src/iosMain/kotlin/dev/onexeor/uxcam/UXCam.kt b/uxcam-kmp-shared/src/iosMain/kotlin/dev/onexeor/uxcam/UXCam.kt index d313615..ee7180e 100644 --- a/uxcam-kmp-shared/src/iosMain/kotlin/dev/onexeor/uxcam/UXCam.kt +++ b/uxcam-kmp-shared/src/iosMain/kotlin/dev/onexeor/uxcam/UXCam.kt @@ -5,6 +5,7 @@ package dev.onexeor.uxcam import cocoapods.UXCam.UXCam import cocoapods.UXCam.UXCamConfiguration +import platform.UIKit.UIView actual object UXCam { @@ -28,6 +29,14 @@ actual object UXCam { UXCam.tagScreenName(screenName) } + actual fun occludeSensitiveView(view: Any) { + (view as? UIView)?.let { UXCam.occludeSensitiveView(it) } + } + + actual fun unOccludeSensitiveView(view: Any) { + (view as? UIView)?.let { UXCam.unOccludeSensitiveView(it) } + } + actual fun addScreenNameToIgnore(screenName: String) { UXCam.addScreenNameToIgnore(screenName) } From 188d985cc9222b05196442bdecef54defb967423 Mon Sep 17 00:00:00 2001 From: Viktor Savchik Date: Tue, 13 Jan 2026 23:46:55 +0100 Subject: [PATCH 3/3] Update README with new privacy APIs --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 08c26b5..b749765 100644 --- a/README.md +++ b/README.md @@ -182,8 +182,12 @@ UXCam.addScreenNamesToIgnore(listOf("LoginScreen", "SettingsScreen")) | `optOutOfSchematicRecordings()` | Opt out of schematic recordings (iOS only) | | `optIntoSchematicRecordings()` | Opt into schematic recordings (iOS only) | | `optInSchematicRecordingStatus()` | Check schematic recording status (iOS only) | +| `occludeSensitiveView(view)` | Hide sensitive view from recordings | +| `unOccludeSensitiveView(view)` | Remove occlusion from a view | | `addScreenNameToIgnore(screenName)` | Exclude screen from recording | | `addScreenNamesToIgnore(screenNames)` | Exclude multiple screens | +| `removeScreenNameToIgnore(screenName)` | Remove screen from ignore list | +| `removeAllScreenNamesToIgnore()` | Clear all ignored screens | | `allowShortBreakForAnotherApp(b)` | Allow short app switches | ### UXConfig