mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-11-04 08:59:03 -06:00 
			
		
		
		
	android: Use navigation bar shade view
This commit is contained in:
		@@ -65,23 +65,8 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
 | 
			
		||||
 | 
			
		||||
        window.statusBarColor =
 | 
			
		||||
            ContextCompat.getColor(applicationContext, android.R.color.transparent)
 | 
			
		||||
        ThemeHelper.setNavigationBarColor(
 | 
			
		||||
            this,
 | 
			
		||||
            ElevationOverlayProvider(binding.navigationView.context).compositeOverlay(
 | 
			
		||||
                MaterialColors.getColor(binding.navigationView, R.attr.colorSurface),
 | 
			
		||||
                binding.navigationView.elevation
 | 
			
		||||
            )
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
        val navHostFragment =
 | 
			
		||||
            supportFragmentManager.findFragmentById(R.id.fragment_container) as NavHostFragment
 | 
			
		||||
        setUpNavigation(navHostFragment.navController)
 | 
			
		||||
        (binding.navigationView as NavigationBarView).setOnItemReselectedListener {
 | 
			
		||||
            when (it.itemId) {
 | 
			
		||||
                R.id.gamesFragment -> gamesViewModel.setShouldScrollToTop(true)
 | 
			
		||||
                R.id.searchFragment -> gamesViewModel.setSearchFocused(true)
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        window.navigationBarColor =
 | 
			
		||||
            ContextCompat.getColor(applicationContext, android.R.color.transparent)
 | 
			
		||||
 | 
			
		||||
        binding.statusBarShade.setBackgroundColor(
 | 
			
		||||
            ThemeHelper.getColorWithOpacity(
 | 
			
		||||
@@ -92,6 +77,27 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
 | 
			
		||||
                ThemeHelper.SYSTEM_BAR_ALPHA
 | 
			
		||||
            )
 | 
			
		||||
        )
 | 
			
		||||
        if (InsetsHelper.getSystemGestureType(applicationContext) != InsetsHelper.GESTURE_NAVIGATION) {
 | 
			
		||||
            binding.navigationBarShade.setBackgroundColor(
 | 
			
		||||
                ThemeHelper.getColorWithOpacity(
 | 
			
		||||
                    MaterialColors.getColor(
 | 
			
		||||
                        binding.root,
 | 
			
		||||
                        R.attr.colorSurface
 | 
			
		||||
                    ),
 | 
			
		||||
                    ThemeHelper.SYSTEM_BAR_ALPHA
 | 
			
		||||
                )
 | 
			
		||||
            )
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        val navHostFragment =
 | 
			
		||||
            supportFragmentManager.findFragmentById(R.id.fragment_container) as NavHostFragment
 | 
			
		||||
        setUpNavigation(navHostFragment.navController)
 | 
			
		||||
        (binding.navigationView as NavigationBarView).setOnItemReselectedListener {
 | 
			
		||||
            when (it.itemId) {
 | 
			
		||||
                R.id.gamesFragment -> gamesViewModel.setShouldScrollToTop(true)
 | 
			
		||||
                R.id.searchFragment -> gamesViewModel.setSearchFocused(true)
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Prevents navigation from being drawn for a short time on recreation if set to hidden
 | 
			
		||||
        if (!homeViewModel.navigationVisible.value?.first!!) {
 | 
			
		||||
@@ -116,14 +122,6 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
 | 
			
		||||
        navController.navigate(R.id.action_firstTimeSetupFragment_to_gamesFragment)
 | 
			
		||||
        (binding.navigationView as NavigationBarView).setupWithNavController(navController)
 | 
			
		||||
        showNavigation(visible = true, animated = true)
 | 
			
		||||
 | 
			
		||||
        ThemeHelper.setNavigationBarColor(
 | 
			
		||||
            this,
 | 
			
		||||
            ElevationOverlayProvider(binding.navigationView.context).compositeOverlay(
 | 
			
		||||
                MaterialColors.getColor(binding.navigationView, R.attr.colorSurface),
 | 
			
		||||
                binding.navigationView.elevation
 | 
			
		||||
            )
 | 
			
		||||
        )
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun setUpNavigation(navController: NavController) {
 | 
			
		||||
@@ -210,11 +208,18 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun setInsets() =
 | 
			
		||||
        ViewCompat.setOnApplyWindowInsetsListener(binding.statusBarShade) { view: View, windowInsets: WindowInsetsCompat ->
 | 
			
		||||
        ViewCompat.setOnApplyWindowInsetsListener(binding.root) { _: View, windowInsets: WindowInsetsCompat ->
 | 
			
		||||
            val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars())
 | 
			
		||||
            val mlpShade = view.layoutParams as MarginLayoutParams
 | 
			
		||||
            mlpShade.height = insets.top
 | 
			
		||||
            binding.statusBarShade.layoutParams = mlpShade
 | 
			
		||||
            val mlpStatusShade = binding.statusBarShade.layoutParams as MarginLayoutParams
 | 
			
		||||
            mlpStatusShade.height = insets.top
 | 
			
		||||
            binding.statusBarShade.layoutParams = mlpStatusShade
 | 
			
		||||
 | 
			
		||||
            // The only situation where we care to have a nav bar shade is when it's at the bottom
 | 
			
		||||
            // of the screen where scrolling list elements can go behind it.
 | 
			
		||||
            val mlpNavShade = binding.navigationBarShade.layoutParams as MarginLayoutParams
 | 
			
		||||
            mlpNavShade.height = insets.bottom
 | 
			
		||||
            binding.navigationBarShade.layoutParams = mlpNavShade
 | 
			
		||||
 | 
			
		||||
            windowInsets
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -44,28 +44,6 @@ object ThemeHelper {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @JvmStatic
 | 
			
		||||
    fun setNavigationBarColor(activity: Activity, @ColorInt color: Int) {
 | 
			
		||||
        val gestureType = InsetsHelper.getSystemGestureType(activity.applicationContext)
 | 
			
		||||
        val orientation = activity.resources.configuration.orientation
 | 
			
		||||
 | 
			
		||||
        if ((gestureType == InsetsHelper.THREE_BUTTON_NAVIGATION ||
 | 
			
		||||
                    gestureType == InsetsHelper.TWO_BUTTON_NAVIGATION) &&
 | 
			
		||||
            orientation == Configuration.ORIENTATION_LANDSCAPE
 | 
			
		||||
        ) {
 | 
			
		||||
            activity.window.navigationBarColor = color
 | 
			
		||||
        } else if (gestureType == InsetsHelper.THREE_BUTTON_NAVIGATION ||
 | 
			
		||||
            gestureType == InsetsHelper.TWO_BUTTON_NAVIGATION
 | 
			
		||||
        ) {
 | 
			
		||||
            activity.window.navigationBarColor = getColorWithOpacity(color, SYSTEM_BAR_ALPHA)
 | 
			
		||||
        } else {
 | 
			
		||||
            activity.window.navigationBarColor = ContextCompat.getColor(
 | 
			
		||||
                activity.applicationContext,
 | 
			
		||||
                android.R.color.transparent
 | 
			
		||||
            )
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @ColorInt
 | 
			
		||||
    fun getColorWithOpacity(@ColorInt color: Int, alphaFactor: Float): Int {
 | 
			
		||||
        return Color.argb(
 | 
			
		||||
 
 | 
			
		||||
@@ -43,4 +43,15 @@
 | 
			
		||||
        app:layout_constraintEnd_toEndOf="parent"
 | 
			
		||||
        app:layout_constraintStart_toStartOf="parent" />
 | 
			
		||||
 | 
			
		||||
    <View
 | 
			
		||||
        android:id="@+id/navigation_bar_shade"
 | 
			
		||||
        android:layout_width="0dp"
 | 
			
		||||
        android:layout_height="1px"
 | 
			
		||||
        android:background="@android:color/transparent"
 | 
			
		||||
        android:clickable="false"
 | 
			
		||||
        android:focusable="false"
 | 
			
		||||
        app:layout_constraintBottom_toBottomOf="parent"
 | 
			
		||||
        app:layout_constraintEnd_toEndOf="parent"
 | 
			
		||||
        app:layout_constraintStart_toStartOf="parent" />
 | 
			
		||||
 | 
			
		||||
</androidx.constraintlayout.widget.ConstraintLayout>
 | 
			
		||||
 
 | 
			
		||||
@@ -43,4 +43,15 @@
 | 
			
		||||
        app:layout_constraintEnd_toEndOf="parent"
 | 
			
		||||
        app:layout_constraintStart_toStartOf="parent" />
 | 
			
		||||
 | 
			
		||||
    <View
 | 
			
		||||
        android:id="@+id/navigation_bar_shade"
 | 
			
		||||
        android:layout_width="0dp"
 | 
			
		||||
        android:layout_height="1px"
 | 
			
		||||
        android:background="@android:color/transparent"
 | 
			
		||||
        android:clickable="false"
 | 
			
		||||
        android:focusable="false"
 | 
			
		||||
        app:layout_constraintBottom_toBottomOf="parent"
 | 
			
		||||
        app:layout_constraintEnd_toEndOf="parent"
 | 
			
		||||
        app:layout_constraintStart_toStartOf="parent" />
 | 
			
		||||
 | 
			
		||||
</androidx.constraintlayout.widget.ConstraintLayout>
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user