Pre alpha watermark

* android: Add pre-alpha warning dialog and banner

* qt: android: Add pre-alpha warning banner
This commit is contained in:
PabloMK7 2025-04-09 23:45:12 +02:00 committed by Briar
parent b7a3146c2f
commit d9c0ec8f83
8 changed files with 104 additions and 1 deletions

View file

@ -240,6 +240,8 @@ dependencies {
implementation("androidx.navigation:navigation-ui-ktx:2.8.9") implementation("androidx.navigation:navigation-ui-ktx:2.8.9")
implementation("info.debatty:java-string-similarity:2.0.0") implementation("info.debatty:java-string-similarity:2.0.0")
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.3") 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>): String { fun runGitCommand(command: List<String>): String {

View file

@ -30,6 +30,7 @@ object Settings {
YuzuApplication.appContext.getString(R.string.preferences_player, player) YuzuApplication.appContext.getString(R.string.preferences_player, player)
const val PREF_FIRST_APP_LAUNCH = "FirstApplicationLaunch" const val PREF_FIRST_APP_LAUNCH = "FirstApplicationLaunch"
const val PREF_SHOULD_SHOW_PRE_ALPHA_WARNING = "ShouldShowPreAlphaWarning"
const val PREF_MEMORY_WARNING_SHOWN = "MemoryWarningShown" const val PREF_MEMORY_WARNING_SHOWN = "MemoryWarningShown"
// Deprecated input overlay preference keys // Deprecated input overlay preference keys

View file

@ -346,6 +346,7 @@ class SetupFragment : Fragment() {
.putBoolean(Settings.PREF_FIRST_APP_LAUNCH, false) .putBoolean(Settings.PREF_FIRST_APP_LAUNCH, false)
.apply() .apply()
mainActivity.finishSetup(binding.root.findNavController()) mainActivity.finishSetup(binding.root.findNavController())
mainActivity.showPreAlphaWarningDialog()
} }
fun pageForward() { fun pageForward() {

View file

@ -7,13 +7,16 @@ import android.content.Context
import android.content.Intent import android.content.Intent
import android.content.res.Configuration import android.content.res.Configuration
import android.os.Bundle import android.os.Bundle
import android.view.Gravity
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.view.inputmethod.InputMethodManager import android.view.inputmethod.InputMethodManager
import android.widget.PopupMenu import android.widget.PopupMenu
import android.widget.TextView
import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.constraintlayout.widget.ConstraintLayout
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
@ -39,6 +42,7 @@ import org.yuzu.yuzu_emu.utils.ViewUtils.setVisible
import org.yuzu.yuzu_emu.utils.collect import org.yuzu.yuzu_emu.utils.collect
import java.util.Locale import java.util.Locale
import androidx.core.content.edit import androidx.core.content.edit
import androidx.core.view.updateLayoutParams
class GamesFragment : Fragment() { class GamesFragment : Fragment() {
private var _binding: FragmentGamesBinding? = null private var _binding: FragmentGamesBinding? = null
@ -148,6 +152,7 @@ class GamesFragment : Fragment() {
} }
setInsets() setInsets()
addPreAlphaBanner()
} }
val applyGridGamesBinding = { val applyGridGamesBinding = {
@ -218,6 +223,49 @@ class GamesFragment : Fragment() {
navController.navigate(R.id.action_gamesFragment_to_homeSettingsFragment) 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<ConstraintLayout.LayoutParams> {
topToBottom = preAlphaBanner.id
}
}
private fun showViewMenu(anchor: View) { private fun showViewMenu(anchor: View) {
val popup = PopupMenu(requireContext(), anchor) val popup = PopupMenu(requireContext(), anchor)
popup.menuInflater.inflate(R.menu.menu_game_views, popup.menu) popup.menuInflater.inflate(R.menu.menu_game_views, popup.menu)

View file

@ -48,6 +48,7 @@ import java.io.BufferedInputStream
import java.io.BufferedOutputStream import java.io.BufferedOutputStream
import java.util.zip.ZipEntry import java.util.zip.ZipEntry
import java.util.zip.ZipInputStream import java.util.zip.ZipInputStream
import androidx.core.content.edit
class MainActivity : AppCompatActivity(), ThemeProvider { class MainActivity : AppCompatActivity(), ThemeProvider {
private lateinit var binding: ActivityMainBinding private lateinit var binding: ActivityMainBinding
@ -83,6 +84,7 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
.getBoolean(Settings.PREF_FIRST_APP_LAUNCH, true) .getBoolean(Settings.PREF_FIRST_APP_LAUNCH, true)
if (!firstTimeSetup) { if (!firstTimeSetup) {
checkKeys() checkKeys()
showPreAlphaWarningDialog()
} }
checkedDecryption = true checkedDecryption = true
} }
@ -138,6 +140,30 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
setInsets() 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() { private fun checkKeys() {
if (!NativeLibrary.areKeysPresent()) { if (!NativeLibrary.areKeysPresent()) {
MessageDialogFragment.newInstance( MessageDialogFragment.newInstance(

View file

@ -32,6 +32,10 @@
<string name="view_list">List</string> <string name="view_list">List</string>
<string name="view_grid">Grid</string> <string name="view_grid">Grid</string>
<string name="folder">Folder</string> <string name="folder">Folder</string>
<string name="pre_alpha_warning_title">Pre-Alpha Software</string>
<string name="pre_alpha_warning_description">"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 "</string>
<string name="dont_show_again">Dont Show Again</string>
<string name="pre_alpha_warning">PRE-ALPHA SOFTWARE; NOT MEANT FOR PUBLIC USE</string>\
<string name="add_directory_success">"New game directory added successfully "</string> <string name="add_directory_success">"New game directory added successfully "</string>
<string name="home_games">Games</string> <string name="home_games">Games</string>
<string name="home_search">Search</string> <string name="home_search">Search</string>
@ -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 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. OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
</string> </string>
</resources> </resources>

View file

@ -369,6 +369,25 @@ GameList::GameList(FileSys::VirtualFilesystem vfs_, FileSys::ManualContentProvid
layout->setContentsMargins(0, 0, 0, 0); layout->setContentsMargins(0, 0, 0, 0);
layout->setSpacing(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(tree_view);
layout->addWidget(search_field); layout->addWidget(search_field);
setLayout(layout); setLayout(layout);

View file

@ -172,6 +172,9 @@ private:
QFileSystemWatcher* watcher = nullptr; QFileSystemWatcher* watcher = nullptr;
ControllerNavigation* controller_navigation = nullptr; ControllerNavigation* controller_navigation = nullptr;
CompatibilityList compatibility_list; CompatibilityList compatibility_list;
QHBoxLayout* warning_layout = nullptr;
QWidget* warning_widget = nullptr;
QLabel* pre_alpha_warning = nullptr;
friend class GameListSearchField; friend class GameListSearchField;