From c9b1452d6c6ddcb26c8f1e1681e544ed767deb5e Mon Sep 17 00:00:00 2001 From: Srikrishna Sakunia Date: Wed, 22 Oct 2025 10:14:22 +0100 Subject: [PATCH 1/4] This PR contains Snippets that will be hosted in the New Visibility API DAC. --- .../snippets/modifiers/VisibilitySnippets.kt | 155 ++++++++++++++++++ 1 file changed, 155 insertions(+) create mode 100644 compose/snippets/src/main/java/com/example/compose/snippets/modifiers/VisibilitySnippets.kt diff --git a/compose/snippets/src/main/java/com/example/compose/snippets/modifiers/VisibilitySnippets.kt b/compose/snippets/src/main/java/com/example/compose/snippets/modifiers/VisibilitySnippets.kt new file mode 100644 index 000000000..3e2099499 --- /dev/null +++ b/compose/snippets/src/main/java/com/example/compose/snippets/modifiers/VisibilitySnippets.kt @@ -0,0 +1,155 @@ +package com.example.compose.snippets.modifiers + +import androidx.annotation.DrawableRes +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.material3.Card +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.layout.onFirstVisible +import androidx.compose.ui.layout.onVisibilityChanged +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.unit.dp + +private object OnVisibilityChangedSample { + + @Composable + fun OnVisibilityChangedExample(modifier: Modifier = Modifier) { + // [START android_compose_modifiers_onVisibilityChanged] + Text( + text = "Some text", + modifier = Modifier + .onVisibilityChanged { visible -> + if (visible) { + // Do something if visible + } else { + // Do something if not visible + } + } + .padding(vertical = 8.dp) + ) + // [END android_compose_modifiers_onVisibilityChanged] + } +} + +private object OnVisibilityChangedMinFractionVisible { + + @Composable + fun onVisibilityChangedModifierMinFraction(modifier: Modifier = Modifier) { + // [START android_compose_modifiers_onVisibilityChangedMinFraction] + LazyColumn( + modifier = modifier.fillMaxSize() + ) { + item { + Box( + modifier = Modifier + // [START_EXCLUDE] + .fillParentMaxWidth() + .border(0.5.dp, Color.Gray) + // [END_EXCLUDE] + .onVisibilityChanged( +// Here the visible callback gets triggered when 20% of the composable is visible + minFractionVisible = 0.2f, + ) { visible -> + if (visible) { + // Call specific logic here + // viewModel.fetchDataFromNetwork() + } + } + .padding(vertical = 16.dp) + ) { + Text( + text = "Sample Text", + modifier = Modifier.padding(horizontal = 16.dp) + ) + } + } + } + // [END android_compose_modifiers_onVisibilityChangedMinFraction] + } +} + +private object onVisibilityChangedMinDuration { + + val MutedPlum = Color(0xFF7B4B6B) + val PalePink = Color(0xFFF3E9EB) + + @Composable + fun onVisibilityChangedMinDuration( + modifier: Modifier = Modifier, + @DrawableRes imageRes: Int, + ) { + // [START android_compose_modifiers_onVisibilityChangedMinDuration] + var background by remember { mutableStateOf(PalePink) } + Card( + modifier = modifier + // [START_EXCLUDE] + .height(300.dp) + .fillMaxWidth() + // [END_EXCLUDE] + .onVisibilityChanged(minDurationMs = 3000) { + if (it) { + background = MutedPlum + } + } + ) { + + Box( + modifier = Modifier + // [START_EXCLUDE] + .fillMaxSize() + // [END_EXCLUDE] + .background(background), + contentAlignment = Alignment.Center, + ) { + // [START_EXCLUDE] + Image( + painter = painterResource(id = imageRes), + contentDescription = "Androidify Bot", + ) + // [END_EXCLUDE] + } + } + // [END android_compose_modifiers_onVisibilityChangedMinDuration] + } +} + + +private object OnFirstVisibleSample { + + @Composable + fun OnFirstVisibleExample(modifier: Modifier = Modifier, id: Int) { + // [START android_compose_modifiers_onFirstVisible] + Card( + modifier = modifier + .fillMaxWidth() + .padding(8.dp) + ) { + // [START android_compose_modifiers_onFirstVisible] + Text( + modifier = Modifier + .fillMaxSize() + .onFirstVisible { + println("OnFirstVisible : ProductCard: $id is visible") + } + .padding(8.dp), + text = "Product $id" + ) + // [END android_compose_modifiers_onFirstVisible] + } + } +} \ No newline at end of file From 3a68acd902292d944f9f1fe6fd3eae6f9bb0b2f7 Mon Sep 17 00:00:00 2001 From: Srikrishna Sakunia Date: Wed, 22 Oct 2025 10:16:47 +0100 Subject: [PATCH 2/4] This PR contains Snippets that will be hosted in the New Visibility API DAC. --- .../com/example/compose/snippets/modifiers/VisibilitySnippets.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/compose/snippets/src/main/java/com/example/compose/snippets/modifiers/VisibilitySnippets.kt b/compose/snippets/src/main/java/com/example/compose/snippets/modifiers/VisibilitySnippets.kt index 3e2099499..b4b50aeec 100644 --- a/compose/snippets/src/main/java/com/example/compose/snippets/modifiers/VisibilitySnippets.kt +++ b/compose/snippets/src/main/java/com/example/compose/snippets/modifiers/VisibilitySnippets.kt @@ -133,7 +133,6 @@ private object OnFirstVisibleSample { @Composable fun OnFirstVisibleExample(modifier: Modifier = Modifier, id: Int) { - // [START android_compose_modifiers_onFirstVisible] Card( modifier = modifier .fillMaxWidth() From c721bcabbce12b392b0fbdce76551a667793c588 Mon Sep 17 00:00:00 2001 From: srikrishnasakunia <43899917+srikrishnasakunia@users.noreply.github.com> Date: Wed, 22 Oct 2025 09:20:18 +0000 Subject: [PATCH 3/4] Apply Spotless --- .../snippets/modifiers/VisibilitySnippets.kt | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/compose/snippets/src/main/java/com/example/compose/snippets/modifiers/VisibilitySnippets.kt b/compose/snippets/src/main/java/com/example/compose/snippets/modifiers/VisibilitySnippets.kt index b4b50aeec..ee96e8caa 100644 --- a/compose/snippets/src/main/java/com/example/compose/snippets/modifiers/VisibilitySnippets.kt +++ b/compose/snippets/src/main/java/com/example/compose/snippets/modifiers/VisibilitySnippets.kt @@ -1,3 +1,19 @@ +/* + * Copyright 2025 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.example.compose.snippets.modifiers import androidx.annotation.DrawableRes From 08f7c5b41a7dd0102119ff3f75c162234b9fd830 Mon Sep 17 00:00:00 2001 From: Srikrishna Sakunia Date: Wed, 22 Oct 2025 10:53:17 +0100 Subject: [PATCH 4/4] Resolved Comments. --- .../compose/snippets/modifiers/VisibilitySnippets.kt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/compose/snippets/src/main/java/com/example/compose/snippets/modifiers/VisibilitySnippets.kt b/compose/snippets/src/main/java/com/example/compose/snippets/modifiers/VisibilitySnippets.kt index ee96e8caa..dbad0cc1b 100644 --- a/compose/snippets/src/main/java/com/example/compose/snippets/modifiers/VisibilitySnippets.kt +++ b/compose/snippets/src/main/java/com/example/compose/snippets/modifiers/VisibilitySnippets.kt @@ -65,7 +65,7 @@ private object OnVisibilityChangedSample { private object OnVisibilityChangedMinFractionVisible { @Composable - fun onVisibilityChangedModifierMinFraction(modifier: Modifier = Modifier) { + fun OnVisibilityChangedModifierMinFractionExample(modifier: Modifier = Modifier) { // [START android_compose_modifiers_onVisibilityChangedMinFraction] LazyColumn( modifier = modifier.fillMaxSize() @@ -77,8 +77,8 @@ private object OnVisibilityChangedMinFractionVisible { .fillParentMaxWidth() .border(0.5.dp, Color.Gray) // [END_EXCLUDE] + // Here the visible callback gets triggered when 20% of the composable is visible .onVisibilityChanged( -// Here the visible callback gets triggered when 20% of the composable is visible minFractionVisible = 0.2f, ) { visible -> if (visible) { @@ -105,9 +105,9 @@ private object onVisibilityChangedMinDuration { val PalePink = Color(0xFFF3E9EB) @Composable - fun onVisibilityChangedMinDuration( - modifier: Modifier = Modifier, + fun OnVisibilityChangedMinDurationExample( @DrawableRes imageRes: Int, + modifier: Modifier = Modifier, ) { // [START android_compose_modifiers_onVisibilityChangedMinDuration] var background by remember { mutableStateOf(PalePink) } @@ -148,7 +148,7 @@ private object onVisibilityChangedMinDuration { private object OnFirstVisibleSample { @Composable - fun OnFirstVisibleExample(modifier: Modifier = Modifier, id: Int) { + fun OnFirstVisibleExample(id: Int, modifier: Modifier = Modifier) { Card( modifier = modifier .fillMaxWidth()