From 9a7cb3f3933fe96390768d3375306d3bb64d6a32 Mon Sep 17 00:00:00 2001 From: Ajesh R Date: Fri, 6 Jun 2025 11:52:44 +0530 Subject: [PATCH] Fixes: UI not respecting edge to edge --- .../activity/FullyDrawnStartupActivity.kt | 8 ++++++- .../target/activity/MainActivity.kt | 5 ++++- .../activity/clicklatency/ComposeActivity.kt | 5 ++++- .../activity/clicklatency/ListViewActivity.kt | 22 +++++++++++++++++++ .../clicklatency/NestedRecyclerActivity.kt | 21 ++++++++++++++++++ .../clicklatency/RecyclerViewActivity.kt | 21 ++++++++++++++++++ .../clicklatency/ScrollViewActivity.kt | 20 +++++++++++++++++ .../target/activity/login/LoginActivity.kt | 5 ++++- .../main/res/layout/activity_nested_rv.xml | 2 +- .../main/res/layout/activity_scroll_view.xml | 1 + 10 files changed, 105 insertions(+), 5 deletions(-) diff --git a/MacrobenchmarkSample/app/src/main/kotlin/com/example/macrobenchmark/target/activity/FullyDrawnStartupActivity.kt b/MacrobenchmarkSample/app/src/main/kotlin/com/example/macrobenchmark/target/activity/FullyDrawnStartupActivity.kt index f6f37744..4cb975f2 100644 --- a/MacrobenchmarkSample/app/src/main/kotlin/com/example/macrobenchmark/target/activity/FullyDrawnStartupActivity.kt +++ b/MacrobenchmarkSample/app/src/main/kotlin/com/example/macrobenchmark/target/activity/FullyDrawnStartupActivity.kt @@ -20,8 +20,10 @@ import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.ReportDrawnWhen import androidx.activity.compose.setContent +import androidx.activity.enableEdgeToEdge import androidx.activity.viewModels import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.safeDrawingPadding import androidx.compose.material.CircularProgressIndicator import androidx.compose.material.Text import androidx.compose.runtime.LaunchedEffect @@ -29,6 +31,7 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier import com.example.macrobenchmark.target.util.SampleViewModel class FullyDrawnStartupActivity : ComponentActivity() { @@ -36,6 +39,7 @@ class FullyDrawnStartupActivity : ComponentActivity() { private val sampleViewModel: SampleViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { + enableEdgeToEdge() super.onCreate(savedInstanceState) setContent { var isLoaded by remember { mutableStateOf(false) } @@ -45,7 +49,9 @@ class FullyDrawnStartupActivity : ComponentActivity() { isLoaded = sampleViewModel.data.isReady() } - Column { + Column( + modifier = Modifier.safeDrawingPadding() + ) { Text("Compose Macrobenchmark Target") if (!isLoaded) { CircularProgressIndicator() diff --git a/MacrobenchmarkSample/app/src/main/kotlin/com/example/macrobenchmark/target/activity/MainActivity.kt b/MacrobenchmarkSample/app/src/main/kotlin/com/example/macrobenchmark/target/activity/MainActivity.kt index 5c3d4236..03b404d9 100644 --- a/MacrobenchmarkSample/app/src/main/kotlin/com/example/macrobenchmark/target/activity/MainActivity.kt +++ b/MacrobenchmarkSample/app/src/main/kotlin/com/example/macrobenchmark/target/activity/MainActivity.kt @@ -22,10 +22,12 @@ import android.os.Bundle import android.util.Log import androidx.activity.ComponentActivity import androidx.activity.compose.setContent +import androidx.activity.enableEdgeToEdge import androidx.compose.foundation.BorderStroke import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.safeDrawingPadding import androidx.compose.material.MaterialTheme import androidx.compose.material.Text import androidx.compose.material.TextButton @@ -59,12 +61,13 @@ class MainActivity : ComponentActivity() { @OptIn(ExperimentalComposeUiApi::class) override fun onCreate(savedInstanceState: Bundle?) { + enableEdgeToEdge() super.onCreate(savedInstanceState) setContent { Column( modifier = Modifier.semantics { testTagsAsResourceId = true - } + }.safeDrawingPadding() ) { TopAppBar(title = { Text(text = "Benchmark Sample Target App") }) ActivityList() diff --git a/MacrobenchmarkSample/app/src/main/kotlin/com/example/macrobenchmark/target/activity/clicklatency/ComposeActivity.kt b/MacrobenchmarkSample/app/src/main/kotlin/com/example/macrobenchmark/target/activity/clicklatency/ComposeActivity.kt index cbef2597..8cd367f1 100644 --- a/MacrobenchmarkSample/app/src/main/kotlin/com/example/macrobenchmark/target/activity/clicklatency/ComposeActivity.kt +++ b/MacrobenchmarkSample/app/src/main/kotlin/com/example/macrobenchmark/target/activity/clicklatency/ComposeActivity.kt @@ -19,6 +19,7 @@ package com.example.macrobenchmark.target.activity.clicklatency import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent +import androidx.activity.enableEdgeToEdge import androidx.appcompat.app.AlertDialog import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box @@ -27,6 +28,7 @@ import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.safeDrawingPadding import androidx.compose.foundation.layout.wrapContentSize import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items @@ -55,6 +57,7 @@ import com.example.macrobenchmark.target.util.ClickTrace @OptIn(ExperimentalComposeUiApi::class) class ComposeActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { + enableEdgeToEdge() super.onCreate(savedInstanceState) // This argument allows the Macrobenchmark tests control the content being tested. @@ -77,7 +80,7 @@ class ComposeActivity : ComponentActivity() { // It can be enabled high in the compose hierarchy, // so that it's enabled for the whole subtree testTagsAsResourceId = true - } + }.safeDrawingPadding() ) { // Thanks to [SemanticsPropertyReceiver.testTagsAsResourceId], // [Modifier.testTag]s will be propagated to resource-id diff --git a/MacrobenchmarkSample/app/src/main/kotlin/com/example/macrobenchmark/target/activity/clicklatency/ListViewActivity.kt b/MacrobenchmarkSample/app/src/main/kotlin/com/example/macrobenchmark/target/activity/clicklatency/ListViewActivity.kt index b1586515..a202adbc 100644 --- a/MacrobenchmarkSample/app/src/main/kotlin/com/example/macrobenchmark/target/activity/clicklatency/ListViewActivity.kt +++ b/MacrobenchmarkSample/app/src/main/kotlin/com/example/macrobenchmark/target/activity/clicklatency/ListViewActivity.kt @@ -22,8 +22,12 @@ import android.view.View import android.view.ViewGroup import android.widget.BaseAdapter import android.widget.TextView +import androidx.activity.enableEdgeToEdge import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat +import androidx.core.view.updatePadding import com.example.macrobenchmark.target.databinding.ActivityListViewBinding import com.example.macrobenchmark.target.recyclerview.Entry import com.example.macrobenchmark.target.util.ClickTrace @@ -34,10 +38,28 @@ import com.example.macrobenchmark.target.util.ClickTrace class ListViewActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { + enableEdgeToEdge() super.onCreate(savedInstanceState) title = "ListView Sample" val binding = ActivityListViewBinding.inflate(layoutInflater) setContentView(binding.root) + + ViewCompat.setOnApplyWindowInsetsListener(binding.listview) { view, windowInsets -> + val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()) + + // Apply the insets as padding to the RecyclerView + view.updatePadding( + left = insets.left, + top = insets.top, // Padding for the status bar + right = insets.right, + bottom = insets.bottom // Padding for the navigation bar + ) + + // Return the insets to signal that they have been consumed + WindowInsetsCompat.CONSUMED + } + + val itemCount = intent.getIntExtra(RecyclerViewActivity.EXTRA_ITEM_COUNT, 1000) val items = List(itemCount) { diff --git a/MacrobenchmarkSample/app/src/main/kotlin/com/example/macrobenchmark/target/activity/clicklatency/NestedRecyclerActivity.kt b/MacrobenchmarkSample/app/src/main/kotlin/com/example/macrobenchmark/target/activity/clicklatency/NestedRecyclerActivity.kt index 12905ded..e05579a1 100644 --- a/MacrobenchmarkSample/app/src/main/kotlin/com/example/macrobenchmark/target/activity/clicklatency/NestedRecyclerActivity.kt +++ b/MacrobenchmarkSample/app/src/main/kotlin/com/example/macrobenchmark/target/activity/clicklatency/NestedRecyclerActivity.kt @@ -17,8 +17,12 @@ package com.example.macrobenchmark.target.activity.clicklatency import android.os.Bundle +import androidx.activity.enableEdgeToEdge import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat +import androidx.core.view.updatePadding import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope import androidx.lifecycle.repeatOnLifecycle @@ -35,6 +39,7 @@ class NestedRecyclerActivity : AppCompatActivity() { private lateinit var binding: ActivityNestedRvBinding override fun onCreate(savedInstanceState: Bundle?) { + enableEdgeToEdge() super.onCreate(savedInstanceState) val useRecyclerPools = intent.getBooleanExtra(USE_RECYCLER_POOLS, false) @@ -43,6 +48,22 @@ class NestedRecyclerActivity : AppCompatActivity() { setContentView(binding.root) + ViewCompat.setOnApplyWindowInsetsListener(binding.recycler) { view, windowInsets -> + val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()) + + // Apply the insets as padding to the RecyclerView + view.updatePadding( + left = insets.left, + top = insets.top, // Padding for the status bar + right = insets.right, + bottom = insets.bottom // Padding for the navigation bar + ) + + // Return the insets to signal that they have been consumed + WindowInsetsCompat.CONSUMED + } + + val adapter = ParentAdapter(useRecyclerPools) binding.recycler.adapter = adapter diff --git a/MacrobenchmarkSample/app/src/main/kotlin/com/example/macrobenchmark/target/activity/clicklatency/RecyclerViewActivity.kt b/MacrobenchmarkSample/app/src/main/kotlin/com/example/macrobenchmark/target/activity/clicklatency/RecyclerViewActivity.kt index dd33aae6..3a28d56f 100644 --- a/MacrobenchmarkSample/app/src/main/kotlin/com/example/macrobenchmark/target/activity/clicklatency/RecyclerViewActivity.kt +++ b/MacrobenchmarkSample/app/src/main/kotlin/com/example/macrobenchmark/target/activity/clicklatency/RecyclerViewActivity.kt @@ -17,7 +17,11 @@ package com.example.macrobenchmark.target.activity.clicklatency import android.os.Bundle +import androidx.activity.enableEdgeToEdge import androidx.appcompat.app.AppCompatActivity +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat +import androidx.core.view.updatePadding import androidx.recyclerview.widget.LinearLayoutManager import com.example.macrobenchmark.target.databinding.ActivityRecyclerViewBinding import com.example.macrobenchmark.target.recyclerview.Entry @@ -25,11 +29,28 @@ import com.example.macrobenchmark.target.recyclerview.EntryAdapter open class RecyclerViewActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { + enableEdgeToEdge() super.onCreate(savedInstanceState) title = "RecyclerView Sample" val binding = ActivityRecyclerViewBinding.inflate(layoutInflater) setContentView(binding.root) + ViewCompat.setOnApplyWindowInsetsListener(binding.recycler) { view, windowInsets -> + val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()) + + // Apply the insets as padding to the RecyclerView + view.updatePadding( + left = insets.left, + top = insets.top, // Padding for the status bar + right = insets.right, + bottom = insets.bottom // Padding for the navigation bar + ) + + // Return the insets to signal that they have been consumed + WindowInsetsCompat.CONSUMED + } + + // This argument allows the Macrobenchmark tests control the content being tested. // In your app, you could use this approach to navigate to a consistent UI. // e.g. Here the UI is being populated with a well known number of list items. diff --git a/MacrobenchmarkSample/app/src/main/kotlin/com/example/macrobenchmark/target/activity/clicklatency/ScrollViewActivity.kt b/MacrobenchmarkSample/app/src/main/kotlin/com/example/macrobenchmark/target/activity/clicklatency/ScrollViewActivity.kt index 2e78d89d..71e12495 100644 --- a/MacrobenchmarkSample/app/src/main/kotlin/com/example/macrobenchmark/target/activity/clicklatency/ScrollViewActivity.kt +++ b/MacrobenchmarkSample/app/src/main/kotlin/com/example/macrobenchmark/target/activity/clicklatency/ScrollViewActivity.kt @@ -19,8 +19,12 @@ package com.example.macrobenchmark.target.activity.clicklatency import android.os.Bundle import android.view.LayoutInflater import android.widget.TextView +import androidx.activity.enableEdgeToEdge import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat +import androidx.core.view.updatePadding import com.example.macrobenchmark.target.R import com.example.macrobenchmark.target.databinding.ActivityScrollViewBinding import com.example.macrobenchmark.target.recyclerview.Entry @@ -32,10 +36,26 @@ import com.example.macrobenchmark.target.util.ClickTrace class ScrollViewActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { + enableEdgeToEdge() super.onCreate(savedInstanceState) title = "ScrollView Sample" val binding = ActivityScrollViewBinding.inflate(layoutInflater) setContentView(binding.root) + + ViewCompat.setOnApplyWindowInsetsListener(binding.root) { view, windowInsets -> + val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()) + + // Apply the insets as padding to the RecyclerView + view.updatePadding( + left = insets.left, + top = insets.top, // Padding for the status bar + right = insets.right, + bottom = insets.bottom // Padding for the navigation bar + ) + + // Return the insets to signal that they have been consumed + WindowInsetsCompat.CONSUMED + } val itemCount = intent.getIntExtra(RecyclerViewActivity.EXTRA_ITEM_COUNT, 1000) val items = List(itemCount) { diff --git a/MacrobenchmarkSample/app/src/main/kotlin/com/example/macrobenchmark/target/activity/login/LoginActivity.kt b/MacrobenchmarkSample/app/src/main/kotlin/com/example/macrobenchmark/target/activity/login/LoginActivity.kt index dba1029b..c5f21fe7 100644 --- a/MacrobenchmarkSample/app/src/main/kotlin/com/example/macrobenchmark/target/activity/login/LoginActivity.kt +++ b/MacrobenchmarkSample/app/src/main/kotlin/com/example/macrobenchmark/target/activity/login/LoginActivity.kt @@ -21,11 +21,13 @@ import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.ReportDrawn import androidx.activity.compose.setContent +import androidx.activity.enableEdgeToEdge import androidx.activity.viewModels import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.safeDrawingPadding import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material.Button import androidx.compose.material.MaterialTheme @@ -59,6 +61,7 @@ class LoginActivity : ComponentActivity() { private val sampleViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { + enableEdgeToEdge() super.onCreate(savedInstanceState) intent.extras?.run { val userName = getString("user", "") @@ -87,7 +90,7 @@ class LoginActivity : ComponentActivity() { // It can be enabled high in the compose hierarchy, // so that it's enabled for the whole subtree testTagsAsResourceId = true - } + }.safeDrawingPadding() ) { Column( diff --git a/MacrobenchmarkSample/app/src/main/res/layout/activity_nested_rv.xml b/MacrobenchmarkSample/app/src/main/res/layout/activity_nested_rv.xml index c92ec410..3c5bb884 100644 --- a/MacrobenchmarkSample/app/src/main/res/layout/activity_nested_rv.xml +++ b/MacrobenchmarkSample/app/src/main/res/layout/activity_nested_rv.xml @@ -24,7 +24,7 @@ android:id="@+id/recycler" android:layout_width="match_parent" android:layout_height="match_parent" - android:clipToPadding="false" + android:clipToPadding="true" android:paddingTop="16dp" android:paddingBottom="16dp" tools:listitem="@layout/item_parent" /> diff --git a/MacrobenchmarkSample/app/src/main/res/layout/activity_scroll_view.xml b/MacrobenchmarkSample/app/src/main/res/layout/activity_scroll_view.xml index 4788f9be..d0d3b35d 100644 --- a/MacrobenchmarkSample/app/src/main/res/layout/activity_scroll_view.xml +++ b/MacrobenchmarkSample/app/src/main/res/layout/activity_scroll_view.xml @@ -28,6 +28,7 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" + android:clipToPadding="false" tools:listitem="@layout/recycler_row" >