From e978ce937428deae629f5ef32cb30262854efe79 Mon Sep 17 00:00:00 2001 From: Elijah Semyonov Date: Thu, 18 Apr 2024 13:36:55 +0200 Subject: [PATCH] Add markers --- .../compose/mpp/demo/bugs/ModalMemoryLeak.kt | 13 ++++++------- .../compose/ui/scene/ComposeSceneMediator.uikit.kt | 9 +++++++++ .../ui/scene/UIViewComposeSceneLayer.uikit.kt | 9 ++++++++- 3 files changed, 23 insertions(+), 8 deletions(-) diff --git a/compose/mpp/demo/src/uikitMain/kotlin/androidx/compose/mpp/demo/bugs/ModalMemoryLeak.kt b/compose/mpp/demo/src/uikitMain/kotlin/androidx/compose/mpp/demo/bugs/ModalMemoryLeak.kt index b3923db8249de..a3dcbfd380562 100644 --- a/compose/mpp/demo/src/uikitMain/kotlin/androidx/compose/mpp/demo/bugs/ModalMemoryLeak.kt +++ b/compose/mpp/demo/src/uikitMain/kotlin/androidx/compose/mpp/demo/bugs/ModalMemoryLeak.kt @@ -34,9 +34,12 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.runtime.DisposableEffect +import androidx.compose.runtime.SideEffect import platform.posix.free import platform.posix.malloc +private var modalsOpen = 0 + @OptIn(ExperimentalMaterial3Api::class, ExperimentalMaterialApi::class) val ModalMemoryLeak = Screen.Example("ModalMemoryLeak") { MaterialTheme { @@ -56,13 +59,9 @@ val ModalMemoryLeak = Screen.Example("ModalMemoryLeak") { }, sheetState = sheetState, ) { - DisposableEffect(Unit) { - val a = malloc((20_000 * 1024).toULong()) - - onDispose { - println("Disposed") - free(a) - } + SideEffect { + modalsOpen++ + println("Modal opened: $modalsOpen") } Text("ModalBottomSheet3", Modifier.height(500.dp)) } diff --git a/compose/ui/ui/src/uikitMain/kotlin/androidx/compose/ui/scene/ComposeSceneMediator.uikit.kt b/compose/ui/ui/src/uikitMain/kotlin/androidx/compose/ui/scene/ComposeSceneMediator.uikit.kt index 3332bb55c97fe..46038f8671c73 100644 --- a/compose/ui/ui/src/uikitMain/kotlin/androidx/compose/ui/scene/ComposeSceneMediator.uikit.kt +++ b/compose/ui/ui/src/uikitMain/kotlin/androidx/compose/ui/scene/ComposeSceneMediator.uikit.kt @@ -78,6 +78,7 @@ import androidx.compose.ui.window.UITouchesEventPhase import kotlin.coroutines.CoroutineContext import kotlin.math.roundToInt import kotlinx.cinterop.CValue +import kotlinx.cinterop.ExportObjCClass import kotlinx.cinterop.readValue import kotlinx.cinterop.useContents import org.jetbrains.skia.Canvas @@ -98,6 +99,7 @@ import platform.UIKit.UITouchPhase import platform.UIKit.UIView import platform.UIKit.UIViewControllerTransitionCoordinatorProtocol import platform.UIKit.UIWindow +import platform.darwin.NSObject /** * Layout of sceneView on the screen @@ -109,6 +111,10 @@ internal sealed interface SceneLayout { class Bounds(val renderBounds: IntRect, val interactionBounds: IntRect) : SceneLayout } +@ExportObjCClass +class ComposeSceneMediatorMarker: NSObject() { + +} /** * iOS specific-implementation of [PlatformContext.SemanticsOwnerListener] used to track changes in [SemanticsOwner]. * @@ -215,6 +221,7 @@ internal class ComposeSceneMediator( coroutineContext: CoroutineContext ) -> ComposeScene ) { + private val marker = ComposeSceneMediatorMarker() private val keyboardOverlapHeightState: MutableState = mutableStateOf(0.dp) private var _layout: SceneLayout = SceneLayout.Undefined private var constraints: List = emptyList() @@ -499,6 +506,8 @@ internal class ComposeSceneMediator( ) fun dispose() { + println("Disposed") + uiKitTextInputService.stopInput() applicationStateListener.dispose() focusStack?.popUntilNext(renderingView) diff --git a/compose/ui/ui/src/uikitMain/kotlin/androidx/compose/ui/scene/UIViewComposeSceneLayer.uikit.kt b/compose/ui/ui/src/uikitMain/kotlin/androidx/compose/ui/scene/UIViewComposeSceneLayer.uikit.kt index 9bdb3d31c4828..ce99658f99edb 100644 --- a/compose/ui/ui/src/uikitMain/kotlin/androidx/compose/ui/scene/UIViewComposeSceneLayer.uikit.kt +++ b/compose/ui/ui/src/uikitMain/kotlin/androidx/compose/ui/scene/UIViewComposeSceneLayer.uikit.kt @@ -43,6 +43,7 @@ import androidx.compose.ui.window.RenderingUIView import kotlin.coroutines.CoroutineContext import kotlin.math.max import kotlinx.cinterop.CValue +import kotlinx.cinterop.ExportObjCClass import kotlinx.cinterop.readValue import kotlinx.cinterop.useContents import org.jetbrains.skiko.SkikoRenderDelegate @@ -54,6 +55,12 @@ import platform.UIKit.UIEvent import platform.UIKit.UITouch import platform.UIKit.UIView import platform.UIKit.UIViewControllerTransitionCoordinatorProtocol +import platform.darwin.NSObject + +@ExportObjCClass +class SceneLayerMarker: NSObject() { + +} internal class UIViewComposeSceneLayer( private val composeContainer: ComposeContainer, @@ -64,7 +71,7 @@ internal class UIViewComposeSceneLayer( windowContext: PlatformWindowContext, compositionContext: CompositionContext, ) : ComposeSceneLayer { - + private val marker = SceneLayerMarker() override var focusable: Boolean = focusStack != null private var onOutsidePointerEvent: ((eventType: PointerEventType) -> Unit)? = null private val rootView = composeContainer.view.window ?: composeContainer.view