diff --git a/src/android/app/build.gradle.kts b/src/android/app/build.gradle.kts index 24f0f8c818..8517855abc 100644 --- a/src/android/app/build.gradle.kts +++ b/src/android/app/build.gradle.kts @@ -240,6 +240,8 @@ dependencies { implementation("androidx.navigation:navigation-ui-ktx:2.8.9") implementation("info.debatty:java-string-similarity:2.0.0") implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.3") + implementation("androidx.compose.ui:ui-graphics-android:1.7.8") + implementation("androidx.compose.ui:ui-text-android:1.7.8") } fun runGitCommand(command: List): String { diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/Settings.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/Settings.kt index 9aa8eeed13..e189c21560 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/Settings.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/Settings.kt @@ -30,6 +30,7 @@ object Settings { YuzuApplication.appContext.getString(R.string.preferences_player, player) const val PREF_FIRST_APP_LAUNCH = "FirstApplicationLaunch" + const val PREF_SHOULD_SHOW_PRE_ALPHA_WARNING = "ShouldShowPreAlphaWarning" const val PREF_MEMORY_WARNING_SHOWN = "MemoryWarningShown" // Deprecated input overlay preference keys diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/SetupFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/SetupFragment.kt index 5110145001..bf622b9299 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/SetupFragment.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/SetupFragment.kt @@ -346,6 +346,7 @@ class SetupFragment : Fragment() { .putBoolean(Settings.PREF_FIRST_APP_LAUNCH, false) .apply() mainActivity.finishSetup(binding.root.findNavController()) + mainActivity.showPreAlphaWarningDialog() } fun pageForward() { diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/GamesFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/GamesFragment.kt index 78abd974f6..dd5f8518c3 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/GamesFragment.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/GamesFragment.kt @@ -7,13 +7,16 @@ import android.content.Context import android.content.Intent import android.content.res.Configuration import android.os.Bundle +import android.view.Gravity import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.view.inputmethod.InputMethodManager import android.widget.PopupMenu +import android.widget.TextView import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AppCompatActivity +import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat import androidx.core.view.updatePadding @@ -39,6 +42,7 @@ import org.yuzu.yuzu_emu.utils.ViewUtils.setVisible import org.yuzu.yuzu_emu.utils.collect import java.util.Locale import androidx.core.content.edit +import androidx.core.view.updateLayoutParams class GamesFragment : Fragment() { private var _binding: FragmentGamesBinding? = null @@ -148,6 +152,7 @@ class GamesFragment : Fragment() { } setInsets() + addPreAlphaBanner() } val applyGridGamesBinding = { @@ -218,6 +223,49 @@ class GamesFragment : Fragment() { navController.navigate(R.id.action_gamesFragment_to_homeSettingsFragment) } + private fun addPreAlphaBanner() { + val preAlphaBanner = TextView(requireContext()).apply { + id = "pre_alpha_banner".hashCode() + layoutParams = ConstraintLayout.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.WRAP_CONTENT + ).apply { + marginStart = resources.getDimensionPixelSize(R.dimen.spacing_med) + marginEnd = resources.getDimensionPixelSize(R.dimen.spacing_med) + topMargin = resources.getDimensionPixelSize(R.dimen.spacing_large) + topToBottom = R.id.frame_search + } + setPadding( + resources.getDimensionPixelSize(R.dimen.spacing_med), + resources.getDimensionPixelSize(R.dimen.spacing_large), + resources.getDimensionPixelSize(R.dimen.spacing_med), + resources.getDimensionPixelSize(R.dimen.spacing_med) + ) + + setBackgroundColor( + MaterialColors.getColor( + this, + com.google.android.material.R.attr.colorPrimary + ) + ) + text = getString(R.string.pre_alpha_warning) + setTextAppearance( + com.google.android.material.R.style.TextAppearance_Material3_HeadlineSmall + ) + setTextColor( + MaterialColors.getColor( + this, + com.google.android.material.R.attr.colorOnError + ) + ) + gravity = Gravity.CENTER + } + binding.root.addView(preAlphaBanner) + binding.swipeRefresh.updateLayoutParams { + topToBottom = preAlphaBanner.id + } + } + private fun showViewMenu(anchor: View) { val popup = PopupMenu(requireContext(), anchor) popup.menuInflater.inflate(R.menu.menu_game_views, popup.menu) diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt index 58ff109deb..f1f05e6b20 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt @@ -48,6 +48,7 @@ import java.io.BufferedInputStream import java.io.BufferedOutputStream import java.util.zip.ZipEntry import java.util.zip.ZipInputStream +import androidx.core.content.edit class MainActivity : AppCompatActivity(), ThemeProvider { private lateinit var binding: ActivityMainBinding @@ -83,6 +84,7 @@ class MainActivity : AppCompatActivity(), ThemeProvider { .getBoolean(Settings.PREF_FIRST_APP_LAUNCH, true) if (!firstTimeSetup) { checkKeys() + showPreAlphaWarningDialog() } checkedDecryption = true } @@ -138,6 +140,30 @@ class MainActivity : AppCompatActivity(), ThemeProvider { setInsets() } + fun showPreAlphaWarningDialog() { + val shouldDisplayAlphaWarning = + PreferenceManager.getDefaultSharedPreferences(applicationContext) + .getBoolean(Settings.PREF_SHOULD_SHOW_PRE_ALPHA_WARNING, true) + if (shouldDisplayAlphaWarning) { + MessageDialogFragment.newInstance( + this, + titleId = R.string.pre_alpha_warning_title, + descriptionId = R.string.pre_alpha_warning_description, + positiveButtonTitleId = R.string.dont_show_again, + negativeButtonTitleId = R.string.close, + showNegativeButton = true, + positiveAction = { + PreferenceManager.getDefaultSharedPreferences(applicationContext) + .edit() { + putBoolean(Settings.PREF_SHOULD_SHOW_PRE_ALPHA_WARNING, false) + } + } + ).show(supportFragmentManager, MessageDialogFragment.TAG) + } + } + + + private fun checkKeys() { if (!NativeLibrary.areKeysPresent()) { MessageDialogFragment.newInstance( diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml index c4ae05860e..bb0b5c58dc 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml @@ -32,6 +32,10 @@ List Grid Folder + Pre-Alpha Software + "WARNING: This build is not meant to be shared or shown to the public. This software is in pre-alpha stages and may have bugs and incomplete feature implementations. \nIf you somehow got unauthorized access to this build; it's heavily recommended to uninstall it immediately " + Dont Show Again + PRE-ALPHA SOFTWARE; NOT MEANT FOR PUBLIC USE\ "New game directory added successfully " Games Search @@ -1174,5 +1178,4 @@ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - diff --git a/src/yuzu/game_list.cpp b/src/yuzu/game_list.cpp index 19adef7a2b..d59e9c89e3 100644 --- a/src/yuzu/game_list.cpp +++ b/src/yuzu/game_list.cpp @@ -369,6 +369,25 @@ GameList::GameList(FileSys::VirtualFilesystem vfs_, FileSys::ManualContentProvid layout->setContentsMargins(0, 0, 0, 0); layout->setSpacing(0); + + warning_layout = new QHBoxLayout; + pre_alpha_warning = new QLabel; + pre_alpha_warning->setText( + tr("IMPORTANT: Eden is PRE-ALPHA SOFTWARE and is not meant to be used by or get shared to the public just yet; " + "Bugs and unfinished features are expected to be present at this stage.")); + pre_alpha_warning->setOpenExternalLinks(true); + pre_alpha_warning->setStyleSheet( + QString::fromStdString("color: black; font-weight: bold;")); + + warning_layout->addWidget(pre_alpha_warning); + warning_layout->addStretch(); + warning_layout->setContentsMargins(3, 3, 3, 3); + warning_widget = new QWidget; + warning_widget->setStyleSheet(QString::fromStdString("background-color: khaki;")); + warning_widget->setLayout(warning_layout); + + layout->addWidget(warning_widget); + layout->addWidget(tree_view); layout->addWidget(search_field); setLayout(layout); diff --git a/src/yuzu/game_list.h b/src/yuzu/game_list.h index 79f9c7ec0f..d51110758a 100644 --- a/src/yuzu/game_list.h +++ b/src/yuzu/game_list.h @@ -172,6 +172,9 @@ private: QFileSystemWatcher* watcher = nullptr; ControllerNavigation* controller_navigation = nullptr; CompatibilityList compatibility_list; + QHBoxLayout* warning_layout = nullptr; + QWidget* warning_widget = nullptr; + QLabel* pre_alpha_warning = nullptr; friend class GameListSearchField;