diff options
| author | 2023-05-01 16:33:21 -0400 | |
|---|---|---|
| committer | 2023-06-03 00:05:58 -0700 | |
| commit | 21e8a8277ad8697576a2b1a4e230a68649c17812 (patch) | |
| tree | 9f5b865fe7f7494d4776c1bf9e6d9eca27682708 /src/android | |
| parent | android: Use x-axis animation for navigation rail (diff) | |
| download | yuzu-21e8a8277ad8697576a2b1a4e230a68649c17812.tar.gz yuzu-21e8a8277ad8697576a2b1a4e230a68649c17812.tar.xz yuzu-21e8a8277ad8697576a2b1a4e230a68649c17812.zip | |
android: About fragment
Diffstat (limited to 'src/android')
10 files changed, 415 insertions, 3 deletions
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/AboutFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/AboutFragment.kt new file mode 100644 index 000000000..fc7c782a6 --- /dev/null +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/AboutFragment.kt | |||
| @@ -0,0 +1,120 @@ | |||
| 1 | // SPDX-FileCopyrightText: 2023 yuzu Emulator Project | ||
| 2 | // SPDX-License-Identifier: GPL-2.0-or-later | ||
| 3 | |||
| 4 | package org.yuzu.yuzu_emu.fragments | ||
| 5 | |||
| 6 | import android.content.ClipData | ||
| 7 | import android.content.ClipboardManager | ||
| 8 | import android.content.Context | ||
| 9 | import android.content.Intent | ||
| 10 | import android.net.Uri | ||
| 11 | import android.os.Build | ||
| 12 | import android.os.Bundle | ||
| 13 | import android.view.LayoutInflater | ||
| 14 | import android.view.View | ||
| 15 | import android.view.ViewGroup | ||
| 16 | import android.view.ViewGroup.MarginLayoutParams | ||
| 17 | import android.widget.Toast | ||
| 18 | import androidx.core.view.ViewCompat | ||
| 19 | import androidx.core.view.WindowInsetsCompat | ||
| 20 | import androidx.core.view.updatePadding | ||
| 21 | import androidx.fragment.app.Fragment | ||
| 22 | import androidx.fragment.app.activityViewModels | ||
| 23 | import androidx.navigation.fragment.findNavController | ||
| 24 | import com.google.android.material.transition.MaterialSharedAxis | ||
| 25 | import org.yuzu.yuzu_emu.BuildConfig | ||
| 26 | import org.yuzu.yuzu_emu.R | ||
| 27 | import org.yuzu.yuzu_emu.databinding.FragmentAboutBinding | ||
| 28 | import org.yuzu.yuzu_emu.model.HomeViewModel | ||
| 29 | |||
| 30 | class AboutFragment : Fragment() { | ||
| 31 | private var _binding: FragmentAboutBinding? = null | ||
| 32 | private val binding get() = _binding!! | ||
| 33 | |||
| 34 | private val homeViewModel: HomeViewModel by activityViewModels() | ||
| 35 | |||
| 36 | override fun onCreate(savedInstanceState: Bundle?) { | ||
| 37 | super.onCreate(savedInstanceState) | ||
| 38 | enterTransition = MaterialSharedAxis(MaterialSharedAxis.X, true) | ||
| 39 | returnTransition = MaterialSharedAxis(MaterialSharedAxis.X, false) | ||
| 40 | } | ||
| 41 | |||
| 42 | override fun onCreateView( | ||
| 43 | inflater: LayoutInflater, | ||
| 44 | container: ViewGroup?, | ||
| 45 | savedInstanceState: Bundle? | ||
| 46 | ): View { | ||
| 47 | _binding = FragmentAboutBinding.inflate(layoutInflater) | ||
| 48 | return binding.root | ||
| 49 | } | ||
| 50 | |||
| 51 | override fun onViewCreated(view: View, savedInstanceState: Bundle?) { | ||
| 52 | homeViewModel.setNavigationVisibility(visible = false, animated = true) | ||
| 53 | homeViewModel.setStatusBarShadeVisibility(visible = false) | ||
| 54 | |||
| 55 | binding.toolbarAbout.setNavigationOnClickListener { | ||
| 56 | parentFragmentManager.primaryNavigationFragment?.findNavController()?.popBackStack() | ||
| 57 | } | ||
| 58 | |||
| 59 | binding.imageLogo.setOnLongClickListener { | ||
| 60 | Toast.makeText( | ||
| 61 | requireContext(), | ||
| 62 | R.string.gaia_is_not_real, | ||
| 63 | Toast.LENGTH_SHORT | ||
| 64 | ).show() | ||
| 65 | true | ||
| 66 | } | ||
| 67 | |||
| 68 | binding.buttonContributors.setOnClickListener { openLink(getString(R.string.contributors_link)) } | ||
| 69 | |||
| 70 | binding.textBuildHash.text = BuildConfig.GIT_HASH | ||
| 71 | binding.buttonBuildHash.setOnClickListener { | ||
| 72 | val clipBoard = | ||
| 73 | requireContext().getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager | ||
| 74 | val clip = ClipData.newPlainText(getString(R.string.build), BuildConfig.GIT_HASH) | ||
| 75 | clipBoard.setPrimaryClip(clip) | ||
| 76 | |||
| 77 | if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) { | ||
| 78 | Toast.makeText( | ||
| 79 | requireContext(), | ||
| 80 | R.string.copied_to_clipboard, | ||
| 81 | Toast.LENGTH_SHORT | ||
| 82 | ).show() | ||
| 83 | } | ||
| 84 | } | ||
| 85 | |||
| 86 | binding.buttonDiscord.setOnClickListener { openLink(getString(R.string.support_link)) } | ||
| 87 | binding.buttonWebsite.setOnClickListener { openLink(getString(R.string.website_link)) } | ||
| 88 | binding.buttonGithub.setOnClickListener { openLink(getString(R.string.github_link)) } | ||
| 89 | |||
| 90 | setInsets() | ||
| 91 | } | ||
| 92 | |||
| 93 | private fun openLink(link: String) { | ||
| 94 | val intent = Intent(Intent.ACTION_VIEW, Uri.parse(link)) | ||
| 95 | startActivity(intent) | ||
| 96 | } | ||
| 97 | |||
| 98 | private fun setInsets() = | ||
| 99 | ViewCompat.setOnApplyWindowInsetsListener(binding.root) { _: View, windowInsets: WindowInsetsCompat -> | ||
| 100 | val barInsets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()) | ||
| 101 | val cutoutInsets = windowInsets.getInsets(WindowInsetsCompat.Type.displayCutout()) | ||
| 102 | |||
| 103 | val leftInsets = barInsets.left + cutoutInsets.left | ||
| 104 | val rightInsets = barInsets.right + cutoutInsets.right | ||
| 105 | |||
| 106 | val mlpAppBar = binding.appbarAbout.layoutParams as MarginLayoutParams | ||
| 107 | mlpAppBar.leftMargin = leftInsets | ||
| 108 | mlpAppBar.rightMargin = rightInsets | ||
| 109 | binding.appbarAbout.layoutParams = mlpAppBar | ||
| 110 | |||
| 111 | val mlpScrollAbout = binding.scrollAbout.layoutParams as MarginLayoutParams | ||
| 112 | mlpScrollAbout.leftMargin = leftInsets | ||
| 113 | mlpScrollAbout.rightMargin = rightInsets | ||
| 114 | binding.scrollAbout.layoutParams = mlpScrollAbout | ||
| 115 | |||
| 116 | binding.contentAbout.updatePadding(bottom = barInsets.bottom) | ||
| 117 | |||
| 118 | windowInsets | ||
| 119 | } | ||
| 120 | } | ||
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/HomeSettingsFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/HomeSettingsFragment.kt index 875dce676..c7427e151 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/HomeSettingsFragment.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/HomeSettingsFragment.kt | |||
| @@ -23,8 +23,10 @@ import androidx.core.view.WindowInsetsCompat | |||
| 23 | import androidx.core.view.updatePadding | 23 | import androidx.core.view.updatePadding |
| 24 | import androidx.fragment.app.Fragment | 24 | import androidx.fragment.app.Fragment |
| 25 | import androidx.fragment.app.activityViewModels | 25 | import androidx.fragment.app.activityViewModels |
| 26 | import androidx.navigation.fragment.findNavController | ||
| 26 | import androidx.recyclerview.widget.LinearLayoutManager | 27 | import androidx.recyclerview.widget.LinearLayoutManager |
| 27 | import com.google.android.material.dialog.MaterialAlertDialogBuilder | 28 | import com.google.android.material.dialog.MaterialAlertDialogBuilder |
| 29 | import com.google.android.material.transition.MaterialSharedAxis | ||
| 28 | import org.yuzu.yuzu_emu.R | 30 | import org.yuzu.yuzu_emu.R |
| 29 | import org.yuzu.yuzu_emu.adapters.HomeSettingAdapter | 31 | import org.yuzu.yuzu_emu.adapters.HomeSettingAdapter |
| 30 | import org.yuzu.yuzu_emu.databinding.FragmentHomeSettingsBinding | 32 | import org.yuzu.yuzu_emu.databinding.FragmentHomeSettingsBinding |
| @@ -44,6 +46,11 @@ class HomeSettingsFragment : Fragment() { | |||
| 44 | 46 | ||
| 45 | private val homeViewModel: HomeViewModel by activityViewModels() | 47 | private val homeViewModel: HomeViewModel by activityViewModels() |
| 46 | 48 | ||
| 49 | override fun onCreate(savedInstanceState: Bundle?) { | ||
| 50 | super.onCreate(savedInstanceState) | ||
| 51 | reenterTransition = MaterialSharedAxis(MaterialSharedAxis.X, false) | ||
| 52 | } | ||
| 53 | |||
| 47 | override fun onCreateView( | 54 | override fun onCreateView( |
| 48 | inflater: LayoutInflater, | 55 | inflater: LayoutInflater, |
| 49 | container: ViewGroup?, | 56 | container: ViewGroup?, |
| @@ -54,7 +61,6 @@ class HomeSettingsFragment : Fragment() { | |||
| 54 | } | 61 | } |
| 55 | 62 | ||
| 56 | override fun onViewCreated(view: View, savedInstanceState: Bundle?) { | 63 | override fun onViewCreated(view: View, savedInstanceState: Bundle?) { |
| 57 | homeViewModel.setNavigationVisibility(visible = true, animated = false) | ||
| 58 | mainActivity = requireActivity() as MainActivity | 64 | mainActivity = requireActivity() as MainActivity |
| 59 | 65 | ||
| 60 | val optionsList: List<HomeSetting> = listOf( | 66 | val optionsList: List<HomeSetting> = listOf( |
| @@ -87,7 +93,16 @@ class HomeSettingsFragment : Fragment() { | |||
| 87 | R.string.install_prod_keys, | 93 | R.string.install_prod_keys, |
| 88 | R.string.install_prod_keys_description, | 94 | R.string.install_prod_keys_description, |
| 89 | R.drawable.ic_unlock | 95 | R.drawable.ic_unlock |
| 90 | ) { mainActivity.getProdKey.launch(arrayOf("*/*")) } | 96 | ) { mainActivity.getProdKey.launch(arrayOf("*/*")) }, |
| 97 | HomeSetting( | ||
| 98 | R.string.about, | ||
| 99 | R.string.about_description, | ||
| 100 | R.drawable.ic_info_outline | ||
| 101 | ) { | ||
| 102 | exitTransition = MaterialSharedAxis(MaterialSharedAxis.X, true) | ||
| 103 | parentFragmentManager.primaryNavigationFragment?.findNavController() | ||
| 104 | ?.navigate(R.id.action_homeSettingsFragment_to_aboutFragment) | ||
| 105 | } | ||
| 91 | ) | 106 | ) |
| 92 | 107 | ||
| 93 | binding.homeSettingsList.apply { | 108 | binding.homeSettingsList.apply { |
| @@ -98,6 +113,13 @@ class HomeSettingsFragment : Fragment() { | |||
| 98 | setInsets() | 113 | setInsets() |
| 99 | } | 114 | } |
| 100 | 115 | ||
| 116 | override fun onStart() { | ||
| 117 | super.onStart() | ||
| 118 | exitTransition = null | ||
| 119 | homeViewModel.setNavigationVisibility(visible = true, animated = true) | ||
| 120 | homeViewModel.setStatusBarShadeVisibility(visible = true) | ||
| 121 | } | ||
| 122 | |||
| 101 | override fun onDestroyView() { | 123 | override fun onDestroyView() { |
| 102 | super.onDestroyView() | 124 | super.onDestroyView() |
| 103 | _binding = null | 125 | _binding = null |
diff --git a/src/android/app/src/main/res/drawable/ic_back.xml b/src/android/app/src/main/res/drawable/ic_back.xml new file mode 100644 index 000000000..f99fea719 --- /dev/null +++ b/src/android/app/src/main/res/drawable/ic_back.xml | |||
| @@ -0,0 +1,10 @@ | |||
| 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" | ||
| 2 | android:width="24dp" | ||
| 3 | android:height="24dp" | ||
| 4 | android:autoMirrored="true" | ||
| 5 | android:viewportWidth="24" | ||
| 6 | android:viewportHeight="24"> | ||
| 7 | <path | ||
| 8 | android:fillColor="?attr/colorControlNormal" | ||
| 9 | android:pathData="M20,11H7.83l5.59,-5.59L12,4l-8,8 8,8 1.41,-1.41L7.83,13H20v-2z" /> | ||
| 10 | </vector> | ||
diff --git a/src/android/app/src/main/res/drawable/ic_discord.xml b/src/android/app/src/main/res/drawable/ic_discord.xml new file mode 100644 index 000000000..7a9c6ba79 --- /dev/null +++ b/src/android/app/src/main/res/drawable/ic_discord.xml | |||
| @@ -0,0 +1,10 @@ | |||
| 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" | ||
| 2 | android:width="200dp" | ||
| 3 | android:height="200dp" | ||
| 4 | android:viewportWidth="256" | ||
| 5 | android:viewportHeight="256"> | ||
| 6 | <path | ||
| 7 | android:fillColor="#5865F2" | ||
| 8 | android:fillType="nonZero" | ||
| 9 | android:pathData="M216.86,45.1C200.29,37.34 182.57,31.71 164.04,28.5C161.77,32.61 159.11,38.15 157.28,42.55C137.58,39.58 118.07,39.58 98.74,42.55C96.91,38.15 94.19,32.61 91.9,28.5C73.35,31.71 55.61,37.36 39.04,45.14C5.62,95.65 -3.44,144.9 1.09,193.46C23.26,210.01 44.74,220.07 65.86,226.65C71.08,219.47 75.73,211.84 79.74,203.8C72.1,200.9 64.79,197.32 57.89,193.17C59.72,191.81 61.51,190.39 63.24,188.93C105.37,208.63 151.13,208.63 192.75,188.93C194.51,190.39 196.3,191.81 198.11,193.17C191.18,197.34 183.85,200.92 176.22,203.82C180.23,211.84 184.86,219.49 190.1,226.67C211.24,220.09 232.74,210.03 254.91,193.46C260.23,137.17 245.83,88.37 216.86,45.1ZM85.47,163.59C72.83,163.59 62.46,151.79 62.46,137.41C62.46,123.04 72.61,111.21 85.47,111.21C98.34,111.21 108.71,123.02 108.49,137.41C108.51,151.79 98.34,163.59 85.47,163.59ZM170.53,163.59C157.88,163.59 147.51,151.79 147.51,137.41C147.51,123.04 157.66,111.21 170.53,111.21C183.39,111.21 193.76,123.02 193.54,137.41C193.54,151.79 183.39,163.59 170.53,163.59Z" /> | ||
| 10 | </vector> | ||
diff --git a/src/android/app/src/main/res/drawable/ic_github.xml b/src/android/app/src/main/res/drawable/ic_github.xml new file mode 100644 index 000000000..c2ee43803 --- /dev/null +++ b/src/android/app/src/main/res/drawable/ic_github.xml | |||
| @@ -0,0 +1,10 @@ | |||
| 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" | ||
| 2 | android:width="98dp" | ||
| 3 | android:height="96dp" | ||
| 4 | android:viewportWidth="98" | ||
| 5 | android:viewportHeight="96"> | ||
| 6 | <path | ||
| 7 | android:fillColor="?attr/colorControlNormal" | ||
| 8 | android:fillType="evenOdd" | ||
| 9 | android:pathData="M48.854,0C21.839,0 0,22 0,49.217c0,21.756 13.993,40.172 33.405,46.69 2.427,0.49 3.316,-1.059 3.316,-2.362 0,-1.141 -0.08,-5.052 -0.08,-9.127 -13.59,2.934 -16.42,-5.867 -16.42,-5.867 -2.184,-5.704 -5.42,-7.17 -5.42,-7.17 -4.448,-3.015 0.324,-3.015 0.324,-3.015 4.934,0.326 7.523,5.052 7.523,5.052 4.367,7.496 11.404,5.378 14.235,4.074 0.404,-3.178 1.699,-5.378 3.074,-6.6 -10.839,-1.141 -22.243,-5.378 -22.243,-24.283 0,-5.378 1.94,-9.778 5.014,-13.2 -0.485,-1.222 -2.184,-6.275 0.486,-13.038 0,0 4.125,-1.304 13.426,5.052a46.97,46.97 0,0 1,12.214 -1.63c4.125,0 8.33,0.571 12.213,1.63 9.302,-6.356 13.427,-5.052 13.427,-5.052 2.67,6.763 0.97,11.816 0.485,13.038 3.155,3.422 5.015,7.822 5.015,13.2 0,18.905 -11.404,23.06 -22.324,24.283 1.78,1.548 3.316,4.481 3.316,9.126 0,6.6 -0.08,11.897 -0.08,13.526 0,1.304 0.89,2.853 3.316,2.364 19.412,-6.52 33.405,-24.935 33.405,-46.691C97.707,22 75.788,0 48.854,0z" /> | ||
| 10 | </vector> | ||
diff --git a/src/android/app/src/main/res/drawable/ic_info_outline.xml b/src/android/app/src/main/res/drawable/ic_info_outline.xml new file mode 100644 index 000000000..92ae0eeaf --- /dev/null +++ b/src/android/app/src/main/res/drawable/ic_info_outline.xml | |||
| @@ -0,0 +1,9 @@ | |||
| 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" | ||
| 2 | android:width="24dp" | ||
| 3 | android:height="24dp" | ||
| 4 | android:viewportWidth="24" | ||
| 5 | android:viewportHeight="24"> | ||
| 6 | <path | ||
| 7 | android:fillColor="?attr/colorControlNormal" | ||
| 8 | android:pathData="M11,7h2v2h-2zM11,11h2v6h-2zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8z" /> | ||
| 9 | </vector> | ||
diff --git a/src/android/app/src/main/res/drawable/ic_website.xml b/src/android/app/src/main/res/drawable/ic_website.xml new file mode 100644 index 000000000..f35b84a7c --- /dev/null +++ b/src/android/app/src/main/res/drawable/ic_website.xml | |||
| @@ -0,0 +1,9 @@ | |||
| 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" | ||
| 2 | android:width="24dp" | ||
| 3 | android:height="24dp" | ||
| 4 | android:viewportWidth="24" | ||
| 5 | android:viewportHeight="24"> | ||
| 6 | <path | ||
| 7 | android:fillColor="?attr/colorControlNormal" | ||
| 8 | android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM11,19.93c-3.95,-0.49 -7,-3.85 -7,-7.93 0,-0.62 0.08,-1.21 0.21,-1.79L9,15v1c0,1.1 0.9,2 2,2v1.93zM17.9,17.39c-0.26,-0.81 -1,-1.39 -1.9,-1.39h-1v-3c0,-0.55 -0.45,-1 -1,-1L8,12v-2h2c0.55,0 1,-0.45 1,-1L11,7h2c1.1,0 2,-0.9 2,-2v-0.41c2.93,1.19 5,4.06 5,7.41 0,2.08 -0.8,3.97 -2.1,5.39z" /> | ||
| 9 | </vector> | ||
diff --git a/src/android/app/src/main/res/layout/fragment_about.xml b/src/android/app/src/main/res/layout/fragment_about.xml new file mode 100644 index 000000000..549f00aa5 --- /dev/null +++ b/src/android/app/src/main/res/layout/fragment_about.xml | |||
| @@ -0,0 +1,199 @@ | |||
| 1 | <?xml version="1.0" encoding="utf-8"?> | ||
| 2 | <androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" | ||
| 3 | xmlns:app="http://schemas.android.com/apk/res-auto" | ||
| 4 | xmlns:tools="http://schemas.android.com/tools" | ||
| 5 | android:id="@+id/coordinator_about" | ||
| 6 | android:layout_width="match_parent" | ||
| 7 | android:layout_height="match_parent" | ||
| 8 | android:background="?attr/colorSurface"> | ||
| 9 | |||
| 10 | <com.google.android.material.appbar.AppBarLayout | ||
| 11 | android:id="@+id/appbar_about" | ||
| 12 | android:layout_width="match_parent" | ||
| 13 | android:layout_height="wrap_content" | ||
| 14 | android:fitsSystemWindows="true"> | ||
| 15 | |||
| 16 | <com.google.android.material.appbar.MaterialToolbar | ||
| 17 | android:id="@+id/toolbar_about" | ||
| 18 | android:layout_width="match_parent" | ||
| 19 | android:layout_height="?attr/actionBarSize" | ||
| 20 | app:title="@string/about" | ||
| 21 | app:navigationIcon="@drawable/ic_back" /> | ||
| 22 | |||
| 23 | </com.google.android.material.appbar.AppBarLayout> | ||
| 24 | |||
| 25 | <androidx.core.widget.NestedScrollView | ||
| 26 | android:id="@+id/scroll_about" | ||
| 27 | android:layout_width="match_parent" | ||
| 28 | android:layout_height="match_parent" | ||
| 29 | android:scrollbars="vertical" | ||
| 30 | android:fadeScrollbars="false" | ||
| 31 | app:layout_behavior="@string/appbar_scrolling_view_behavior"> | ||
| 32 | |||
| 33 | <LinearLayout | ||
| 34 | android:id="@+id/content_about" | ||
| 35 | android:layout_width="match_parent" | ||
| 36 | android:layout_height="match_parent" | ||
| 37 | android:orientation="vertical"> | ||
| 38 | |||
| 39 | <ImageView | ||
| 40 | android:id="@+id/image_logo" | ||
| 41 | android:layout_width="250dp" | ||
| 42 | android:layout_height="250dp" | ||
| 43 | android:layout_marginTop="20dp" | ||
| 44 | android:layout_gravity="center_horizontal" | ||
| 45 | android:src="@drawable/ic_yuzu_title" /> | ||
| 46 | |||
| 47 | <com.google.android.material.divider.MaterialDivider | ||
| 48 | android:layout_width="match_parent" | ||
| 49 | android:layout_height="wrap_content" | ||
| 50 | android:layout_marginHorizontal="20dp" | ||
| 51 | android:layout_marginTop="28dp" /> | ||
| 52 | |||
| 53 | <LinearLayout | ||
| 54 | android:layout_width="match_parent" | ||
| 55 | android:layout_height="wrap_content" | ||
| 56 | android:paddingVertical="16dp" | ||
| 57 | android:paddingHorizontal="16dp" | ||
| 58 | android:orientation="vertical"> | ||
| 59 | |||
| 60 | <com.google.android.material.textview.MaterialTextView | ||
| 61 | style="@style/TextAppearance.Material3.TitleMedium" | ||
| 62 | android:layout_width="match_parent" | ||
| 63 | android:layout_height="wrap_content" | ||
| 64 | android:layout_marginHorizontal="24dp" | ||
| 65 | android:textAlignment="viewStart" | ||
| 66 | android:text="@string/about" /> | ||
| 67 | |||
| 68 | <com.google.android.material.textview.MaterialTextView | ||
| 69 | style="@style/TextAppearance.Material3.BodyMedium" | ||
| 70 | android:layout_width="match_parent" | ||
| 71 | android:layout_height="wrap_content" | ||
| 72 | android:layout_marginHorizontal="24dp" | ||
| 73 | android:layout_marginTop="6dp" | ||
| 74 | android:textAlignment="viewStart" | ||
| 75 | android:text="@string/about_app_description" /> | ||
| 76 | |||
| 77 | </LinearLayout> | ||
| 78 | |||
| 79 | <com.google.android.material.divider.MaterialDivider | ||
| 80 | android:layout_width="match_parent" | ||
| 81 | android:layout_height="wrap_content" | ||
| 82 | android:layout_marginHorizontal="20dp" /> | ||
| 83 | |||
| 84 | <LinearLayout | ||
| 85 | android:id="@+id/button_contributors" | ||
| 86 | android:layout_width="match_parent" | ||
| 87 | android:layout_height="wrap_content" | ||
| 88 | android:paddingVertical="16dp" | ||
| 89 | android:paddingHorizontal="16dp" | ||
| 90 | android:background="?attr/selectableItemBackground" | ||
| 91 | android:orientation="vertical"> | ||
| 92 | |||
| 93 | <com.google.android.material.textview.MaterialTextView | ||
| 94 | style="@style/TextAppearance.Material3.TitleMedium" | ||
| 95 | android:layout_width="match_parent" | ||
| 96 | android:layout_height="wrap_content" | ||
| 97 | android:layout_marginHorizontal="24dp" | ||
| 98 | android:textAlignment="viewStart" | ||
| 99 | android:text="@string/contributors" /> | ||
| 100 | |||
| 101 | <com.google.android.material.textview.MaterialTextView | ||
| 102 | style="@style/TextAppearance.Material3.BodyMedium" | ||
| 103 | android:layout_width="match_parent" | ||
| 104 | android:layout_height="wrap_content" | ||
| 105 | android:layout_marginHorizontal="24dp" | ||
| 106 | android:layout_marginTop="6dp" | ||
| 107 | android:textAlignment="viewStart" | ||
| 108 | android:text="@string/contributors_description" /> | ||
| 109 | |||
| 110 | </LinearLayout> | ||
| 111 | |||
| 112 | <com.google.android.material.divider.MaterialDivider | ||
| 113 | android:layout_width="match_parent" | ||
| 114 | android:layout_height="wrap_content" | ||
| 115 | android:layout_marginHorizontal="20dp" /> | ||
| 116 | |||
| 117 | <LinearLayout | ||
| 118 | android:id="@+id/button_build_hash" | ||
| 119 | android:layout_width="match_parent" | ||
| 120 | android:layout_height="wrap_content" | ||
| 121 | android:paddingVertical="16dp" | ||
| 122 | android:paddingHorizontal="16dp" | ||
| 123 | android:background="?attr/selectableItemBackground" | ||
| 124 | android:orientation="vertical"> | ||
| 125 | |||
| 126 | <com.google.android.material.textview.MaterialTextView | ||
| 127 | style="@style/TextAppearance.Material3.TitleMedium" | ||
| 128 | android:layout_width="match_parent" | ||
| 129 | android:layout_height="wrap_content" | ||
| 130 | android:layout_marginHorizontal="24dp" | ||
| 131 | android:textAlignment="viewStart" | ||
| 132 | android:text="@string/build" /> | ||
| 133 | |||
| 134 | <com.google.android.material.textview.MaterialTextView | ||
| 135 | android:id="@+id/text_build_hash" | ||
| 136 | style="@style/TextAppearance.Material3.BodyMedium" | ||
| 137 | android:layout_width="match_parent" | ||
| 138 | android:layout_height="wrap_content" | ||
| 139 | android:layout_marginHorizontal="24dp" | ||
| 140 | android:layout_marginTop="6dp" | ||
| 141 | android:textAlignment="viewStart" | ||
| 142 | tools:text="abc123" /> | ||
| 143 | |||
| 144 | </LinearLayout> | ||
| 145 | |||
| 146 | <com.google.android.material.divider.MaterialDivider | ||
| 147 | android:layout_width="match_parent" | ||
| 148 | android:layout_height="wrap_content" | ||
| 149 | android:layout_marginHorizontal="20dp" /> | ||
| 150 | |||
| 151 | <LinearLayout | ||
| 152 | android:layout_width="match_parent" | ||
| 153 | android:layout_height="wrap_content" | ||
| 154 | android:orientation="horizontal" | ||
| 155 | android:gravity="center_horizontal" | ||
| 156 | android:layout_marginTop="12dp" | ||
| 157 | android:layout_marginBottom="16dp" | ||
| 158 | android:layout_marginHorizontal="40dp"> | ||
| 159 | |||
| 160 | <Button | ||
| 161 | style="?attr/materialIconButtonStyle" | ||
| 162 | android:id="@+id/button_discord" | ||
| 163 | android:layout_width="0dp" | ||
| 164 | android:layout_height="wrap_content" | ||
| 165 | android:layout_weight="1" | ||
| 166 | app:icon="@drawable/ic_discord" | ||
| 167 | app:iconTint="?attr/colorOnSurface" | ||
| 168 | app:iconSize="24dp" | ||
| 169 | app:iconGravity="textEnd" /> | ||
| 170 | |||
| 171 | <Button | ||
| 172 | style="?attr/materialIconButtonStyle" | ||
| 173 | android:id="@+id/button_website" | ||
| 174 | android:layout_width="0dp" | ||
| 175 | android:layout_height="wrap_content" | ||
| 176 | android:layout_weight="1" | ||
| 177 | app:icon="@drawable/ic_website" | ||
| 178 | app:iconTint="?attr/colorOnSurface" | ||
| 179 | app:iconSize="24dp" | ||
| 180 | app:iconGravity="textEnd" /> | ||
| 181 | |||
| 182 | <Button | ||
| 183 | android:id="@+id/button_github" | ||
| 184 | style="?attr/materialIconButtonStyle" | ||
| 185 | android:layout_width="0dp" | ||
| 186 | android:layout_height="wrap_content" | ||
| 187 | android:layout_weight="1" | ||
| 188 | app:icon="@drawable/ic_github" | ||
| 189 | app:iconTint="?attr/colorOnSurface" | ||
| 190 | app:iconSize="24dp" | ||
| 191 | app:iconGravity="textEnd" /> | ||
| 192 | |||
| 193 | </LinearLayout> | ||
| 194 | |||
| 195 | </LinearLayout> | ||
| 196 | |||
| 197 | </androidx.core.widget.NestedScrollView> | ||
| 198 | |||
| 199 | </androidx.coordinatorlayout.widget.CoordinatorLayout> | ||
diff --git a/src/android/app/src/main/res/navigation/home_navigation.xml b/src/android/app/src/main/res/navigation/home_navigation.xml index 0f43ba556..f44eb3fed 100644 --- a/src/android/app/src/main/res/navigation/home_navigation.xml +++ b/src/android/app/src/main/res/navigation/home_navigation.xml | |||
| @@ -12,7 +12,11 @@ | |||
| 12 | <fragment | 12 | <fragment |
| 13 | android:id="@+id/homeSettingsFragment" | 13 | android:id="@+id/homeSettingsFragment" |
| 14 | android:name="org.yuzu.yuzu_emu.fragments.HomeSettingsFragment" | 14 | android:name="org.yuzu.yuzu_emu.fragments.HomeSettingsFragment" |
| 15 | android:label="HomeSettingsFragment" /> | 15 | android:label="HomeSettingsFragment" > |
| 16 | <action | ||
| 17 | android:id="@+id/action_homeSettingsFragment_to_aboutFragment" | ||
| 18 | app:destination="@id/aboutFragment" /> | ||
| 19 | </fragment> | ||
| 16 | 20 | ||
| 17 | <fragment | 21 | <fragment |
| 18 | android:id="@+id/firstTimeSetupFragment" | 22 | android:id="@+id/firstTimeSetupFragment" |
| @@ -30,4 +34,9 @@ | |||
| 30 | android:name="org.yuzu.yuzu_emu.fragments.SearchFragment" | 34 | android:name="org.yuzu.yuzu_emu.fragments.SearchFragment" |
| 31 | android:label="SearchFragment" /> | 35 | android:label="SearchFragment" /> |
| 32 | 36 | ||
| 37 | <fragment | ||
| 38 | android:id="@+id/aboutFragment" | ||
| 39 | android:name="org.yuzu.yuzu_emu.fragments.AboutFragment" | ||
| 40 | android:label="AboutFragment" /> | ||
| 41 | |||
| 33 | </navigation> | 42 | </navigation> |
diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml index 9c7ab3c26..629b21e08 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml | |||
| @@ -48,6 +48,8 @@ | |||
| 48 | <string name="install_prod_keys_warning">Skip adding keys?</string> | 48 | <string name="install_prod_keys_warning">Skip adding keys?</string> |
| 49 | <string name="install_prod_keys_warning_description">Valid keys are required to emulate retail games. Only homebrew apps will function if you continue.</string> | 49 | <string name="install_prod_keys_warning_description">Valid keys are required to emulate retail games. Only homebrew apps will function if you continue.</string> |
| 50 | <string name="install_prod_keys_warning_help">https://yuzu-emu.org/help/quickstart/#guide-introduction</string> | 50 | <string name="install_prod_keys_warning_help">https://yuzu-emu.org/help/quickstart/#guide-introduction</string> |
| 51 | <string name="about">About</string> | ||
| 52 | <string name="about_description">Build version, credits, and more</string> | ||
| 51 | <string name="warning_help">Help</string> | 53 | <string name="warning_help">Help</string> |
| 52 | <string name="warning_skip">Skip</string> | 54 | <string name="warning_skip">Skip</string> |
| 53 | <string name="warning_cancel">Cancel</string> | 55 | <string name="warning_cancel">Cancel</string> |
| @@ -71,6 +73,18 @@ | |||
| 71 | <string name="notification_no_directory_link">Couldn\'t open yuzu directory</string> | 73 | <string name="notification_no_directory_link">Couldn\'t open yuzu directory</string> |
| 72 | <string name="notification_no_directory_link_description">Please locate the user folder with the file manager\'s side panel manually.</string> | 74 | <string name="notification_no_directory_link_description">Please locate the user folder with the file manager\'s side panel manually.</string> |
| 73 | 75 | ||
| 76 | <!-- About screen strings --> | ||
| 77 | <string name="gaia_is_not_real">Gaia isn\'t real</string> | ||
| 78 | <string name="copied_to_clipboard">Copied to clipboard</string> | ||
| 79 | <string name="about_app_description">An open-source Switch emulator</string> | ||
| 80 | <string name="contributors">Contributors</string> | ||
| 81 | <string name="contributors_description">Made with \u2764 from the yuzu team</string> | ||
| 82 | <string name="contributors_link">https://github.com/yuzu-emu/yuzu/graphs/contributors</string> | ||
| 83 | <string name="build">Build</string> | ||
| 84 | <string name="support_link">https://discord.gg/u77vRWY</string> | ||
| 85 | <string name="website_link">https://yuzu-emu.org/</string> | ||
| 86 | <string name="github_link">https://github.com/yuzu-emu</string> | ||
| 87 | |||
| 74 | <!-- General settings strings --> | 88 | <!-- General settings strings --> |
| 75 | <string name="frame_limit_enable">Enable limit speed</string> | 89 | <string name="frame_limit_enable">Enable limit speed</string> |
| 76 | <string name="frame_limit_enable_description">When enabled, emulation speed will be limited to a specified percentage of normal speed.</string> | 90 | <string name="frame_limit_enable_description">When enabled, emulation speed will be limited to a specified percentage of normal speed.</string> |