From bb6935def9854425984b17c0a584508666f3a614 Mon Sep 17 00:00:00 2001 From: Nicolas Pomepuy Date: Thu, 26 Sep 2024 14:34:32 +0200 Subject: [PATCH] Make all the activities edge to edge --- .../RemoteAccessOnboardingActivity.kt | 18 +++ .../layout/widget_mini_player_configure.xml | 107 ++++++++++-------- .../src/org/videolan/vlc/gui/BaseActivity.kt | 24 ++++ .../org/videolan/vlc/gui/SecondaryActivity.kt | 20 ++++ .../vlc/gui/onboarding/OnboardingActivity.kt | 18 +++ .../vlc/widget/MiniPlayerConfigureActivity.kt | 30 ++++- 6 files changed, 170 insertions(+), 47 deletions(-) diff --git a/application/remote-access-server/src/main/java/org/videolan/vlc/remoteaccessserver/gui/remoteaccess/onboarding/RemoteAccessOnboardingActivity.kt b/application/remote-access-server/src/main/java/org/videolan/vlc/remoteaccessserver/gui/remoteaccess/onboarding/RemoteAccessOnboardingActivity.kt index 3c8982966..ccc872d88 100644 --- a/application/remote-access-server/src/main/java/org/videolan/vlc/remoteaccessserver/gui/remoteaccess/onboarding/RemoteAccessOnboardingActivity.kt +++ b/application/remote-access-server/src/main/java/org/videolan/vlc/remoteaccessserver/gui/remoteaccess/onboarding/RemoteAccessOnboardingActivity.kt @@ -27,8 +27,12 @@ package org.videolan.vlc.remoteaccessserver.gui.remoteaccess.onboarding import android.os.Bundle import android.view.View import android.widget.Button +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.fragment.app.commit import org.videolan.tools.setGone import org.videolan.vlc.R @@ -40,7 +44,21 @@ class RemoteAccessOnboardingActivity : AppCompatActivity(), OnboardingFragmentLi private lateinit var skipButton: Button private val viewModel: RemoteAccessOnboardingViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { + enableEdgeToEdge() super.onCreate(savedInstanceState) + ViewCompat.setOnApplyWindowInsetsListener(findViewById(android.R.id.content)) { v, windowInsets -> + val bars = windowInsets.getInsets( + WindowInsetsCompat.Type.systemBars() + or WindowInsetsCompat.Type.displayCutout() + ) + v.updatePadding( + left = bars.left, + top = bars.top, + right = bars.right, + bottom = bars.bottom, + ) + WindowInsetsCompat.CONSUMED + } setContentView(R.layout.activity_onboarding) showFragment(viewModel.currentFragment) } diff --git a/application/vlc-android/res/layout/widget_mini_player_configure.xml b/application/vlc-android/res/layout/widget_mini_player_configure.xml index d8fc9b0d9..1e1a3a855 100644 --- a/application/vlc-android/res/layout/widget_mini_player_configure.xml +++ b/application/vlc-android/res/layout/widget_mini_player_configure.xml @@ -24,76 +24,91 @@ - - + android:layout_height="match_parent" + android:orientation="vertical"> - + - + android:layout_height="match_parent"> + + - + android:fillViewport="true" + vlc:layout_behavior="@string/appbar_scrolling_view_behavior"> - - - - + android:layout_gravity="center_horizontal" + android:layout_marginTop="24dp" /> - + android:layout_gravity="end" + android:layout_marginTop="24dp" + android:background="?attr/widget_preview_rounded_bg" + android:orientation="vertical" + android:paddingLeft="16dp" + android:paddingTop="8dp" + android:paddingRight="16dp" + android:paddingBottom="8dp"> + + + + + + + + + + + - - - - diff --git a/application/vlc-android/src/org/videolan/vlc/gui/BaseActivity.kt b/application/vlc-android/src/org/videolan/vlc/gui/BaseActivity.kt index 5649c35bf..aa3203771 100644 --- a/application/vlc-android/src/org/videolan/vlc/gui/BaseActivity.kt +++ b/application/vlc-android/src/org/videolan/vlc/gui/BaseActivity.kt @@ -14,12 +14,16 @@ import android.view.KeyEvent import android.view.Menu import android.view.MenuItem import android.view.View +import androidx.activity.enableEdgeToEdge import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.viewModels import androidx.annotation.RequiresApi import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatDelegate import androidx.appcompat.app.BaseContextWrappingDelegate +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat +import androidx.core.view.updatePadding import androidx.lifecycle.Lifecycle import androidx.lifecycle.flowWithLifecycle import androidx.lifecycle.lifecycleScope @@ -57,6 +61,12 @@ abstract class BaseActivity : AppCompatActivity() { open val displayTitle = false open fun forcedTheme():Int? = null open var isOTPActivity:Boolean = false + + /** + * Enables edge-to-edge mode for this activity. + * Set it to false if you want to override this behavior. + */ + open var isEdgeToEdge = true abstract fun getSnackAnchorView(overAudioPlayer:Boolean = false): View? private var baseContextWrappingDelegate: AppCompatDelegate? = null private var resultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> @@ -74,7 +84,21 @@ abstract class BaseActivity : AppCompatActivity() { open fun onDisplaySettingChanged(key:String, value:Any) { } override fun onCreate(savedInstanceState: Bundle?) { + if (isEdgeToEdge) enableEdgeToEdge() settings = Settings.getInstance(this) + if (isEdgeToEdge) ViewCompat.setOnApplyWindowInsetsListener(findViewById(android.R.id.content)) { v, windowInsets -> + val bars = windowInsets.getInsets( + WindowInsetsCompat.Type.systemBars() + or WindowInsetsCompat.Type.displayCutout() + ) + v.updatePadding( + left = bars.left, + top = bars.top, + right = bars.right, + bottom = bars.bottom, + ) + WindowInsetsCompat.CONSUMED + } /* Theme must be applied before super.onCreate */ applyTheme() super.onCreate(savedInstanceState) diff --git a/application/vlc-android/src/org/videolan/vlc/gui/SecondaryActivity.kt b/application/vlc-android/src/org/videolan/vlc/gui/SecondaryActivity.kt index f37875bc5..4fb122395 100644 --- a/application/vlc-android/src/org/videolan/vlc/gui/SecondaryActivity.kt +++ b/application/vlc-android/src/org/videolan/vlc/gui/SecondaryActivity.kt @@ -28,9 +28,15 @@ import android.os.Bundle import android.view.Menu import android.view.MenuItem import android.view.View +import android.view.ViewGroup +import androidx.activity.enableEdgeToEdge import androidx.coordinatorlayout.widget.CoordinatorLayout import androidx.core.os.bundleOf +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsControllerCompat +import androidx.core.view.updateLayoutParams +import androidx.core.view.updatePadding import androidx.fragment.app.Fragment import androidx.lifecycle.lifecycleScope import com.google.android.material.appbar.AppBarLayout @@ -80,7 +86,21 @@ class SecondaryActivity : ContentActivity(), IDialogManager { else null override fun onCreate(savedInstanceState: Bundle?) { + enableEdgeToEdge() super.onCreate(savedInstanceState) + ViewCompat.setOnApplyWindowInsetsListener(findViewById(android.R.id.content)) { v, windowInsets -> + val bars = windowInsets.getInsets( + WindowInsetsCompat.Type.systemBars() + or WindowInsetsCompat.Type.displayCutout() + ) + v.updatePadding( + left = bars.left, + top = bars.top, + right = bars.right, + bottom = bars.bottom, + ) + WindowInsetsCompat.CONSUMED + } setContentView(R.layout.secondary) initAudioPlayerContainerActivity() diff --git a/application/vlc-android/src/org/videolan/vlc/gui/onboarding/OnboardingActivity.kt b/application/vlc-android/src/org/videolan/vlc/gui/onboarding/OnboardingActivity.kt index 77b2ed8fc..a67823d47 100644 --- a/application/vlc-android/src/org/videolan/vlc/gui/onboarding/OnboardingActivity.kt +++ b/application/vlc-android/src/org/videolan/vlc/gui/onboarding/OnboardingActivity.kt @@ -9,11 +9,15 @@ import android.os.Bundle import android.view.View import android.widget.Button import android.widget.Toast +import androidx.activity.enableEdgeToEdge import androidx.activity.viewModels import androidx.annotation.RequiresApi import androidx.appcompat.app.AppCompatActivity import androidx.core.app.ActivityCompat import androidx.core.content.edit +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat +import androidx.core.view.updatePadding import androidx.fragment.app.commit import androidx.lifecycle.lifecycleScope import kotlinx.coroutines.launch @@ -38,7 +42,21 @@ class OnboardingActivity : AppCompatActivity(), OnboardingFragmentListener { private lateinit var nextButton: Button private val viewModel: OnboardingViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { + enableEdgeToEdge() super.onCreate(savedInstanceState) + ViewCompat.setOnApplyWindowInsetsListener(findViewById(android.R.id.content)) { v, windowInsets -> + val bars = windowInsets.getInsets( + WindowInsetsCompat.Type.systemBars() + or WindowInsetsCompat.Type.displayCutout() + ) + v.updatePadding( + left = bars.left, + top = bars.top, + right = bars.right, + bottom = bars.bottom, + ) + WindowInsetsCompat.CONSUMED + } // viewModel.permissionGranted = Permissions.canReadStorage(applicationContext) setContentView(R.layout.activity_onboarding) showFragment(viewModel.currentFragment) diff --git a/application/vlc-android/src/org/videolan/vlc/widget/MiniPlayerConfigureActivity.kt b/application/vlc-android/src/org/videolan/vlc/widget/MiniPlayerConfigureActivity.kt index 5b5d66075..6d1c0a5af 100644 --- a/application/vlc-android/src/org/videolan/vlc/widget/MiniPlayerConfigureActivity.kt +++ b/application/vlc-android/src/org/videolan/vlc/widget/MiniPlayerConfigureActivity.kt @@ -36,8 +36,14 @@ import android.view.Menu import android.view.MenuItem import android.widget.FrameLayout import android.widget.FrameLayout.LayoutParams +import android.widget.LinearLayout +import androidx.activity.enableEdgeToEdge import androidx.core.content.ContextCompat import androidx.core.os.bundleOf +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat +import androidx.core.view.updateLayoutParams +import androidx.core.view.updatePadding import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope import androidx.palette.graphics.Palette @@ -62,12 +68,34 @@ class MiniPlayerConfigureActivity : BaseActivity() { override val displayTitle = true private lateinit var binding: WidgetMiniPlayerConfigureBinding var appWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID + override var isEdgeToEdge = false override fun getSnackAnchorView(overAudioPlayer: Boolean) = binding.coordinator public override fun onCreate(savedInstanceState: Bundle?) { + enableEdgeToEdge() super.onCreate(savedInstanceState) - binding = WidgetMiniPlayerConfigureBinding.inflate(layoutInflater) + ViewCompat.setOnApplyWindowInsetsListener(binding.statusView) { v, windowInsets -> + val bars = windowInsets.getInsets( + WindowInsetsCompat.Type.systemBars() + or WindowInsetsCompat.Type.displayCutout() + ) + v.updateLayoutParams { + if (BuildConfig.DEBUG) Log.d(this::class.java.simpleName, "Set height to: ${bars.top}") + v.layoutParams.height = bars.top + } + WindowInsetsCompat.CONSUMED + } + ViewCompat.setOnApplyWindowInsetsListener(binding.fragmentPlaceholder) { v, windowInsets -> + val bars = windowInsets.getInsets( + WindowInsetsCompat.Type.systemBars() + or WindowInsetsCompat.Type.displayCutout() + ) + v.updatePadding( + bottom = bars.bottom + ) + WindowInsetsCompat.CONSUMED + } setContentView(binding.root) if (BuildConfig.DEBUG) Log.d(this::class.java.simpleName, "Launching MiniPlayerConfigureActivity")