[Android] Fix edge to edge for HeaderMediaListActivity and InfoActivity

Nicolas Pomepuy git at videolan.org
Mon Jul 28 05:42:04 UTC 2025


vlc-android | branch: master | Nicolas Pomepuy <nicolas at videolabs.io> | Thu May 15 14:13:28 2025 +0200| [df5b7bde5bc0dbc185b86d4699d72f42026de8ce] | committer: Nicolas Pomepuy

Fix edge to edge for HeaderMediaListActivity and InfoActivity

> https://code.videolan.org/videolan/vlc-android/commit/df5b7bde5bc0dbc185b86d4699d72f42026de8ce
---

 .../res/layout/header_media_list_activity.xml      |  4 ----
 .../vlc/gui/AudioPlayerContainerActivity.kt        |  1 -
 .../videolan/vlc/gui/HeaderMediaListActivity.kt    | 22 +++++++++++++++++
 .../src/org/videolan/vlc/gui/InfoActivity.kt       | 28 ++++++++++++++++++++--
 4 files changed, 48 insertions(+), 7 deletions(-)

diff --git a/application/vlc-android/res/layout/header_media_list_activity.xml b/application/vlc-android/res/layout/header_media_list_activity.xml
index 752da15e95..b90902d975 100644
--- a/application/vlc-android/res/layout/header_media_list_activity.xml
+++ b/application/vlc-android/res/layout/header_media_list_activity.xml
@@ -38,7 +38,6 @@
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
                 android:background="?attr/background_default"
-                android:fitsSystemWindows="true"
                 vlc:layout_behavior="org.videolan.vlc.gui.helpers.ExpandStateAppBarLayoutBehavior">
 
             <com.google.android.material.appbar.CollapsingToolbarLayout
@@ -46,7 +45,6 @@
                     android:layout_width="match_parent"
                     android:layout_height="match_parent"
                     android:importantForAccessibility="no"
-                    android:fitsSystemWindows="true"
                     android:keyboardNavigationCluster="true"
                     tools:targetApi="O"
                     vlc:contentScrim="?attr/background_actionbar"
@@ -66,7 +64,6 @@
                         android:layout_height="wrap_content"
                         android:layout_gravity="center_horizontal"
                         android:clipChildren="false"
-                        android:fitsSystemWindows="true"
                         vlc:layout_collapseMode="parallax">
 
                     <ImageView
@@ -88,7 +85,6 @@
                             tools:layout_marginTop="86dp"
                             vlc:layoutMarginTop="@{topmargin}"
                             android:layout_marginEnd="@dimen/default_margin"
-                            android:fitsSystemWindows="true"
                             android:scaleType="fitCenter"
                             android:src="@{cover}"
                             vlc:layout_constraintStart_toStartOf="parent"
diff --git a/application/vlc-android/src/org/videolan/vlc/gui/AudioPlayerContainerActivity.kt b/application/vlc-android/src/org/videolan/vlc/gui/AudioPlayerContainerActivity.kt
index c72137ab8d..282efcade4 100644
--- a/application/vlc-android/src/org/videolan/vlc/gui/AudioPlayerContainerActivity.kt
+++ b/application/vlc-android/src/org/videolan/vlc/gui/AudioPlayerContainerActivity.kt
@@ -218,7 +218,6 @@ open class AudioPlayerContainerActivity : BaseActivity(), KeycodeListener, Sched
                     val bottomNavigationView = findViewById<BottomNavigationView?>(R.id.navigation)
                     bottomNavigationView?.setPadding(bottomNavigationView.paddingLeft, bottomNavigationView.paddingTop, bottomNavigationView.paddingRight, insets.bottom)
                     bottomInset = insets.bottom
-                    insetListener.invoke(insets)
                     if (::audioPlayer.isInitialized) audioPlayer.setBottomMargin()
                 }
                 setContentBottomPadding()
diff --git a/application/vlc-android/src/org/videolan/vlc/gui/HeaderMediaListActivity.kt b/application/vlc-android/src/org/videolan/vlc/gui/HeaderMediaListActivity.kt
index f662393c3d..6be5f44521 100644
--- a/application/vlc-android/src/org/videolan/vlc/gui/HeaderMediaListActivity.kt
+++ b/application/vlc-android/src/org/videolan/vlc/gui/HeaderMediaListActivity.kt
@@ -36,6 +36,10 @@ import androidx.appcompat.view.ActionMode
 import androidx.appcompat.widget.SearchView
 import androidx.coordinatorlayout.widget.CoordinatorLayout
 import androidx.core.content.ContextCompat
+import androidx.core.view.ViewCompat
+import androidx.core.view.WindowCompat
+import androidx.core.view.WindowInsetsCompat
+import androidx.core.view.updatePadding
 import androidx.databinding.DataBindingUtil
 import androidx.lifecycle.asFlow
 import androidx.lifecycle.lifecycleScope
@@ -126,6 +130,7 @@ import org.videolan.vlc.util.ThumbnailsProvider
 import org.videolan.vlc.util.getScreenWidth
 import org.videolan.vlc.util.isSchemeHttpOrHttps
 import org.videolan.vlc.util.launchWhenStarted
+import org.videolan.vlc.util.setLayoutMarginTop
 import org.videolan.vlc.util.share
 import org.videolan.vlc.viewmodels.PlaylistModel
 import org.videolan.vlc.viewmodels.mobile.PlaylistViewModel
@@ -147,11 +152,28 @@ open class HeaderMediaListActivity : AudioPlayerContainerActivity(), IEventsHand
     private lateinit var viewModel: PlaylistViewModel
     private var itemTouchHelper: ItemTouchHelper? = null
     override fun isTransparent() = true
+    override var isEdgeToEdge = false
 
     public override fun onCreate(savedInstanceState: Bundle?) {
+        WindowCompat.setDecorFitsSystemWindows(window, false)
+        WindowCompat.getInsetsController(window, window.decorView).isAppearanceLightStatusBars = false
         super.onCreate(savedInstanceState)
 
         binding = DataBindingUtil.setContentView(this, R.layout.header_media_list_activity)
+        ViewCompat.setOnApplyWindowInsetsListener(findViewById<View>(android.R.id.content)) { v, windowInsets ->
+            val bars = windowInsets.getInsets(
+                WindowInsetsCompat.Type.systemBars()
+                        or WindowInsetsCompat.Type.displayCutout()
+            )
+            v.updatePadding(
+                left = bars.left,
+                right = bars.right,
+                bottom = bars.bottom,
+            )
+
+            setLayoutMarginTop(binding.mainToolbar, bars.top)
+            WindowInsetsCompat.CONSUMED
+        }
 
         initAudioPlayerContainerActivity()
         fragmentContainer = binding.songs
diff --git a/application/vlc-android/src/org/videolan/vlc/gui/InfoActivity.kt b/application/vlc-android/src/org/videolan/vlc/gui/InfoActivity.kt
index 78b4c5ca10..7523532cd1 100644
--- a/application/vlc-android/src/org/videolan/vlc/gui/InfoActivity.kt
+++ b/application/vlc-android/src/org/videolan/vlc/gui/InfoActivity.kt
@@ -15,6 +15,9 @@ import androidx.core.content.ContextCompat
 import androidx.core.graphics.Insets
 import androidx.core.net.toUri
 import androidx.core.view.ViewCompat
+import androidx.core.view.WindowCompat
+import androidx.core.view.WindowInsetsCompat
+import androidx.core.view.updatePadding
 import androidx.databinding.DataBindingUtil
 import androidx.lifecycle.MutableLiveData
 import androidx.lifecycle.ViewModel
@@ -51,11 +54,15 @@ import org.videolan.vlc.gui.helpers.MedialibraryUtils
 import org.videolan.vlc.gui.video.MediaInfoAdapter
 import org.videolan.vlc.gui.view.VLCDividerItemDecoration
 import org.videolan.vlc.media.MediaUtils
-import org.videolan.vlc.util.*
+import org.videolan.vlc.util.ThumbnailsProvider
+import org.videolan.vlc.util.generateResolutionClass
+import org.videolan.vlc.util.getModel
+import org.videolan.vlc.util.getScreenWidth
+import org.videolan.vlc.util.isSchemeSupported
+import org.videolan.vlc.util.setLayoutMarginTop
 import org.videolan.vlc.viewmodels.browser.IPathOperationDelegate
 import org.videolan.vlc.viewmodels.browser.PathOperationDelegate
 import java.io.File
-import java.util.*
 
 private const val TAG = "VLC/InfoActivity"
 private const val TAG_FAB_VISIBILITY = "FAB"
@@ -66,6 +73,7 @@ class InfoActivity : AudioPlayerContainerActivity(), View.OnClickListener, PathA
     private lateinit var item: MediaLibraryItem
     private lateinit var adapter: MediaInfoAdapter
     private lateinit var model: InfoModel
+    override var isEdgeToEdge = false
 
     internal lateinit var binding: InfoActivityBinding
     override fun isTransparent() = true
@@ -74,7 +82,23 @@ class InfoActivity : AudioPlayerContainerActivity(), View.OnClickListener, PathA
     }
 
     override fun onCreate(savedInstanceState: Bundle?) {
+        WindowCompat.setDecorFitsSystemWindows(window, false)
+        WindowCompat.getInsetsController(window, window.decorView).isAppearanceLightStatusBars = false
         super.onCreate(savedInstanceState)
+        ViewCompat.setOnApplyWindowInsetsListener(findViewById<View>(android.R.id.content)) { v, windowInsets ->
+            val bars = windowInsets.getInsets(
+                WindowInsetsCompat.Type.systemBars()
+                        or WindowInsetsCompat.Type.displayCutout()
+            )
+            v.updatePadding(
+                left = bars.left,
+                right = bars.right,
+                bottom = bars.bottom,
+            )
+
+            setLayoutMarginTop(binding.mainToolbar, bars.top)
+            WindowInsetsCompat.CONSUMED
+        }
 
         binding = DataBindingUtil.setContentView(this, R.layout.info_activity)
 



More information about the Android mailing list