From 32fc524de68bc683a29ae90f28ac9b089b5faaf6 Mon Sep 17 00:00:00 2001 From: Arga Hutama Date: Thu, 21 May 2026 05:29:08 +0700 Subject: [PATCH 1/6] deps: add androidx-activity dependency for edge-to-edge support Co-Authored-By: Claude Sonnet 4.6 --- gradle/libs.versions.toml | 2 ++ pluto/lib/build.gradle.kts | 1 + sample/build.gradle.kts | 1 + 3 files changed, 4 insertions(+) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 0f6a311e..c621c0e7 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -13,6 +13,7 @@ compileSdk = "34" buildTools = "34.0.0" agp = "8.6.0" +androidXActivity = "1.9.0" androidXCore = "1.6.0" androidXLifecycle = "2.8.7" detekt = "1.19.0" @@ -42,6 +43,7 @@ maven-publish = { id = "com.vanniktech.maven.publish", version.ref = "mavenPubli [libraries] +androidx-activity = { module = "androidx.activity:activity-ktx", version.ref = "androidXActivity" } androidx-annotation = { module = "androidx.annotation:annotation", version = "1.4.0" } androidx-appcompat = { module = "androidx.appcompat:appcompat", version = "1.4.0" } androidx-browser = { module = "androidx.browser:browser", version = "1.4.0" } diff --git a/pluto/lib/build.gradle.kts b/pluto/lib/build.gradle.kts index 02e42b21..2d4cd302 100644 --- a/pluto/lib/build.gradle.kts +++ b/pluto/lib/build.gradle.kts @@ -96,6 +96,7 @@ mavenPublishing { dependencies { api(project(":pluto-plugins:base:lib")) + implementation(libs.androidx.activity) implementation(libs.androidx.core) implementation(libs.androidx.appcompat) diff --git a/sample/build.gradle.kts b/sample/build.gradle.kts index 427a2253..fe652ea6 100644 --- a/sample/build.gradle.kts +++ b/sample/build.gradle.kts @@ -101,6 +101,7 @@ dependencies { * Other dependencies */ implementation(libs.kotlin.stdlib.jdk8) + implementation(libs.androidx.activity) implementation(libs.androidx.appcompat) implementation(libs.androidx.core) implementation(libs.androidx.constraintlayout) From 5260ff9b78b5d117e2531479f7783821f125d9e5 Mon Sep 17 00:00:00 2001 From: Arga Hutama Date: Thu, 21 May 2026 05:29:18 +0700 Subject: [PATCH 2/6] feat: enable edge-to-edge in Pluto core activities MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - PlutoActivity: replace legacy window flags with enableEdgeToEdge() and apply top/bottom padding via WindowInsetsCompat - SelectorActivity: add enableEdgeToEdge() and inset-aware padding - RulerActivity: add enableEdgeToEdge() and adjust controls top margin to account for status bar insets - Remove android:fitsSystemWindows from all plugin fragment root layouts (datastore, exceptions, logger, network, rooms-database, shared-prefs, selector dialog) — insets are now handled at the activity level Co-Authored-By: Claude Sonnet 4.6 --- .../res/layout/pluto___selector_dialog.xml | 1 - .../res/layout/pluto_dts___fragment_base.xml | 3 +-- .../layout/pluto_excep___fragment_base.xml | 3 +-- .../layout/pluto_logger___fragment_logs.xml | 3 +-- .../pluto_network___fragment_network.xml | 1 - .../pluto_rooms___fragment_data_editor.xml | 1 - .../layout/pluto_rooms___fragment_filter.xml | 1 - .../pluto_rooms___fragment_rooms_db.xml | 3 +-- .../res/layout/pluto_pref___fragment_base.xml | 3 +-- .../pluto/tool/modules/ruler/RulerActivity.kt | 17 ++++++++++++++ .../com/pluto/ui/container/PlutoActivity.kt | 22 +++++++++---------- .../com/pluto/ui/selector/SelectorActivity.kt | 15 +++++++++++++ 12 files changed, 48 insertions(+), 25 deletions(-) diff --git a/pluto-plugins/base/lib/src/main/res/layout/pluto___selector_dialog.xml b/pluto-plugins/base/lib/src/main/res/layout/pluto___selector_dialog.xml index cde426cf..385b3e8f 100644 --- a/pluto-plugins/base/lib/src/main/res/layout/pluto___selector_dialog.xml +++ b/pluto-plugins/base/lib/src/main/res/layout/pluto___selector_dialog.xml @@ -20,7 +20,6 @@ diff --git a/pluto-plugins/plugins/datastore/lib/src/main/res/layout/pluto_dts___fragment_base.xml b/pluto-plugins/plugins/datastore/lib/src/main/res/layout/pluto_dts___fragment_base.xml index 84204aaa..c28ecc1b 100644 --- a/pluto-plugins/plugins/datastore/lib/src/main/res/layout/pluto_dts___fragment_base.xml +++ b/pluto-plugins/plugins/datastore/lib/src/main/res/layout/pluto_dts___fragment_base.xml @@ -3,8 +3,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@color/pluto___white" - android:fitsSystemWindows="true"> + android:background="@color/pluto___white"> + android:background="@color/pluto___white"> + android:background="@color/pluto___white"> diff --git a/pluto-plugins/plugins/rooms-database/lib/src/main/res/layout/pluto_rooms___fragment_filter.xml b/pluto-plugins/plugins/rooms-database/lib/src/main/res/layout/pluto_rooms___fragment_filter.xml index 2234fa97..db0ddcd5 100644 --- a/pluto-plugins/plugins/rooms-database/lib/src/main/res/layout/pluto_rooms___fragment_filter.xml +++ b/pluto-plugins/plugins/rooms-database/lib/src/main/res/layout/pluto_rooms___fragment_filter.xml @@ -19,7 +19,6 @@ diff --git a/pluto-plugins/plugins/rooms-database/lib/src/main/res/layout/pluto_rooms___fragment_rooms_db.xml b/pluto-plugins/plugins/rooms-database/lib/src/main/res/layout/pluto_rooms___fragment_rooms_db.xml index b02d8a5a..984bc467 100644 --- a/pluto-plugins/plugins/rooms-database/lib/src/main/res/layout/pluto_rooms___fragment_rooms_db.xml +++ b/pluto-plugins/plugins/rooms-database/lib/src/main/res/layout/pluto_rooms___fragment_rooms_db.xml @@ -3,8 +3,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@color/pluto___white" - android:fitsSystemWindows="true"> + android:background="@color/pluto___white"> + android:background="@color/pluto___white"> + val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()) + listOf(binding.leftControls, binding.rightControls).forEach { controls -> + (controls.layoutParams as? ConstraintLayout.LayoutParams)?.let { params -> + params.topMargin = controlsInitialTopMargin + insets.top + controls.layoutParams = params + } + } + WindowInsetsCompat.CONSUMED + } // Add the ruler fragment to the container supportFragmentManager.beginTransaction().apply { diff --git a/pluto/lib/src/main/java/com/pluto/ui/container/PlutoActivity.kt b/pluto/lib/src/main/java/com/pluto/ui/container/PlutoActivity.kt index 4444351c..504e1373 100644 --- a/pluto/lib/src/main/java/com/pluto/ui/container/PlutoActivity.kt +++ b/pluto/lib/src/main/java/com/pluto/ui/container/PlutoActivity.kt @@ -2,10 +2,11 @@ package com.pluto.ui.container import android.content.Intent import android.os.Bundle -import android.view.WindowManager +import androidx.activity.enableEdgeToEdge import androidx.appcompat.app.AppCompatActivity -import androidx.core.content.ContextCompat -import androidx.core.view.WindowCompat +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat +import androidx.core.view.updatePadding import androidx.lifecycle.Observer import com.pluto.Pluto import com.pluto.R @@ -33,15 +34,14 @@ class PlutoActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + enableEdgeToEdge() val binding = PlutoActivityPlutoBinding.inflate(layoutInflater) setContentView(binding.root) - WindowCompat.setDecorFitsSystemWindows(window, false) - window.setFlags( - WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION, - WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION - ) - window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS) - window.statusBarColor = ContextCompat.getColor(this, com.pluto.plugin.R.color.pluto___dark) + ViewCompat.setOnApplyWindowInsetsListener(binding.root) { v, windowInsets -> + val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()) + v.updatePadding(top = insets.top, bottom = insets.bottom) + windowInsets + } sharer.data.observe(this) { val shareFragment = ShareFragment() shareFragment.arguments = Bundle().apply { @@ -110,7 +110,7 @@ class PlutoActivity : AppCompatActivity() { // } // } - override fun onNewIntent(intent: Intent?) { + override fun onNewIntent(intent: Intent) { super.onNewIntent(intent) handleIntent(intent) } diff --git a/pluto/lib/src/main/java/com/pluto/ui/selector/SelectorActivity.kt b/pluto/lib/src/main/java/com/pluto/ui/selector/SelectorActivity.kt index d0da40fc..0212abfe 100644 --- a/pluto/lib/src/main/java/com/pluto/ui/selector/SelectorActivity.kt +++ b/pluto/lib/src/main/java/com/pluto/ui/selector/SelectorActivity.kt @@ -10,7 +10,11 @@ import android.view.animation.Animation import android.view.animation.AnimationUtils import androidx.activity.viewModels import androidx.annotation.AnimRes +import androidx.activity.enableEdgeToEdge +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat import androidx.core.view.isVisible +import androidx.core.view.updatePadding import androidx.fragment.app.FragmentActivity import androidx.lifecycle.Observer import androidx.recyclerview.widget.GridLayoutManager @@ -54,9 +58,20 @@ class SelectorActivity : FragmentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + enableEdgeToEdge() binding = PlutoActivityPluginSelectorBinding.inflate(layoutInflater) setContentView(binding.root) overridePendingTransition(R.anim.pluto___slide_in_bottom, R.anim.pluto___slide_out_bottom) + val rootInitialPaddingTop = binding.root.paddingTop + val rootInitialPaddingBottom = binding.root.paddingBottom + ViewCompat.setOnApplyWindowInsetsListener(binding.root) { v, windowInsets -> + val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()) + v.updatePadding( + top = rootInitialPaddingTop + insets.top, + bottom = rootInitialPaddingBottom + insets.bottom + ) + WindowInsetsCompat.CONSUMED + } selectorUtils = SelectorUtils(this) binding.list.apply { From bc52cfb2bea33e312ee9fe5b12e1e99aaa990d0c Mon Sep 17 00:00:00 2001 From: Arga Hutama Date: Thu, 21 May 2026 05:29:34 +0700 Subject: [PATCH 3/6] feat: add edge-to-edge support to layout-inspector plugin - ViewHierarchyFragment: add WindowCompat.setDecorFitsSystemWindows(false) in onStart and apply insets to appBarContent top padding and list bottom padding; add @id/appBarContent to the layout - ViewInfoFragment: remove obsolete manual insets listener (bottom-sheet padding is now handled by the activity-level inset logic) - Remove android:fitsSystemWindows from view_info, view_hierarchy and view_attr layouts Fix InspectOverlay coordinate mismatch under edge-to-edge: enableEdgeToEdge() + paddingTop on the Pluto root view shifts the InspectOverlay down by statusBarHeight in screen space. Previously InspectedView.reset() stored rects in screen-absolute coordinates while canvas drawing and MotionEvent coordinates are overlay-local, causing hit-testing and selection highlights to be offset by ~statusBarHeight. - InspectedView now stores an overlay View reference and calls overlay.getLocationOnScreen() inside every reset(), subtracting the overlay's screen offset so all rects are in overlay-local space. This works correctly for both edge-to-edge and non-edge-to-edge inspected apps. - InspectOverlay.tryGetFrontView() wraps the traversal in doOnLayout{} so getLocationOnScreen() is called only after the overlay has completed its first layout pass (before layout it always returns 0,0). Co-Authored-By: Claude Sonnet 4.6 --- .../layoutinspector/ViewInfoFragment.kt | 7 ----- .../hierarchy/ViewHierarchyFragment.kt | 17 ++++++++++++ .../internal/inspect/InspectOverlay.kt | 15 +++++++++-- .../internal/inspect/InspectedView.kt | 26 ++++++++++++++++--- .../layout/pluto_li___fragment_view_attr.xml | 1 - .../pluto_li___fragment_view_hierarchy.xml | 2 +- .../layout/pluto_li___fragment_view_info.xml | 3 +-- 7 files changed, 54 insertions(+), 17 deletions(-) diff --git a/pluto-plugins/plugins/layout-inspector/lib/src/main/java/com/pluto/plugins/layoutinspector/ViewInfoFragment.kt b/pluto-plugins/plugins/layout-inspector/lib/src/main/java/com/pluto/plugins/layoutinspector/ViewInfoFragment.kt index 20d894fc..efe54bc7 100644 --- a/pluto-plugins/plugins/layout-inspector/lib/src/main/java/com/pluto/plugins/layoutinspector/ViewInfoFragment.kt +++ b/pluto-plugins/plugins/layout-inspector/lib/src/main/java/com/pluto/plugins/layoutinspector/ViewInfoFragment.kt @@ -4,8 +4,6 @@ import android.os.Bundle import android.view.View import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.os.bundleOf -import androidx.core.view.ViewCompat -import androidx.core.view.WindowInsetsCompat import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels import androidx.lifecycle.Observer @@ -31,11 +29,6 @@ internal class ViewInfoFragment : Fragment(R.layout.pluto_li___fragment_view_inf override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - ViewCompat.setOnApplyWindowInsetsListener(binding.root) { _, insets -> - val systemBarsInsets = insets.getInsets(WindowInsetsCompat.Type.systemBars()) - binding.bsContainer.previewPanelBottomSheet.setPadding(0, 0, 0, systemBarsInsets.bottom) - insets - } ActivityLifecycle.topActivity?.let { binding.operableView.tryGetFrontView(it) } binding.operableView.setOnClickListener(this) binding.leftControls.initialise( diff --git a/pluto-plugins/plugins/layout-inspector/lib/src/main/java/com/pluto/plugins/layoutinspector/internal/hierarchy/ViewHierarchyFragment.kt b/pluto-plugins/plugins/layout-inspector/lib/src/main/java/com/pluto/plugins/layoutinspector/internal/hierarchy/ViewHierarchyFragment.kt index a6aaf29b..987f1169 100644 --- a/pluto-plugins/plugins/layout-inspector/lib/src/main/java/com/pluto/plugins/layoutinspector/internal/hierarchy/ViewHierarchyFragment.kt +++ b/pluto-plugins/plugins/layout-inspector/lib/src/main/java/com/pluto/plugins/layoutinspector/internal/hierarchy/ViewHierarchyFragment.kt @@ -4,7 +4,11 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.core.view.ViewCompat +import androidx.core.view.WindowCompat +import androidx.core.view.WindowInsetsCompat import androidx.core.view.isVisible +import androidx.core.view.updatePadding import androidx.fragment.app.DialogFragment import androidx.fragment.app.activityViewModels import androidx.fragment.app.viewModels @@ -49,8 +53,21 @@ internal class ViewHierarchyFragment : DialogFragment() { override fun getTheme(): Int = R.style.PlutoLIFullScreenDialogStyle + override fun onStart() { + super.onStart() + dialog?.window?.let { WindowCompat.setDecorFitsSystemWindows(it, false) } + } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + val appBarContentInitialPaddingTop = binding.appBarContent.paddingTop + val listInitialPaddingBottom = binding.list.paddingBottom + ViewCompat.setOnApplyWindowInsetsListener(binding.root) { _, windowInsets -> + val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()) + binding.appBarContent.updatePadding(top = appBarContentInitialPaddingTop + insets.top) + binding.list.updatePadding(bottom = listInitialPaddingBottom + insets.bottom) + WindowInsetsCompat.CONSUMED + } onBackPressed { findNavController().navigateUp() } binding.close.setOnDebounceClickListener { findNavController().navigateUp() diff --git a/pluto-plugins/plugins/layout-inspector/lib/src/main/java/com/pluto/plugins/layoutinspector/internal/inspect/InspectOverlay.kt b/pluto-plugins/plugins/layout-inspector/lib/src/main/java/com/pluto/plugins/layoutinspector/internal/inspect/InspectOverlay.kt index 31e524f3..9ef7d4b8 100644 --- a/pluto-plugins/plugins/layout-inspector/lib/src/main/java/com/pluto/plugins/layoutinspector/internal/inspect/InspectOverlay.kt +++ b/pluto-plugins/plugins/layout-inspector/lib/src/main/java/com/pluto/plugins/layoutinspector/internal/inspect/InspectOverlay.kt @@ -14,6 +14,7 @@ import android.view.View import android.view.ViewConfiguration import android.view.ViewGroup import androidx.core.view.children +import androidx.core.view.doOnLayout import com.pluto.plugins.layoutinspector.internal.inspect.canvas.CaptureCanvas import com.pluto.plugins.layoutinspector.internal.inspect.canvas.DimensionCanvas import com.pluto.plugins.layoutinspector.internal.inspect.canvas.GridCanvas @@ -62,7 +63,15 @@ internal class InspectOverlay : View { } fun tryGetFrontView(targetActivity: Activity) { - traverse(targetActivity.getFrontView()) + // Defer the view traversal until after this overlay has completed its own layout + // pass so that getLocationOnScreen() (called inside InspectedView.reset()) returns + // the correct screen position, not [0, 0]. doOnLayout fires synchronously when the + // view is already laid out, or on the next layout pass otherwise – covering both the + // "first launch" and "navigate-back" cases. + doOnLayout { + traverse(targetActivity.getFrontView()) + invalidate() + } } override fun onTouchEvent(event: MotionEvent?): Boolean { @@ -241,7 +250,9 @@ internal class InspectOverlay : View { private fun traverse(view: View) { if (view.alpha == 0f || view.visibility != VISIBLE) return - inspectedViews.add(InspectedView(view)) + // Pass 'this' so InspectedView can dynamically compute the overlay's screen offset + // inside each reset() call, keeping all rects in overlay-local coordinates. + inspectedViews.add(InspectedView(view, this)) if (view is ViewGroup) { view.children.forEach { traverse(it) diff --git a/pluto-plugins/plugins/layout-inspector/lib/src/main/java/com/pluto/plugins/layoutinspector/internal/inspect/InspectedView.kt b/pluto-plugins/plugins/layout-inspector/lib/src/main/java/com/pluto/plugins/layoutinspector/internal/inspect/InspectedView.kt index 4cb54733..052721be 100644 --- a/pluto-plugins/plugins/layout-inspector/lib/src/main/java/com/pluto/plugins/layoutinspector/internal/inspect/InspectedView.kt +++ b/pluto-plugins/plugins/layout-inspector/lib/src/main/java/com/pluto/plugins/layoutinspector/internal/inspect/InspectedView.kt @@ -3,16 +3,28 @@ package com.pluto.plugins.layoutinspector.internal.inspect import android.graphics.Rect import android.view.View -internal class InspectedView(val view: View) { +/** + * Wraps an inspected [view] and maintains a [rect] in **overlay-local coordinates** + * (i.e. relative to the top-left of [InspectOverlay]) so that hit-testing and canvas + * drawing are both correct regardless of whether the host (Pluto) activity is running + * edge-to-edge or not. + * + * @param overlay The [InspectOverlay] view. Its current screen position is subtracted + * from [view]'s screen position inside every [reset] call, so the stored [rect] is + * always in overlay-local space even after window-inset changes. + */ +internal class InspectedView(val view: View, private val overlay: View? = null) { private val originRect: Rect = Rect() val rect: Rect = Rect() private val location = IntArray(2) + private val overlayLoc = IntArray(2) + val parent: InspectedView? get() { val parentView: Any = view.parent return if (parentView is View) { - InspectedView(parentView) + InspectedView(parentView, overlay) } else { null } @@ -24,10 +36,16 @@ internal class InspectedView(val view: View) { } fun reset() { + // Always recompute the overlay's position so this works correctly even if called + // before the first layout pass (overlayLoc will just be [0,0] then, harmlessly). + overlay?.getLocationOnScreen(overlayLoc) view.getLocationOnScreen(location) - val left = location[0] + // Subtract the overlay's screen offset → rect is in overlay-local space. + // This cancels out the status-bar (and/or action-bar) offset introduced by the + // Pluto activity's paddingTop when edge-to-edge is enabled. + val left = location[0] - overlayLoc[0] val right = left + view.width - val top = location[1] + val top = location[1] - overlayLoc[1] val bottom = top + view.height rect.set(left, top, right, bottom) } diff --git a/pluto-plugins/plugins/layout-inspector/lib/src/main/res/layout/pluto_li___fragment_view_attr.xml b/pluto-plugins/plugins/layout-inspector/lib/src/main/res/layout/pluto_li___fragment_view_attr.xml index 3473ab9f..3c972f0a 100644 --- a/pluto-plugins/plugins/layout-inspector/lib/src/main/res/layout/pluto_li___fragment_view_attr.xml +++ b/pluto-plugins/plugins/layout-inspector/lib/src/main/res/layout/pluto_li___fragment_view_attr.xml @@ -21,7 +21,6 @@ diff --git a/pluto-plugins/plugins/layout-inspector/lib/src/main/res/layout/pluto_li___fragment_view_hierarchy.xml b/pluto-plugins/plugins/layout-inspector/lib/src/main/res/layout/pluto_li___fragment_view_hierarchy.xml index 7b04363e..d69e3596 100644 --- a/pluto-plugins/plugins/layout-inspector/lib/src/main/res/layout/pluto_li___fragment_view_hierarchy.xml +++ b/pluto-plugins/plugins/layout-inspector/lib/src/main/res/layout/pluto_li___fragment_view_hierarchy.xml @@ -3,7 +3,6 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" - android:fitsSystemWindows="true" android:background="@color/pluto___white"> diff --git a/pluto-plugins/plugins/layout-inspector/lib/src/main/res/layout/pluto_li___fragment_view_info.xml b/pluto-plugins/plugins/layout-inspector/lib/src/main/res/layout/pluto_li___fragment_view_info.xml index c13e703e..a286dc97 100644 --- a/pluto-plugins/plugins/layout-inspector/lib/src/main/res/layout/pluto_li___fragment_view_info.xml +++ b/pluto-plugins/plugins/layout-inspector/lib/src/main/res/layout/pluto_li___fragment_view_info.xml @@ -15,8 +15,7 @@ + android:layout_height="wrap_content"> Date: Thu, 21 May 2026 05:29:40 +0700 Subject: [PATCH 4/6] feat: enable edge-to-edge in sample app activities - MainActivity: add enableEdgeToEdge(), pad appBar top and actionsView bottom using WindowInsetsCompat; add @id/appBar to layout - DemoLayoutInspectorActivity: add enableEdgeToEdge(), pad appBar top and root left/right/bottom; add @id/appBar to layout Co-Authored-By: Claude Sonnet 4.6 --- sample/src/main/java/com/sampleapp/MainActivity.kt | 12 ++++++++++++ .../layoutinspector/DemoLayoutInspectorActivity.kt | 11 +++++++++++ .../res/layout/activity_demo_layout_inspector.xml | 1 + sample/src/main/res/layout/activity_main.xml | 1 + 4 files changed, 25 insertions(+) diff --git a/sample/src/main/java/com/sampleapp/MainActivity.kt b/sample/src/main/java/com/sampleapp/MainActivity.kt index 1ef8ab60..d9b56d8a 100644 --- a/sample/src/main/java/com/sampleapp/MainActivity.kt +++ b/sample/src/main/java/com/sampleapp/MainActivity.kt @@ -2,7 +2,11 @@ package com.sampleapp import android.content.Intent 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 com.google.android.material.chip.Chip import com.pluto.Pluto import com.pluto.plugins.layoutinspector.PlutoLayoutInspectorPlugin @@ -15,8 +19,16 @@ class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + enableEdgeToEdge() val binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) + val actionsViewInitialPaddingBottom = binding.actionsView.paddingBottom + ViewCompat.setOnApplyWindowInsetsListener(binding.root) { v, windowInsets -> + val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()) + binding.appBar.updatePadding(top = insets.top) + binding.actionsView.updatePadding(bottom = actionsViewInitialPaddingBottom + insets.bottom) + WindowInsetsCompat.CONSUMED + } binding.version.text = String.format(getString(R.string.version_label), BuildConfig.VERSION_NAME) diff --git a/sample/src/main/java/com/sampleapp/functions/layoutinspector/DemoLayoutInspectorActivity.kt b/sample/src/main/java/com/sampleapp/functions/layoutinspector/DemoLayoutInspectorActivity.kt index f478172e..85ce0057 100644 --- a/sample/src/main/java/com/sampleapp/functions/layoutinspector/DemoLayoutInspectorActivity.kt +++ b/sample/src/main/java/com/sampleapp/functions/layoutinspector/DemoLayoutInspectorActivity.kt @@ -1,15 +1,26 @@ package com.sampleapp.functions.layoutinspector 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 com.sampleapp.R import com.sampleapp.databinding.ActivityDemoLayoutInspectorBinding class DemoLayoutInspectorActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + enableEdgeToEdge() val binding = ActivityDemoLayoutInspectorBinding.inflate(layoutInflater) setContentView(binding.root) + ViewCompat.setOnApplyWindowInsetsListener(binding.root) { v, windowInsets -> + val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()) + binding.appBar.updatePadding(top = insets.top) + v.updatePadding(left = insets.left, right = insets.right, bottom = insets.bottom) + WindowInsetsCompat.CONSUMED + } binding.close.setOnClickListener { finish() diff --git a/sample/src/main/res/layout/activity_demo_layout_inspector.xml b/sample/src/main/res/layout/activity_demo_layout_inspector.xml index 68266a85..9550efb7 100644 --- a/sample/src/main/res/layout/activity_demo_layout_inspector.xml +++ b/sample/src/main/res/layout/activity_demo_layout_inspector.xml @@ -5,6 +5,7 @@ android:layout_height="match_parent"> diff --git a/sample/src/main/res/layout/activity_main.xml b/sample/src/main/res/layout/activity_main.xml index e6f68b1c..c1c8fb37 100644 --- a/sample/src/main/res/layout/activity_main.xml +++ b/sample/src/main/res/layout/activity_main.xml @@ -6,6 +6,7 @@ android:layout_height="match_parent"> From ec452c3b77a2ceccdc5fe261cca55df2f2ee77bd Mon Sep 17 00:00:00 2001 From: Arga Hutama Date: Thu, 21 May 2026 05:38:51 +0700 Subject: [PATCH 5/6] fix: Detekt and Ktlint violations --- .../src/main/java/com/pluto/ui/selector/SelectorActivity.kt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/pluto/lib/src/main/java/com/pluto/ui/selector/SelectorActivity.kt b/pluto/lib/src/main/java/com/pluto/ui/selector/SelectorActivity.kt index 0212abfe..b3192ac8 100644 --- a/pluto/lib/src/main/java/com/pluto/ui/selector/SelectorActivity.kt +++ b/pluto/lib/src/main/java/com/pluto/ui/selector/SelectorActivity.kt @@ -8,9 +8,9 @@ import android.view.View.GONE import android.view.View.VISIBLE import android.view.animation.Animation import android.view.animation.AnimationUtils +import androidx.activity.enableEdgeToEdge import androidx.activity.viewModels import androidx.annotation.AnimRes -import androidx.activity.enableEdgeToEdge import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat import androidx.core.view.isVisible @@ -105,6 +105,10 @@ class SelectorActivity : FragmentActivity() { startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(MavenSession.releaseUrl))) } + setupObservers() + } + + private fun setupObservers() { Pluto.appStateCallback.state.removeObserver(appStateListener) Pluto.appStateCallback.state.observe(this, appStateListener) From 777f07912b83757c0c7f022358c32ebc26e9d770 Mon Sep 17 00:00:00 2001 From: Arga Hutama Date: Thu, 21 May 2026 05:54:02 +0700 Subject: [PATCH 6/6] fix: PlutoLIFullScreenDialogStyle --- .../plugins/layout-inspector/lib/src/main/res/values/styles.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pluto-plugins/plugins/layout-inspector/lib/src/main/res/values/styles.xml b/pluto-plugins/plugins/layout-inspector/lib/src/main/res/values/styles.xml index 0b7c0acf..44c9ee13 100644 --- a/pluto-plugins/plugins/layout-inspector/lib/src/main/res/values/styles.xml +++ b/pluto-plugins/plugins/layout-inspector/lib/src/main/res/values/styles.xml @@ -28,5 +28,7 @@ false @android:color/transparent false + @android:color/transparent + @android:color/transparent \ No newline at end of file