committed by
bunnei
19 changed files with 769 additions and 163 deletions
-
70src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/SetupAdapter.kt
-
167src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/OptionsFragment.kt
-
206src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/SetupFragment.kt
-
2src/android/app/src/main/java/org/yuzu/yuzu_emu/model/HomeViewModel.kt
-
14src/android/app/src/main/java/org/yuzu/yuzu_emu/model/SetupPage.kt
-
6src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/GamesFragment.kt
-
191src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt
-
10src/android/app/src/main/res/drawable/ic_arrow_forward.xml
-
9src/android/app/src/main/res/drawable/ic_check.xml
-
2src/android/app/src/main/res/drawable/ic_controller.xml
-
9src/android/app/src/main/res/drawable/ic_key.xml
-
24src/android/app/src/main/res/drawable/ic_yuzu_title.xml
-
38src/android/app/src/main/res/layout-w600dp/fragment_setup.xml
-
65src/android/app/src/main/res/layout-w600dp/page_setup.xml
-
4src/android/app/src/main/res/layout/activity_main.xml
-
38src/android/app/src/main/res/layout/fragment_setup.xml
-
52src/android/app/src/main/res/layout/page_setup.xml
-
9src/android/app/src/main/res/navigation/home_navigation.xml
-
16src/android/app/src/main/res/values/strings.xml
@ -0,0 +1,70 @@ |
|||
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project |
|||
// SPDX-License-Identifier: GPL-2.0-or-later |
|||
|
|||
package org.yuzu.yuzu_emu.adapters |
|||
|
|||
import android.text.Html |
|||
import android.view.LayoutInflater |
|||
import android.view.ViewGroup |
|||
import androidx.appcompat.app.AppCompatActivity |
|||
import androidx.core.content.res.ResourcesCompat |
|||
import androidx.recyclerview.widget.RecyclerView |
|||
import com.google.android.material.button.MaterialButton |
|||
import org.yuzu.yuzu_emu.databinding.PageSetupBinding |
|||
import org.yuzu.yuzu_emu.model.SetupPage |
|||
|
|||
class SetupAdapter(val activity: AppCompatActivity, val pages: List<SetupPage>) : |
|||
RecyclerView.Adapter<SetupAdapter.SetupPageViewHolder>() { |
|||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SetupPageViewHolder { |
|||
val binding = PageSetupBinding.inflate(LayoutInflater.from(parent.context), parent, false) |
|||
return SetupPageViewHolder(binding) |
|||
} |
|||
|
|||
override fun getItemCount(): Int = pages.size |
|||
|
|||
override fun onBindViewHolder(holder: SetupPageViewHolder, position: Int) = |
|||
holder.bind(pages[position]) |
|||
|
|||
inner class SetupPageViewHolder(val binding: PageSetupBinding) : |
|||
RecyclerView.ViewHolder(binding.root) { |
|||
lateinit var page: SetupPage |
|||
|
|||
init { |
|||
itemView.tag = this |
|||
} |
|||
|
|||
fun bind(page: SetupPage) { |
|||
this.page = page |
|||
binding.icon.setImageDrawable( |
|||
ResourcesCompat.getDrawable( |
|||
activity.resources, |
|||
page.iconId, |
|||
activity.theme |
|||
) |
|||
) |
|||
binding.textTitle.text = activity.resources.getString(page.titleId) |
|||
binding.textDescription.text = |
|||
Html.fromHtml(activity.resources.getString(page.descriptionId), 0) |
|||
|
|||
binding.buttonAction.apply { |
|||
text = activity.resources.getString(page.buttonTextId) |
|||
if (page.buttonIconId != 0) { |
|||
icon = ResourcesCompat.getDrawable( |
|||
activity.resources, |
|||
page.buttonIconId, |
|||
activity.theme |
|||
) |
|||
} |
|||
iconGravity = |
|||
if (page.leftAlignedIcon) { |
|||
MaterialButton.ICON_GRAVITY_START |
|||
} else { |
|||
MaterialButton.ICON_GRAVITY_END |
|||
} |
|||
setOnClickListener { |
|||
page.buttonAction.invoke() |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,206 @@ |
|||
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project |
|||
// SPDX-License-Identifier: GPL-2.0-or-later |
|||
|
|||
package org.yuzu.yuzu_emu.fragments |
|||
|
|||
import android.content.Intent |
|||
import android.os.Bundle |
|||
import android.view.LayoutInflater |
|||
import android.view.View |
|||
import android.view.ViewGroup |
|||
import androidx.activity.OnBackPressedCallback |
|||
import androidx.appcompat.app.AppCompatActivity |
|||
import androidx.core.content.ContextCompat |
|||
import androidx.core.view.ViewCompat |
|||
import androidx.core.view.WindowInsetsCompat |
|||
import androidx.fragment.app.Fragment |
|||
import androidx.fragment.app.activityViewModels |
|||
import androidx.navigation.findNavController |
|||
import androidx.preference.PreferenceManager |
|||
import androidx.viewpager2.widget.ViewPager2.OnPageChangeCallback |
|||
import com.google.android.material.transition.MaterialFadeThrough |
|||
import org.yuzu.yuzu_emu.R |
|||
import org.yuzu.yuzu_emu.YuzuApplication |
|||
import org.yuzu.yuzu_emu.adapters.SetupAdapter |
|||
import org.yuzu.yuzu_emu.databinding.FragmentSetupBinding |
|||
import org.yuzu.yuzu_emu.features.settings.model.Settings |
|||
import org.yuzu.yuzu_emu.model.HomeViewModel |
|||
import org.yuzu.yuzu_emu.model.SetupPage |
|||
import org.yuzu.yuzu_emu.ui.main.MainActivity |
|||
|
|||
class SetupFragment : Fragment() { |
|||
private var _binding: FragmentSetupBinding? = null |
|||
private val binding get() = _binding!! |
|||
|
|||
private val homeViewModel: HomeViewModel by activityViewModels() |
|||
|
|||
private lateinit var mainActivity: MainActivity |
|||
|
|||
override fun onCreate(savedInstanceState: Bundle?) { |
|||
super.onCreate(savedInstanceState) |
|||
exitTransition = MaterialFadeThrough() |
|||
} |
|||
|
|||
override fun onCreateView( |
|||
inflater: LayoutInflater, |
|||
container: ViewGroup?, |
|||
savedInstanceState: Bundle? |
|||
): View { |
|||
_binding = FragmentSetupBinding.inflate(layoutInflater) |
|||
return binding.root |
|||
} |
|||
|
|||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { |
|||
mainActivity = requireActivity() as MainActivity |
|||
|
|||
homeViewModel.setNavigationVisibility(false) |
|||
|
|||
requireActivity().onBackPressedDispatcher.addCallback( |
|||
viewLifecycleOwner, |
|||
object : OnBackPressedCallback(true) { |
|||
override fun handleOnBackPressed() { |
|||
if (binding.viewPager2.currentItem > 0) { |
|||
pageBackward() |
|||
} else { |
|||
requireActivity().finish() |
|||
} |
|||
} |
|||
}) |
|||
|
|||
requireActivity().window.navigationBarColor = |
|||
ContextCompat.getColor(requireContext(), android.R.color.transparent) |
|||
|
|||
val pages = listOf( |
|||
SetupPage( |
|||
R.drawable.ic_yuzu_title, |
|||
R.string.welcome, |
|||
R.string.welcome_description, |
|||
0, |
|||
true, |
|||
R.string.get_started |
|||
) { pageForward() }, |
|||
SetupPage( |
|||
R.drawable.ic_key, |
|||
R.string.keys, |
|||
R.string.keys_description, |
|||
R.drawable.ic_add, |
|||
true, |
|||
R.string.select_keys |
|||
) { mainActivity.getProdKey.launch(arrayOf("*/*")) }, |
|||
SetupPage( |
|||
R.drawable.ic_controller, |
|||
R.string.games, |
|||
R.string.games_description, |
|||
R.drawable.ic_add, |
|||
true, |
|||
R.string.add_games |
|||
) { mainActivity.getGamesDirectory.launch(Intent(Intent.ACTION_OPEN_DOCUMENT_TREE).data) }, |
|||
SetupPage( |
|||
R.drawable.ic_check, |
|||
R.string.done, |
|||
R.string.done_description, |
|||
R.drawable.ic_arrow_forward, |
|||
false, |
|||
R.string.text_continue |
|||
) { finishSetup() } |
|||
) |
|||
binding.viewPager2.apply { |
|||
adapter = SetupAdapter(requireActivity() as AppCompatActivity, pages) |
|||
offscreenPageLimit = 2 |
|||
} |
|||
|
|||
binding.viewPager2.registerOnPageChangeCallback(object : OnPageChangeCallback() { |
|||
override fun onPageScrolled( |
|||
position: Int, |
|||
positionOffset: Float, |
|||
positionOffsetPixels: Int |
|||
) { |
|||
super.onPageScrolled(position, positionOffset, positionOffsetPixels) |
|||
if (position == 0) { |
|||
hideView(binding.buttonBack) |
|||
} else { |
|||
showView(binding.buttonBack) |
|||
} |
|||
|
|||
if (position == pages.size - 1 || position == 0) { |
|||
hideView(binding.buttonNext) |
|||
} else { |
|||
showView(binding.buttonNext) |
|||
} |
|||
} |
|||
}) |
|||
|
|||
binding.buttonNext.setOnClickListener { pageForward() } |
|||
binding.buttonBack.setOnClickListener { pageBackward() } |
|||
|
|||
if (binding.viewPager2.currentItem == 0) { |
|||
binding.buttonNext.visibility = View.INVISIBLE |
|||
binding.buttonBack.visibility = View.INVISIBLE |
|||
} |
|||
|
|||
setInsets() |
|||
} |
|||
|
|||
override fun onDestroyView() { |
|||
super.onDestroyView() |
|||
_binding = null |
|||
} |
|||
|
|||
private fun finishSetup() { |
|||
PreferenceManager.getDefaultSharedPreferences(YuzuApplication.appContext).edit() |
|||
.putBoolean(Settings.PREF_FIRST_APP_LAUNCH, false) |
|||
.apply() |
|||
mainActivity.finishSetup(binding.root.findNavController()) |
|||
} |
|||
|
|||
private fun showView(view: View) { |
|||
if (view.visibility == View.VISIBLE) { |
|||
return |
|||
} |
|||
|
|||
view.apply { |
|||
alpha = 0f |
|||
visibility = View.VISIBLE |
|||
isClickable = true |
|||
}.animate().apply { |
|||
duration = 300 |
|||
alpha(1f) |
|||
}.start() |
|||
} |
|||
|
|||
private fun hideView(view: View) { |
|||
if (view.visibility == View.GONE) { |
|||
return |
|||
} |
|||
|
|||
view.apply { |
|||
alpha = 1f |
|||
isClickable = false |
|||
}.animate().apply { |
|||
duration = 300 |
|||
alpha(0f) |
|||
}.withEndAction { |
|||
view.visibility = View.INVISIBLE |
|||
} |
|||
} |
|||
|
|||
private fun pageForward() { |
|||
binding.viewPager2.currentItem = binding.viewPager2.currentItem + 1 |
|||
} |
|||
|
|||
private fun pageBackward() { |
|||
binding.viewPager2.currentItem = binding.viewPager2.currentItem - 1 |
|||
} |
|||
|
|||
private fun setInsets() = |
|||
ViewCompat.setOnApplyWindowInsetsListener(binding.setupRoot) { view: View, windowInsets: WindowInsetsCompat -> |
|||
val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()) |
|||
view.setPadding( |
|||
insets.left, |
|||
insets.top, |
|||
insets.right, |
|||
insets.bottom |
|||
) |
|||
windowInsets |
|||
} |
|||
} |
|||
@ -0,0 +1,14 @@ |
|||
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project |
|||
// SPDX-License-Identifier: GPL-2.0-or-later |
|||
|
|||
package org.yuzu.yuzu_emu.model |
|||
|
|||
data class SetupPage( |
|||
val iconId: Int, |
|||
val titleId: Int, |
|||
val descriptionId: Int, |
|||
val buttonIconId: Int, |
|||
val leftAlignedIcon: Boolean, |
|||
val buttonTextId: Int, |
|||
val buttonAction: () -> Unit |
|||
) |
|||
@ -0,0 +1,10 @@ |
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android" |
|||
android:width="24dp" |
|||
android:height="24dp" |
|||
android:autoMirrored="true" |
|||
android:viewportWidth="24" |
|||
android:viewportHeight="24"> |
|||
<path |
|||
android:fillColor="?attr/colorControlNormal" |
|||
android:pathData="M12,4l-1.41,1.41L16.17,11H4v2h12.17l-5.58,5.59L12,20l8,-8z" /> |
|||
</vector> |
|||
@ -0,0 +1,9 @@ |
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android" |
|||
android:width="24dp" |
|||
android:height="24dp" |
|||
android:viewportWidth="24" |
|||
android:viewportHeight="24"> |
|||
<path |
|||
android:fillColor="?attr/colorOnSurface" |
|||
android:pathData="M9,16.17L4.83,12l-1.42,1.41L9,19 21,7l-1.41,-1.41z" /> |
|||
</vector> |
|||
@ -0,0 +1,9 @@ |
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android" |
|||
android:width="24dp" |
|||
android:height="24dp" |
|||
android:viewportWidth="24" |
|||
android:viewportHeight="24"> |
|||
<path |
|||
android:fillColor="?attr/colorOnSurface" |
|||
android:pathData="M21,10h-8.35C11.83,7.67 9.61,6 7,6c-3.31,0 -6,2.69 -6,6s2.69,6 6,6c2.61,0 4.83,-1.67 5.65,-4H13l2,2l2,-2l2,2l4,-4.04L21,10zM7,15c-1.65,0 -3,-1.35 -3,-3c0,-1.65 1.35,-3 3,-3s3,1.35 3,3C10,13.65 8.65,15 7,15z" /> |
|||
</vector> |
|||
@ -0,0 +1,24 @@ |
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android" |
|||
android:width="340.97dp" |
|||
android:height="389.85dp" |
|||
android:viewportWidth="340.97" |
|||
android:viewportHeight="389.85"> |
|||
<path |
|||
android:fillColor="?attr/colorOnSurface" |
|||
android:pathData="M341,268.68v73c0,14.5 -2.24,25.24 -6.83,32.82 -5.92,10.15 -16.21,15.32 -30.54,15.32S279,384.61 273,374.27c-4.56,-7.64 -6.8,-18.42 -6.8,-32.92V268.68a4.52,4.52 0,0 1,4.51 -4.51H273a4.5,4.5 0,0 1,4.5 4.51v72.5c0,33.53 14.88,37.4 26.07,37.4 12.14,0 26.08,-4.17 26.08,-36.71V268.68a4.52,4.52 0,0 1,4.52 -4.51h2.27A4.5,4.5 0,0 1,341 268.68Z" /> |
|||
<path |
|||
android:fillColor="?attr/colorOnSurface" |
|||
android:pathData="M246.49,389.85H178.6c-2.35,0 -4.72,-1.88 -4.72,-6.08a8.28,8.28 0,0 1,1.33 -4.48l60.33,-104.47H186a4.51,4.51 0,0 1,-4.51 -4.51v-1.58a4.51,4.51 0,0 1,4.48 -4.51h0.8c58.69,-0.11 59.12,0 59.67,0.07a5.19,5.19 0,0 1,4 5.8,8.69 8.69,0 0,1 -1.33,3.76l-60.6,104.77h58a4.51,4.51 0,0 1,4.51 4.51v2.21A4.51,4.51 0,0 1,246.49 389.85Z" /> |
|||
<path |
|||
android:fillColor="?attr/colorOnSurface" |
|||
android:pathData="M73.6,268.68v82.06c0,26 -11.8,38.44 -37.12,39.09h-0.12a4.51,4.51 0,0 1,-4.51 -4.51V383a4.51,4.51 0,0 1,4.48 -4.5c18.49,-0.15 26,-8.23 26,-27.9v-2.37A32.34,32.34 0,0 1,59 351.46c-6.39,5.5 -14.5,8.29 -24.07,8.29C12.09,359.75 0,347.34 0,323.86V268.68a4.52,4.52 0,0 1,4.51 -4.51H6.73a4.52,4.52 0,0 1,4.5 4.51v55c0,7.6 1.82,14.22 5,18.18 3.57,4.56 9.17,6.49 18.75,6.49 10.13,0 17.32,-3.76 22,-11.5 3.61,-5.92 5.43,-13.66 5.43,-23V268.68a4.52,4.52 0,0 1,4.51 -4.51h2.22A4.52,4.52 0,0 1,73.6 268.68Z" /> |
|||
<path |
|||
android:fillColor="?attr/colorOnSurface" |
|||
android:pathData="M163.27,268.68v73c0,14.5 -2.24,25.24 -6.84,32.82 -5.92,10.15 -16.2,15.32 -30.53,15.32s-24.62,-5.23 -30.58,-15.57c-4.56,-7.64 -6.79,-18.42 -6.79,-32.92V268.68A4.51,4.51 0,0 1,93 264.17h2.28a4.51,4.51 0,0 1,4.51 4.51v72.5c0,33.53 14.88,37.4 26.07,37.4 12.14,0 26.08,-4.17 26.08,-36.71V268.68a4.51,4.51 0,0 1,4.51 -4.51h2.27A4.51,4.51 0,0 1,163.27 268.68Z" /> |
|||
<path |
|||
android:fillColor="#ff3c28" |
|||
android:pathData="M181.2,42.83V214.17a85.67,85.67 0,0 0,0 -171.34M197.93,61.6a69,69 0,0 1,0 133.8V61.6" /> |
|||
<path |
|||
android:fillColor="#0ab9e6" |
|||
android:pathData="M159.78,0a85.67,85.67 0,1 0,0 171.33ZM143.05,18.77v133.8A69,69 0,0 1,111 36.92a68.47,68.47 0,0 1,32 -18.15" /> |
|||
</vector> |
|||
@ -0,0 +1,38 @@ |
|||
<?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" |
|||
android:id="@+id/setup_root" |
|||
android:layout_width="match_parent" |
|||
android:layout_height="match_parent"> |
|||
|
|||
<androidx.viewpager2.widget.ViewPager2 |
|||
android:id="@+id/viewPager2" |
|||
android:layout_width="0dp" |
|||
android:layout_height="0dp" |
|||
app:layout_constraintBottom_toBottomOf="parent" |
|||
app:layout_constraintEnd_toEndOf="parent" |
|||
app:layout_constraintStart_toStartOf="parent" |
|||
app:layout_constraintTop_toTopOf="parent" /> |
|||
|
|||
<com.google.android.material.button.MaterialButton |
|||
style="@style/Widget.Material3.Button.TextButton" |
|||
android:id="@+id/button_next" |
|||
android:layout_width="wrap_content" |
|||
android:layout_height="wrap_content" |
|||
android:layout_margin="16dp" |
|||
android:text="@string/next" |
|||
app:layout_constraintBottom_toBottomOf="parent" |
|||
app:layout_constraintEnd_toEndOf="parent" /> |
|||
|
|||
<com.google.android.material.button.MaterialButton |
|||
android:id="@+id/button_back" |
|||
style="@style/Widget.Material3.Button.TextButton" |
|||
android:layout_width="wrap_content" |
|||
android:layout_height="wrap_content" |
|||
android:layout_margin="16dp" |
|||
android:text="@string/back" |
|||
app:layout_constraintBottom_toBottomOf="parent" |
|||
app:layout_constraintStart_toStartOf="parent" /> |
|||
|
|||
</androidx.constraintlayout.widget.ConstraintLayout> |
|||
@ -0,0 +1,65 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<LinearLayout |
|||
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:layout_width="match_parent" |
|||
android:layout_height="match_parent"> |
|||
|
|||
<LinearLayout |
|||
android:layout_width="match_parent" |
|||
android:layout_height="match_parent" |
|||
android:orientation="vertical" |
|||
android:layout_weight="1" |
|||
android:gravity="center"> |
|||
|
|||
<ImageView |
|||
android:id="@+id/icon" |
|||
android:layout_width="260dp" |
|||
android:layout_height="260dp" |
|||
android:layout_gravity="center" /> |
|||
|
|||
</LinearLayout> |
|||
|
|||
<LinearLayout |
|||
android:layout_width="match_parent" |
|||
android:layout_height="match_parent" |
|||
android:layout_weight="1" |
|||
android:orientation="vertical" |
|||
android:gravity="center"> |
|||
|
|||
<com.google.android.material.textview.MaterialTextView |
|||
style="@style/TextAppearance.Material3.DisplaySmall" |
|||
android:id="@+id/text_title" |
|||
android:layout_width="match_parent" |
|||
android:layout_height="wrap_content" |
|||
android:textAlignment="center" |
|||
android:textColor="?attr/colorOnSurface" |
|||
android:textStyle="bold" |
|||
tools:text="@string/welcome" /> |
|||
|
|||
<com.google.android.material.textview.MaterialTextView |
|||
style="@style/TextAppearance.Material3.TitleLarge" |
|||
android:id="@+id/text_description" |
|||
android:layout_width="match_parent" |
|||
android:layout_height="wrap_content" |
|||
android:layout_marginTop="16dp" |
|||
android:paddingHorizontal="32dp" |
|||
android:textAlignment="center" |
|||
android:textSize="26sp" |
|||
app:lineHeight="40sp" |
|||
tools:text="@string/welcome_description" /> |
|||
|
|||
<com.google.android.material.button.MaterialButton |
|||
android:id="@+id/button_action" |
|||
android:layout_width="wrap_content" |
|||
android:layout_height="56dp" |
|||
android:layout_marginTop="32dp" |
|||
android:textSize="20sp" |
|||
app:iconSize="24sp" |
|||
app:iconGravity="end" |
|||
tools:text="Get started" /> |
|||
|
|||
</LinearLayout> |
|||
|
|||
</LinearLayout> |
|||
@ -0,0 +1,38 @@ |
|||
<?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" |
|||
android:id="@+id/setup_root" |
|||
android:layout_width="match_parent" |
|||
android:layout_height="match_parent"> |
|||
|
|||
<androidx.viewpager2.widget.ViewPager2 |
|||
android:id="@+id/viewPager2" |
|||
android:layout_width="0dp" |
|||
android:layout_height="0dp" |
|||
app:layout_constraintBottom_toBottomOf="parent" |
|||
app:layout_constraintEnd_toEndOf="parent" |
|||
app:layout_constraintStart_toStartOf="parent" |
|||
app:layout_constraintTop_toTopOf="parent" /> |
|||
|
|||
<com.google.android.material.button.MaterialButton |
|||
style="@style/Widget.Material3.Button.TextButton" |
|||
android:id="@+id/button_next" |
|||
android:layout_width="wrap_content" |
|||
android:layout_height="wrap_content" |
|||
android:layout_margin="16dp" |
|||
android:text="@string/next" |
|||
app:layout_constraintBottom_toBottomOf="parent" |
|||
app:layout_constraintEnd_toEndOf="parent" /> |
|||
|
|||
<com.google.android.material.button.MaterialButton |
|||
style="@style/Widget.Material3.Button.TextButton" |
|||
android:id="@+id/button_back" |
|||
android:layout_width="wrap_content" |
|||
android:layout_height="wrap_content" |
|||
android:layout_margin="16dp" |
|||
android:text="@string/back" |
|||
app:layout_constraintBottom_toBottomOf="parent" |
|||
app:layout_constraintStart_toStartOf="parent" /> |
|||
|
|||
</androidx.constraintlayout.widget.ConstraintLayout> |
|||
@ -0,0 +1,52 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<androidx.appcompat.widget.LinearLayoutCompat |
|||
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:layout_width="match_parent" |
|||
android:layout_height="match_parent" |
|||
android:orientation="vertical" |
|||
android:paddingBottom="64dp"> |
|||
|
|||
<ImageView |
|||
android:id="@+id/icon" |
|||
android:layout_width="220dp" |
|||
android:layout_height="220dp" |
|||
android:layout_marginTop="64dp" |
|||
android:layout_gravity="center" /> |
|||
|
|||
<com.google.android.material.textview.MaterialTextView |
|||
style="@style/TextAppearance.Material3.DisplayMedium" |
|||
android:id="@+id/text_title" |
|||
android:layout_width="match_parent" |
|||
android:layout_height="wrap_content" |
|||
android:layout_marginTop="64dp" |
|||
android:textAlignment="center" |
|||
android:textColor="?attr/colorOnSurface" |
|||
android:textStyle="bold" |
|||
tools:text="@string/welcome" /> |
|||
|
|||
<com.google.android.material.textview.MaterialTextView |
|||
style="@style/TextAppearance.Material3.TitleLarge" |
|||
android:id="@+id/text_description" |
|||
android:layout_width="match_parent" |
|||
android:layout_height="wrap_content" |
|||
android:layout_marginTop="24dp" |
|||
android:paddingHorizontal="32dp" |
|||
android:textAlignment="center" |
|||
android:textSize="26sp" |
|||
app:lineHeight="40sp" |
|||
tools:text="@string/welcome_description" /> |
|||
|
|||
<com.google.android.material.button.MaterialButton |
|||
android:id="@+id/button_action" |
|||
android:layout_width="wrap_content" |
|||
android:layout_height="56dp" |
|||
android:layout_marginTop="96dp" |
|||
android:layout_gravity="center" |
|||
android:textSize="20sp" |
|||
app:iconSize="24sp" |
|||
app:iconGravity="end" |
|||
tools:text="Get started" /> |
|||
|
|||
</androidx.appcompat.widget.LinearLayoutCompat> |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue