android: Add navigation rail

This commit is contained in:
Charles Lombardo 2023-05-01 02:26:47 -04:00 committed by bunnei
parent 6df030998a
commit 9f6f21946c
14 changed files with 208 additions and 93 deletions

View File

@ -15,6 +15,7 @@ import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat import androidx.core.view.ViewCompat
import androidx.core.view.WindowCompat import androidx.core.view.WindowCompat
import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsCompat
import android.view.ViewGroup.MarginLayoutParams
import androidx.core.view.updatePadding import androidx.core.view.updatePadding
import com.google.android.material.color.MaterialColors import com.google.android.material.color.MaterialColors
import org.yuzu.yuzu_emu.NativeLibrary import org.yuzu.yuzu_emu.NativeLibrary
@ -52,12 +53,14 @@ class SettingsActivity : AppCompatActivity(), SettingsActivityView {
setSupportActionBar(binding.toolbarSettings) setSupportActionBar(binding.toolbarSettings)
supportActionBar!!.setDisplayHomeAsUpEnabled(true) supportActionBar!!.setDisplayHomeAsUpEnabled(true)
binding.navigationBarShade.setBackgroundColor( if (InsetsHelper.getSystemGestureType(applicationContext) != InsetsHelper.GESTURE_NAVIGATION) {
ThemeHelper.getColorWithOpacity( binding.navigationBarShade.setBackgroundColor(
MaterialColors.getColor(binding.navigationBarShade, R.attr.colorSurface), ThemeHelper.getColorWithOpacity(
ThemeHelper.SYSTEM_BAR_ALPHA MaterialColors.getColor(binding.navigationBarShade, R.attr.colorSurface),
ThemeHelper.SYSTEM_BAR_ALPHA
)
) )
) }
setInsets() setInsets()
} }
@ -164,12 +167,20 @@ class SettingsActivity : AppCompatActivity(), SettingsActivityView {
private fun setInsets() { private fun setInsets() {
ViewCompat.setOnApplyWindowInsetsListener(binding.frameContent) { view: View, windowInsets: WindowInsetsCompat -> ViewCompat.setOnApplyWindowInsetsListener(binding.frameContent) { view: View, windowInsets: WindowInsetsCompat ->
val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()) val barInsets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars())
view.updatePadding(left = insets.left, right = insets.right) val cutoutInsets = windowInsets.getInsets(WindowInsetsCompat.Type.displayCutout())
InsetsHelper.insetAppBar(insets, binding.appbarSettings) view.updatePadding(
left = barInsets.left + cutoutInsets.left,
right = barInsets.right + cutoutInsets.right
)
val mlpShade = binding.navigationBarShade.layoutParams as ViewGroup.MarginLayoutParams val mlpAppBar = binding.appbarSettings.layoutParams as MarginLayoutParams
mlpShade.height = insets.bottom mlpAppBar.leftMargin = barInsets.left + cutoutInsets.left
mlpAppBar.rightMargin = barInsets.right + cutoutInsets.right
binding.appbarSettings.layoutParams = mlpAppBar
val mlpShade = binding.navigationBarShade.layoutParams as MarginLayoutParams
mlpShade.height = barInsets.bottom
binding.navigationBarShade.layoutParams = mlpShade binding.navigationBarShade.layoutParams = mlpShade
windowInsets windowInsets

View File

@ -20,6 +20,7 @@ import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat import androidx.core.app.NotificationManagerCompat
import androidx.core.view.ViewCompat import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsCompat
import androidx.core.view.updatePadding
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels import androidx.fragment.app.activityViewModels
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
@ -107,26 +108,30 @@ class HomeSettingsFragment : Fragment() {
try { try {
startActivity(getFileManagerIntentOnDocumentProvider(Intent.ACTION_VIEW)) startActivity(getFileManagerIntentOnDocumentProvider(Intent.ACTION_VIEW))
return return
} catch (_: ActivityNotFoundException) {} } catch (_: ActivityNotFoundException) {
}
try { try {
startActivity(getFileManagerIntentOnDocumentProvider("android.provider.action.BROWSE")) startActivity(getFileManagerIntentOnDocumentProvider("android.provider.action.BROWSE"))
return return
} catch (_: ActivityNotFoundException) {} } catch (_: ActivityNotFoundException) {
}
// Just try to open the file manager, try the package name used on "normal" phones // Just try to open the file manager, try the package name used on "normal" phones
try { try {
startActivity(getFileManagerIntent("com.google.android.documentsui")) startActivity(getFileManagerIntent("com.google.android.documentsui"))
showNoLinkNotification() showNoLinkNotification()
return return
} catch (_: ActivityNotFoundException) {} } catch (_: ActivityNotFoundException) {
}
try { try {
// Next, try the AOSP package name // Next, try the AOSP package name
startActivity(getFileManagerIntent("com.android.documentsui")) startActivity(getFileManagerIntent("com.android.documentsui"))
showNoLinkNotification() showNoLinkNotification()
return return
} catch (_: ActivityNotFoundException) {} } catch (_: ActivityNotFoundException) {
}
Toast.makeText( Toast.makeText(
requireContext(), requireContext(),
@ -153,7 +158,10 @@ class HomeSettingsFragment : Fragment() {
} }
private fun showNoLinkNotification() { private fun showNoLinkNotification() {
val builder = NotificationCompat.Builder(requireContext(), getString(R.string.notice_notification_channel_id)) val builder = NotificationCompat.Builder(
requireContext(),
getString(R.string.notice_notification_channel_id)
)
.setSmallIcon(R.drawable.ic_stat_notification_logo) .setSmallIcon(R.drawable.ic_stat_notification_logo)
.setContentTitle(getString(R.string.notification_no_directory_link)) .setContentTitle(getString(R.string.notification_no_directory_link))
.setContentText(getString(R.string.notification_no_directory_link_description)) .setContentText(getString(R.string.notification_no_directory_link_description))
@ -204,14 +212,28 @@ class HomeSettingsFragment : Fragment() {
} }
private fun setInsets() = private fun setInsets() =
ViewCompat.setOnApplyWindowInsetsListener(binding.scrollViewSettings) { view: View, windowInsets: WindowInsetsCompat -> ViewCompat.setOnApplyWindowInsetsListener(binding.root) { view: View, windowInsets: WindowInsetsCompat ->
val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()) val barInsets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars())
view.setPadding( val cutoutInsets = windowInsets.getInsets(WindowInsetsCompat.Type.displayCutout())
insets.left, val spacingNavigation = resources.getDimensionPixelSize(R.dimen.spacing_navigation)
insets.top, val spacingNavigationRail =
insets.right, resources.getDimensionPixelSize(R.dimen.spacing_navigation_rail)
insets.bottom + resources.getDimensionPixelSize(R.dimen.spacing_navigation)
binding.scrollViewSettings.setPadding(
barInsets.left + cutoutInsets.left,
barInsets.top,
barInsets.right + cutoutInsets.right,
barInsets.bottom
) )
binding.linearLayoutSettings.updatePadding(bottom = spacingNavigation)
if (ViewCompat.getLayoutDirection(view) == ViewCompat.LAYOUT_DIRECTION_LTR) {
binding.linearLayoutSettings.updatePadding(left = spacingNavigationRail)
} else {
binding.linearLayoutSettings.updatePadding(right = spacingNavigationRail)
}
windowInsets windowInsets
} }
} }

View File

@ -141,7 +141,8 @@ class SearchFragment : Fragment() {
} }
if (binding.searchText.text.toString().isEmpty() if (binding.searchText.text.toString().isEmpty()
&& binding.chipGroup.checkedChipId != View.NO_ID) { && binding.chipGroup.checkedChipId != View.NO_ID
) {
gamesViewModel.setSearchedGames(filteredList) gamesViewModel.setSearchedGames(filteredList)
return return
} }
@ -182,41 +183,51 @@ class SearchFragment : Fragment() {
} }
private fun setInsets() = private fun setInsets() =
ViewCompat.setOnApplyWindowInsetsListener(binding.root) { _: View, windowInsets: WindowInsetsCompat -> ViewCompat.setOnApplyWindowInsetsListener(binding.root) { view: View, windowInsets: WindowInsetsCompat ->
val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()) val barInsets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars())
val cutoutInsets = windowInsets.getInsets(WindowInsetsCompat.Type.displayCutout())
val extraListSpacing = resources.getDimensionPixelSize(R.dimen.spacing_med) val extraListSpacing = resources.getDimensionPixelSize(R.dimen.spacing_med)
val navigationSpacing = resources.getDimensionPixelSize(R.dimen.spacing_navigation) val spacingNavigation = resources.getDimensionPixelSize(R.dimen.spacing_navigation)
val spacingNavigationRail =
resources.getDimensionPixelSize(R.dimen.spacing_navigation_rail)
val chipSpacing = resources.getDimensionPixelSize(R.dimen.spacing_chip) val chipSpacing = resources.getDimensionPixelSize(R.dimen.spacing_chip)
binding.frameSearch.updatePadding( binding.constraintSearch.updatePadding(
left = insets.left, left = barInsets.left + cutoutInsets.left,
top = insets.top, top = barInsets.top,
right = insets.right right = barInsets.right + cutoutInsets.right
) )
binding.gridGamesSearch.setPadding( binding.gridGamesSearch.updatePadding(
insets.left, top = extraListSpacing,
extraListSpacing, bottom = barInsets.bottom + spacingNavigation + extraListSpacing
insets.right,
insets.bottom + resources.getDimensionPixelSize(R.dimen.spacing_navigation) + extraListSpacing
)
binding.noResultsView.updatePadding(
left = insets.left,
right = insets.right,
bottom = insets.bottom + navigationSpacing
) )
binding.noResultsView.updatePadding(bottom = spacingNavigation + barInsets.bottom)
val mlpDivider = binding.divider.layoutParams as ViewGroup.MarginLayoutParams val mlpDivider = binding.divider.layoutParams as ViewGroup.MarginLayoutParams
mlpDivider.leftMargin = insets.left + chipSpacing if (ViewCompat.getLayoutDirection(view) == ViewCompat.LAYOUT_DIRECTION_LTR) {
mlpDivider.rightMargin = insets.right + chipSpacing binding.frameSearch.updatePadding(left = spacingNavigationRail)
binding.gridGamesSearch.updatePadding(left = spacingNavigationRail)
binding.noResultsView.updatePadding(left = spacingNavigationRail)
binding.chipGroup.updatePadding(
left = chipSpacing + spacingNavigationRail,
right = chipSpacing
)
mlpDivider.leftMargin = chipSpacing + spacingNavigationRail
mlpDivider.rightMargin = chipSpacing
} else {
binding.frameSearch.updatePadding(right = spacingNavigationRail)
binding.gridGamesSearch.updatePadding(right = spacingNavigationRail)
binding.noResultsView.updatePadding(right = spacingNavigationRail)
binding.chipGroup.updatePadding(
left = chipSpacing,
right = chipSpacing + spacingNavigationRail
)
mlpDivider.leftMargin = chipSpacing
mlpDivider.rightMargin = chipSpacing + spacingNavigationRail
}
binding.divider.layoutParams = mlpDivider binding.divider.layoutParams = mlpDivider
binding.chipGroup.updatePadding(
left = insets.left + chipSpacing,
right = insets.right + chipSpacing
)
windowInsets windowInsets
} }
} }

View File

@ -8,27 +8,20 @@ import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.view.ViewGroup.MarginLayoutParams import android.view.ViewGroup.MarginLayoutParams
import androidx.activity.OnBackPressedCallback
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsCompat
import androidx.core.view.updatePadding import androidx.core.view.updatePadding
import androidx.core.widget.doOnTextChanged
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels import androidx.fragment.app.activityViewModels
import com.google.android.material.color.MaterialColors import com.google.android.material.color.MaterialColors
import com.google.android.material.search.SearchView
import com.google.android.material.search.SearchView.TransitionState
import com.google.android.material.transition.MaterialFadeThrough import com.google.android.material.transition.MaterialFadeThrough
import info.debatty.java.stringsimilarity.Jaccard
import org.yuzu.yuzu_emu.R import org.yuzu.yuzu_emu.R
import org.yuzu.yuzu_emu.adapters.GameAdapter import org.yuzu.yuzu_emu.adapters.GameAdapter
import org.yuzu.yuzu_emu.databinding.FragmentGamesBinding import org.yuzu.yuzu_emu.databinding.FragmentGamesBinding
import org.yuzu.yuzu_emu.layout.AutofitGridLayoutManager import org.yuzu.yuzu_emu.layout.AutofitGridLayoutManager
import org.yuzu.yuzu_emu.model.Game
import org.yuzu.yuzu_emu.model.GamesViewModel import org.yuzu.yuzu_emu.model.GamesViewModel
import org.yuzu.yuzu_emu.model.HomeViewModel import org.yuzu.yuzu_emu.model.HomeViewModel
import java.util.Locale
class GamesFragment : Fragment() { class GamesFragment : Fragment() {
private var _binding: FragmentGamesBinding? = null private var _binding: FragmentGamesBinding? = null
@ -127,24 +120,37 @@ class GamesFragment : Fragment() {
private fun setInsets() = private fun setInsets() =
ViewCompat.setOnApplyWindowInsetsListener(binding.root) { view: View, windowInsets: WindowInsetsCompat -> ViewCompat.setOnApplyWindowInsetsListener(binding.root) { view: View, windowInsets: WindowInsetsCompat ->
val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()) val barInsets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars())
val cutoutInsets = windowInsets.getInsets(WindowInsetsCompat.Type.displayCutout())
val extraListSpacing = resources.getDimensionPixelSize(R.dimen.spacing_large) val extraListSpacing = resources.getDimensionPixelSize(R.dimen.spacing_large)
val spacingNavigation = resources.getDimensionPixelSize(R.dimen.spacing_navigation)
val spacingNavigationRail =
resources.getDimensionPixelSize(R.dimen.spacing_navigation_rail)
binding.gridGames.updatePadding( binding.gridGames.updatePadding(
top = insets.top + extraListSpacing, top = barInsets.top + extraListSpacing,
bottom = insets.bottom + resources.getDimensionPixelSize(R.dimen.spacing_navigation) + extraListSpacing bottom = barInsets.bottom + spacingNavigation + extraListSpacing
) )
binding.swipeRefresh.setProgressViewEndTarget( binding.swipeRefresh.setProgressViewEndTarget(
false, false,
insets.top + resources.getDimensionPixelSize(R.dimen.spacing_refresh_end) barInsets.top + resources.getDimensionPixelSize(R.dimen.spacing_refresh_end)
) )
val leftInsets = barInsets.left + cutoutInsets.left
val rightInsets = barInsets.right + cutoutInsets.right
val mlpSwipe = binding.swipeRefresh.layoutParams as MarginLayoutParams val mlpSwipe = binding.swipeRefresh.layoutParams as MarginLayoutParams
mlpSwipe.rightMargin = insets.right if (ViewCompat.getLayoutDirection(view) == ViewCompat.LAYOUT_DIRECTION_LTR) {
mlpSwipe.leftMargin = insets.left mlpSwipe.leftMargin = leftInsets + spacingNavigationRail
mlpSwipe.rightMargin = rightInsets
} else {
mlpSwipe.leftMargin = leftInsets
mlpSwipe.rightMargin = rightInsets + spacingNavigationRail
}
binding.swipeRefresh.layoutParams = mlpSwipe binding.swipeRefresh.layoutParams = mlpSwipe
binding.noticeText.updatePadding(bottom = spacingNavigation)
windowInsets windowInsets
} }
} }

View File

@ -67,16 +67,16 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
ContextCompat.getColor(applicationContext, android.R.color.transparent) ContextCompat.getColor(applicationContext, android.R.color.transparent)
ThemeHelper.setNavigationBarColor( ThemeHelper.setNavigationBarColor(
this, this,
ElevationOverlayProvider(binding.navigationBar.context).compositeOverlay( ElevationOverlayProvider(binding.navigationView.context).compositeOverlay(
MaterialColors.getColor(binding.navigationBar, R.attr.colorSurface), MaterialColors.getColor(binding.navigationView, R.attr.colorSurface),
binding.navigationBar.elevation binding.navigationView.elevation
) )
) )
val navHostFragment = val navHostFragment =
supportFragmentManager.findFragmentById(R.id.fragment_container) as NavHostFragment supportFragmentManager.findFragmentById(R.id.fragment_container) as NavHostFragment
setUpNavigation(navHostFragment.navController) setUpNavigation(navHostFragment.navController)
(binding.navigationBar as NavigationBarView).setOnItemReselectedListener { (binding.navigationView as NavigationBarView).setOnItemReselectedListener {
when (it.itemId) { when (it.itemId) {
R.id.gamesFragment -> gamesViewModel.setShouldScrollToTop(true) R.id.gamesFragment -> gamesViewModel.setShouldScrollToTop(true)
R.id.searchFragment -> gamesViewModel.setSearchFocused(true) R.id.searchFragment -> gamesViewModel.setSearchFocused(true)
@ -95,7 +95,7 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
// Prevents navigation from being drawn for a short time on recreation if set to hidden // Prevents navigation from being drawn for a short time on recreation if set to hidden
if (!homeViewModel.navigationVisible.value?.first!!) { if (!homeViewModel.navigationVisible.value?.first!!) {
binding.navigationBar.visibility = View.INVISIBLE binding.navigationView.visibility = View.INVISIBLE
binding.statusBarShade.visibility = View.INVISIBLE binding.statusBarShade.visibility = View.INVISIBLE
} }
@ -114,14 +114,14 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
fun finishSetup(navController: NavController) { fun finishSetup(navController: NavController) {
navController.navigate(R.id.action_firstTimeSetupFragment_to_gamesFragment) navController.navigate(R.id.action_firstTimeSetupFragment_to_gamesFragment)
binding.navigationBar.setupWithNavController(navController) (binding.navigationView as NavigationBarView).setupWithNavController(navController)
showNavigation(visible = true, animated = true) showNavigation(visible = true, animated = true)
ThemeHelper.setNavigationBarColor( ThemeHelper.setNavigationBarColor(
this, this,
ElevationOverlayProvider(binding.navigationBar.context).compositeOverlay( ElevationOverlayProvider(binding.navigationView.context).compositeOverlay(
MaterialColors.getColor(binding.navigationBar, R.attr.colorSurface), MaterialColors.getColor(binding.navigationView, R.attr.colorSurface),
binding.navigationBar.elevation binding.navigationView.elevation
) )
) )
} }
@ -134,35 +134,35 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
navController.navigate(R.id.firstTimeSetupFragment) navController.navigate(R.id.firstTimeSetupFragment)
homeViewModel.navigatedToSetup = true homeViewModel.navigatedToSetup = true
} else { } else {
binding.navigationBar.setupWithNavController(navController) (binding.navigationView as NavigationBarView).setupWithNavController(navController)
} }
} }
private fun showNavigation(visible: Boolean, animated: Boolean) { private fun showNavigation(visible: Boolean, animated: Boolean) {
if (!animated) { if (!animated) {
if (visible) { if (visible) {
binding.navigationBar.visibility = View.VISIBLE binding.navigationView.visibility = View.VISIBLE
} else { } else {
binding.navigationBar.visibility = View.INVISIBLE binding.navigationView.visibility = View.INVISIBLE
} }
return return
} }
binding.navigationBar.animate().apply { binding.navigationView.animate().apply {
if (visible) { if (visible) {
binding.navigationBar.visibility = View.VISIBLE binding.navigationView.visibility = View.VISIBLE
binding.navigationBar.translationY = binding.navigationBar.height.toFloat() * 2 binding.navigationView.translationY = binding.navigationView.height.toFloat() * 2
duration = 300 duration = 300
translationY(0f) translationY(0f)
interpolator = PathInterpolator(0.05f, 0.7f, 0.1f, 1f) interpolator = PathInterpolator(0.05f, 0.7f, 0.1f, 1f)
} else { } else {
duration = 300 duration = 300
translationY(binding.navigationBar.height.toFloat() * 2) translationY(binding.navigationView.height.toFloat() * 2)
interpolator = PathInterpolator(0.3f, 0f, 0.8f, 0.15f) interpolator = PathInterpolator(0.3f, 0f, 0.8f, 0.15f)
} }
}.withEndAction { }.withEndAction {
if (!visible) { if (!visible) {
binding.navigationBar.visibility = View.INVISIBLE binding.navigationView.visibility = View.INVISIBLE
} }
}.start() }.start()
} }
@ -177,7 +177,7 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
interpolator = PathInterpolator(0.05f, 0.7f, 0.1f, 1f) interpolator = PathInterpolator(0.05f, 0.7f, 0.1f, 1f)
} else { } else {
duration = 300 duration = 300
translationY(binding.navigationBar.height.toFloat() * -2) translationY(binding.navigationView.height.toFloat() * -2)
interpolator = PathInterpolator(0.3f, 0f, 0.8f, 0.15f) interpolator = PathInterpolator(0.3f, 0f, 0.8f, 0.15f)
} }
}.withEndAction { }.withEndAction {

View File

@ -4,22 +4,12 @@ import android.annotation.SuppressLint
import android.app.Activity import android.app.Activity
import android.content.Context import android.content.Context
import android.graphics.Rect import android.graphics.Rect
import android.view.ViewGroup.MarginLayoutParams
import androidx.core.graphics.Insets
import com.google.android.material.appbar.AppBarLayout
object InsetsHelper { object InsetsHelper {
const val THREE_BUTTON_NAVIGATION = 0 const val THREE_BUTTON_NAVIGATION = 0
const val TWO_BUTTON_NAVIGATION = 1 const val TWO_BUTTON_NAVIGATION = 1
const val GESTURE_NAVIGATION = 2 const val GESTURE_NAVIGATION = 2
fun insetAppBar(insets: Insets, appBarLayout: AppBarLayout) {
val mlpAppBar = appBarLayout.layoutParams as MarginLayoutParams
mlpAppBar.leftMargin = insets.left
mlpAppBar.rightMargin = insets.right
appBarLayout.layoutParams = mlpAppBar
}
@SuppressLint("DiscouragedApi") @SuppressLint("DiscouragedApi")
fun getSystemGestureType(context: Context): Int { fun getSystemGestureType(context: Context): Int {
val resources = context.resources val resources = context.resources

View File

@ -0,0 +1,46 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/coordinator_main"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.fragment.app.FragmentContainerView
android:id="@+id/fragment_container"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="0dp"
android:layout_height="0dp"
app:defaultNavHost="true"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:navGraph="@navigation/home_navigation"
tools:layout="@layout/fragment_games" />
<com.google.android.material.navigationrail.NavigationRailView
android:id="@+id/navigation_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:visibility="invisible"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:labelVisibilityMode="selected"
app:menu="@menu/menu_navigation"
tools:visibility="visible" />
<View
android:id="@+id/status_bar_shade"
android:layout_width="0dp"
android:layout_height="1px"
android:background="@android:color/transparent"
android:clickable="false"
android:focusable="false"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -21,7 +21,7 @@
tools:layout="@layout/fragment_games" /> tools:layout="@layout/fragment_games" />
<com.google.android.material.bottomnavigation.BottomNavigationView <com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/navigation_bar" android:id="@+id/navigation_view"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:visibility="invisible" android:visibility="invisible"

View File

@ -8,6 +8,7 @@
android:clipToPadding="false"> android:clipToPadding="false">
<androidx.appcompat.widget.LinearLayoutCompat <androidx.appcompat.widget.LinearLayoutCompat
android:id="@+id/linear_layout_settings"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:orientation="vertical" android:orientation="vertical"

View File

@ -3,9 +3,11 @@
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/constraint_search"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="?attr/colorSurface"> android:background="?attr/colorSurface"
android:clipToPadding="false">
<RelativeLayout <RelativeLayout
android:layout_width="0dp" android:layout_width="0dp"
@ -52,7 +54,8 @@
android:id="@+id/frame_search" android:id="@+id/frame_search"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_margin="20dp" android:layout_marginTop="12dp"
android:layout_marginHorizontal="20dp"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"> app:layout_constraintTop_toTopOf="parent">

View File

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/homeSettingsFragment"
android:icon="@drawable/ic_settings"
android:title="@string/home_settings" />
<item
android:id="@+id/searchFragment"
android:icon="@drawable/ic_search"
android:title="@string/home_search" />
<item
android:id="@+id/gamesFragment"
android:icon="@drawable/ic_controller"
android:title="@string/home_games" />
</menu>

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="spacing_navigation">0dp</dimen>
<dimen name="spacing_navigation_rail">80dp</dimen>
</resources>

View File

@ -7,6 +7,7 @@
<dimen name="spacing_list">64dp</dimen> <dimen name="spacing_list">64dp</dimen>
<dimen name="spacing_chip">20dp</dimen> <dimen name="spacing_chip">20dp</dimen>
<dimen name="spacing_navigation">80dp</dimen> <dimen name="spacing_navigation">80dp</dimen>
<dimen name="spacing_navigation_rail">0dp</dimen>
<dimen name="spacing_search">128dp</dimen> <dimen name="spacing_search">128dp</dimen>
<dimen name="spacing_refresh_end">72dp</dimen> <dimen name="spacing_refresh_end">72dp</dimen>
<dimen name="menu_width">256dp</dimen> <dimen name="menu_width">256dp</dimen>

View File

@ -42,7 +42,7 @@
<item name="sliderStyle">@style/YuzuSlider</item> <item name="sliderStyle">@style/YuzuSlider</item>
<item name="materialAlertDialogTheme">@style/YuzuMaterialDialog</item> <item name="materialAlertDialogTheme">@style/YuzuMaterialDialog</item>
<item name="android:windowLayoutInDisplayCutoutMode">default</item> <item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
<item name="android:enforceStatusBarContrast">false</item> <item name="android:enforceStatusBarContrast">false</item>
<item name="android:enforceNavigationBarContrast">false</item> <item name="android:enforceNavigationBarContrast">false</item>