mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-11-04 00:49:02 -06:00 
			
		
		
		
	android: Add warnings to setup screens
This commit is contained in:
		@@ -14,7 +14,6 @@ import androidx.core.content.ContextCompat
 | 
			
		||||
import androidx.core.view.ViewCompat
 | 
			
		||||
import androidx.core.view.WindowInsetsCompat
 | 
			
		||||
import androidx.core.view.isVisible
 | 
			
		||||
import androidx.core.view.updatePadding
 | 
			
		||||
import androidx.fragment.app.Fragment
 | 
			
		||||
import androidx.fragment.app.activityViewModels
 | 
			
		||||
import androidx.navigation.findNavController
 | 
			
		||||
@@ -38,9 +37,12 @@ class SetupFragment : Fragment() {
 | 
			
		||||
 | 
			
		||||
    private lateinit var mainActivity: MainActivity
 | 
			
		||||
 | 
			
		||||
    private lateinit var hasBeenWarned: BooleanArray
 | 
			
		||||
 | 
			
		||||
    companion object {
 | 
			
		||||
        const val KEY_NEXT_VISIBILITY = "NextButtonVisibility"
 | 
			
		||||
        const val KEY_BACK_VISIBILITY = "BackButtonVisibility"
 | 
			
		||||
        const val KEY_HAS_BEEN_WARNED = "HasBeenWarned"
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun onCreate(savedInstanceState: Bundle?) {
 | 
			
		||||
@@ -84,36 +86,51 @@ class SetupFragment : Fragment() {
 | 
			
		||||
                R.string.welcome_description,
 | 
			
		||||
                0,
 | 
			
		||||
                true,
 | 
			
		||||
                R.string.get_started
 | 
			
		||||
            ) { pageForward() },
 | 
			
		||||
                R.string.get_started,
 | 
			
		||||
                { pageForward() },
 | 
			
		||||
                false
 | 
			
		||||
            ),
 | 
			
		||||
            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("*/*")) },
 | 
			
		||||
                R.string.select_keys,
 | 
			
		||||
                { mainActivity.getProdKey.launch(arrayOf("*/*")) },
 | 
			
		||||
                true,
 | 
			
		||||
                R.string.install_prod_keys_warning,
 | 
			
		||||
                R.string.install_prod_keys_warning_description,
 | 
			
		||||
                R.string.install_prod_keys_warning_help
 | 
			
		||||
            ),
 | 
			
		||||
            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) },
 | 
			
		||||
                R.string.add_games,
 | 
			
		||||
                { mainActivity.getGamesDirectory.launch(Intent(Intent.ACTION_OPEN_DOCUMENT_TREE).data) },
 | 
			
		||||
                true,
 | 
			
		||||
                R.string.add_games_warning,
 | 
			
		||||
                R.string.add_games_warning_description,
 | 
			
		||||
                0
 | 
			
		||||
            ),
 | 
			
		||||
            SetupPage(
 | 
			
		||||
                R.drawable.ic_check,
 | 
			
		||||
                R.string.done,
 | 
			
		||||
                R.string.done_description,
 | 
			
		||||
                R.drawable.ic_arrow_forward,
 | 
			
		||||
                false,
 | 
			
		||||
                R.string.text_continue
 | 
			
		||||
            ) { finishSetup() }
 | 
			
		||||
                R.string.text_continue,
 | 
			
		||||
                { finishSetup() },
 | 
			
		||||
                false
 | 
			
		||||
            )
 | 
			
		||||
        )
 | 
			
		||||
        binding.viewPager2.apply {
 | 
			
		||||
            adapter = SetupAdapter(requireActivity() as AppCompatActivity, pages)
 | 
			
		||||
            offscreenPageLimit = 2
 | 
			
		||||
            isUserInputEnabled = false
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        binding.viewPager2.registerOnPageChangeCallback(object : OnPageChangeCallback() {
 | 
			
		||||
@@ -138,12 +155,26 @@ class SetupFragment : Fragment() {
 | 
			
		||||
            }
 | 
			
		||||
        })
 | 
			
		||||
 | 
			
		||||
        binding.buttonNext.setOnClickListener { pageForward() }
 | 
			
		||||
        binding.buttonNext.setOnClickListener {
 | 
			
		||||
            val index = binding.viewPager2.currentItem
 | 
			
		||||
            val currentPage = pages[index]
 | 
			
		||||
            if (currentPage.hasWarning && !hasBeenWarned[index]) {
 | 
			
		||||
                SetupWarningDialogFragment.newInstance(
 | 
			
		||||
                    currentPage.warningTitleId,
 | 
			
		||||
                    currentPage.warningDescriptionId,
 | 
			
		||||
                    currentPage.warningHelpLinkId,
 | 
			
		||||
                    index
 | 
			
		||||
                ).show(childFragmentManager, SetupWarningDialogFragment.TAG)
 | 
			
		||||
            } else {
 | 
			
		||||
                pageForward()
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        binding.buttonBack.setOnClickListener { pageBackward() }
 | 
			
		||||
 | 
			
		||||
        if (savedInstanceState != null) {
 | 
			
		||||
            val nextIsVisible = savedInstanceState.getBoolean(KEY_NEXT_VISIBILITY)
 | 
			
		||||
            val backIsVisible = savedInstanceState.getBoolean(KEY_BACK_VISIBILITY)
 | 
			
		||||
            hasBeenWarned = savedInstanceState.getBooleanArray(KEY_HAS_BEEN_WARNED)!!
 | 
			
		||||
 | 
			
		||||
            if (nextIsVisible) {
 | 
			
		||||
                binding.buttonNext.visibility = View.VISIBLE
 | 
			
		||||
@@ -151,6 +182,8 @@ class SetupFragment : Fragment() {
 | 
			
		||||
            if (backIsVisible) {
 | 
			
		||||
                binding.buttonBack.visibility = View.VISIBLE
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            hasBeenWarned = BooleanArray(pages.size)
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        setInsets()
 | 
			
		||||
@@ -160,6 +193,7 @@ class SetupFragment : Fragment() {
 | 
			
		||||
        super.onSaveInstanceState(outState)
 | 
			
		||||
        outState.putBoolean(KEY_NEXT_VISIBILITY, binding.buttonNext.isVisible)
 | 
			
		||||
        outState.putBoolean(KEY_BACK_VISIBILITY, binding.buttonBack.isVisible)
 | 
			
		||||
        outState.putBooleanArray(KEY_HAS_BEEN_WARNED, hasBeenWarned)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun onDestroyView() {
 | 
			
		||||
@@ -201,14 +235,18 @@ class SetupFragment : Fragment() {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun pageForward() {
 | 
			
		||||
    fun pageForward() {
 | 
			
		||||
        binding.viewPager2.currentItem = binding.viewPager2.currentItem + 1
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun pageBackward() {
 | 
			
		||||
    fun pageBackward() {
 | 
			
		||||
        binding.viewPager2.currentItem = binding.viewPager2.currentItem - 1
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun setPageWarned(page: Int) {
 | 
			
		||||
        hasBeenWarned[page] = true
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun setInsets() =
 | 
			
		||||
        ViewCompat.setOnApplyWindowInsetsListener(binding.root) { view: View, windowInsets: WindowInsetsCompat ->
 | 
			
		||||
            val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars())
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,86 @@
 | 
			
		||||
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
 | 
			
		||||
// SPDX-License-Identifier: GPL-2.0-or-later
 | 
			
		||||
 | 
			
		||||
package org.yuzu.yuzu_emu.fragments
 | 
			
		||||
 | 
			
		||||
import android.app.Dialog
 | 
			
		||||
import android.content.DialogInterface
 | 
			
		||||
import android.content.Intent
 | 
			
		||||
import android.net.Uri
 | 
			
		||||
import android.os.Bundle
 | 
			
		||||
import androidx.fragment.app.DialogFragment
 | 
			
		||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
 | 
			
		||||
import org.yuzu.yuzu_emu.R
 | 
			
		||||
 | 
			
		||||
class SetupWarningDialogFragment : DialogFragment() {
 | 
			
		||||
    private var titleId: Int = 0
 | 
			
		||||
    private var descriptionId: Int = 0
 | 
			
		||||
    private var helpLinkId: Int = 0
 | 
			
		||||
    private var page: Int = 0
 | 
			
		||||
 | 
			
		||||
    private lateinit var setupFragment: SetupFragment
 | 
			
		||||
 | 
			
		||||
    override fun onCreate(savedInstanceState: Bundle?) {
 | 
			
		||||
        super.onCreate(savedInstanceState)
 | 
			
		||||
        titleId = requireArguments().getInt(TITLE)
 | 
			
		||||
        descriptionId = requireArguments().getInt(DESCRIPTION)
 | 
			
		||||
        helpLinkId = requireArguments().getInt(HELP_LINK)
 | 
			
		||||
        page = requireArguments().getInt(PAGE)
 | 
			
		||||
 | 
			
		||||
        setupFragment = requireParentFragment() as SetupFragment
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
 | 
			
		||||
        val builder = MaterialAlertDialogBuilder(requireContext())
 | 
			
		||||
            .setPositiveButton(R.string.warning_skip) { _: DialogInterface?, _: Int ->
 | 
			
		||||
                setupFragment.pageForward()
 | 
			
		||||
                setupFragment.setPageWarned(page)
 | 
			
		||||
            }
 | 
			
		||||
            .setNegativeButton(R.string.warning_cancel, null)
 | 
			
		||||
 | 
			
		||||
        if (titleId != 0) {
 | 
			
		||||
            builder.setTitle(titleId)
 | 
			
		||||
        } else {
 | 
			
		||||
            builder.setTitle("")
 | 
			
		||||
        }
 | 
			
		||||
        if (descriptionId != 0) {
 | 
			
		||||
            builder.setMessage(descriptionId)
 | 
			
		||||
        }
 | 
			
		||||
        if (helpLinkId != 0) {
 | 
			
		||||
            builder.setNeutralButton(R.string.warning_help) { _: DialogInterface?, _: Int ->
 | 
			
		||||
                val helpLink = resources.getString(R.string.install_prod_keys_warning_help)
 | 
			
		||||
                val intent = Intent(Intent.ACTION_VIEW, Uri.parse(helpLink))
 | 
			
		||||
                startActivity(intent)
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return builder.show()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    companion object {
 | 
			
		||||
        const val TAG = "SetupWarningDialogFragment"
 | 
			
		||||
 | 
			
		||||
        private const val TITLE = "Title"
 | 
			
		||||
        private const val DESCRIPTION = "Description"
 | 
			
		||||
        private const val HELP_LINK = "HelpLink"
 | 
			
		||||
        private const val PAGE = "Page"
 | 
			
		||||
 | 
			
		||||
        fun newInstance(
 | 
			
		||||
            titleId: Int,
 | 
			
		||||
            descriptionId: Int,
 | 
			
		||||
            helpLinkId: Int,
 | 
			
		||||
            page: Int
 | 
			
		||||
        ): SetupWarningDialogFragment {
 | 
			
		||||
            val dialog = SetupWarningDialogFragment()
 | 
			
		||||
            val bundle = Bundle()
 | 
			
		||||
            bundle.apply {
 | 
			
		||||
                putInt(TITLE, titleId)
 | 
			
		||||
                putInt(DESCRIPTION, descriptionId)
 | 
			
		||||
                putInt(HELP_LINK, helpLinkId)
 | 
			
		||||
                putInt(PAGE, page)
 | 
			
		||||
            }
 | 
			
		||||
            dialog.arguments = bundle
 | 
			
		||||
            return dialog
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -10,5 +10,9 @@ data class SetupPage(
 | 
			
		||||
    val buttonIconId: Int,
 | 
			
		||||
    val leftAlignedIcon: Boolean,
 | 
			
		||||
    val buttonTextId: Int,
 | 
			
		||||
    val buttonAction: () -> Unit
 | 
			
		||||
    val buttonAction: () -> Unit,
 | 
			
		||||
    val hasWarning: Boolean,
 | 
			
		||||
    val warningTitleId: Int = 0,
 | 
			
		||||
    val warningDescriptionId: Int = 0,
 | 
			
		||||
    val warningHelpLinkId: Int = 0
 | 
			
		||||
)
 | 
			
		||||
 
 | 
			
		||||
@@ -29,10 +29,18 @@
 | 
			
		||||
    <string name="home_settings">Settings</string>
 | 
			
		||||
    <string name="add_games">Add Games</string>
 | 
			
		||||
    <string name="add_games_description">Select your games folder</string>
 | 
			
		||||
    <string name="add_games_warning">Skip selecting games folder?</string>
 | 
			
		||||
    <string name="add_games_warning_description">Games won\'t be displayed in the Games list if a folder isn\'t selected.</string>
 | 
			
		||||
    <string name="home_search_games">Search Games</string>
 | 
			
		||||
    <string name="games_dir_selected">Games directory selected</string>
 | 
			
		||||
    <string name="install_prod_keys">Install Prod.keys</string>
 | 
			
		||||
    <string name="install_prod_keys_description">Required to decrypt retail games</string>
 | 
			
		||||
    <string name="install_prod_keys_warning">Skip adding keys?</string>
 | 
			
		||||
    <string name="install_prod_keys_warning_description">Valid keys are required to emulate retail games. Only homebrew apps will function if you continue.</string>
 | 
			
		||||
    <string name="install_prod_keys_warning_help">https://yuzu-emu.org/help/quickstart/#guide-introduction</string>
 | 
			
		||||
    <string name="warning_help">Help</string>
 | 
			
		||||
    <string name="warning_skip">Skip</string>
 | 
			
		||||
    <string name="warning_cancel">Cancel</string>
 | 
			
		||||
    <string name="install_amiibo_keys">Install Amiibo Keys</string>
 | 
			
		||||
    <string name="install_amiibo_keys_description">Required to use Amiibo in game</string>
 | 
			
		||||
    <string name="invalid_keys_file">Invalid keys file selected</string>
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user