diff --git a/src/android/app/src/main/java/org/citra/citra_emu/fragments/GamesFragment.kt b/src/android/app/src/main/java/org/citra/citra_emu/fragments/GamesFragment.kt index 70d882ef2..382a42773 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/fragments/GamesFragment.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/fragments/GamesFragment.kt @@ -1,4 +1,4 @@ -// Copyright Citra Emulator Project / Lime3DS Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -6,10 +6,12 @@ package org.citra.citra_emu.fragments import android.annotation.SuppressLint import android.os.Bundle +import android.text.method.LinkMovementMethod import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.view.ViewGroup.MarginLayoutParams +import android.widget.TextView import androidx.appcompat.app.AppCompatActivity import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat @@ -22,6 +24,7 @@ import androidx.lifecycle.repeatOnLifecycle import androidx.preference.PreferenceManager import androidx.recyclerview.widget.GridLayoutManager import com.google.android.material.color.MaterialColors +import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.transition.MaterialFadeThrough import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch @@ -33,6 +36,8 @@ import org.citra.citra_emu.features.settings.model.Settings import org.citra.citra_emu.model.Game import org.citra.citra_emu.viewmodel.GamesViewModel import org.citra.citra_emu.viewmodel.HomeViewModel +import androidx.core.content.edit +import androidx.core.text.HtmlCompat class GamesFragment : Fragment() { private var _binding: FragmentGamesBinding? = null @@ -40,6 +45,7 @@ class GamesFragment : Fragment() { private val gamesViewModel: GamesViewModel by activityViewModels() private val homeViewModel: HomeViewModel by activityViewModels() + private var show3DSFileWarning: Boolean = true override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -143,6 +149,34 @@ class GamesFragment : Fragment() { setInsets() } + override fun onResume() { + super.onResume() + + if (show3DSFileWarning && + !PreferenceManager.getDefaultSharedPreferences(CitraApplication.appContext) + .getBoolean("show_3ds_files_warning", false)) { + val message = HtmlCompat.fromHtml(getString(R.string.warning_3ds_files), + HtmlCompat.FROM_HTML_MODE_LEGACY) + + context?.let { + val alert = MaterialAlertDialogBuilder(it) + .setTitle(getString(R.string.important)) + .setMessage(message) + .setPositiveButton(R.string.dont_show_again) { _, _ -> + PreferenceManager.getDefaultSharedPreferences(CitraApplication.appContext) + .edit() { + putBoolean("show_3ds_files_warning", true) + } + } + .show() + + val alertMessage = alert.findViewById(android.R.id.message) as TextView + alertMessage.movementMethod = LinkMovementMethod.getInstance() + } + } + show3DSFileWarning = false + } + override fun onDestroyView() { super.onDestroyView() _binding = null diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml index d374cc8c8..bf5ad4c3f 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml @@ -11,6 +11,8 @@ Next, you will need to select an Applications Folder. Azahar will display all of the 3DS ROMs inside of the selected folder in the app.\n\nCIA ROMs, updates and DLC will need to be installed separately by clicking on the folder icon and selecting Install CIA. Start Cancelling… + Important + Don\'t show again Settings @@ -38,6 +40,7 @@ Changes the files that Azahar uses to load applications Modify the look of the app Install CIA + Encrypted files and .3ds files are no longer supported. Decrypting and/or renaming to .cci may be necessary. <a href=\"https://azahar-emu.org/blog/game-loading-changes/\">Learn more.</a> Select GPU driver diff --git a/src/citra_qt/configuration/config.cpp b/src/citra_qt/configuration/config.cpp index 22c7811da..c72810b37 100644 --- a/src/citra_qt/configuration/config.cpp +++ b/src/citra_qt/configuration/config.cpp @@ -828,6 +828,7 @@ void QtConfig::ReadUIGameListValues() { ReadBasicSetting(UISettings::values.game_list_row_2); ReadBasicSetting(UISettings::values.game_list_hide_no_icon); ReadBasicSetting(UISettings::values.game_list_single_line_mode); + ReadBasicSetting(UISettings::values.show_3ds_files_warning); ReadBasicSetting(UISettings::values.show_compat_column); ReadBasicSetting(UISettings::values.show_region_column); @@ -1335,6 +1336,7 @@ void QtConfig::SaveUIGameListValues() { WriteBasicSetting(UISettings::values.game_list_row_2); WriteBasicSetting(UISettings::values.game_list_hide_no_icon); WriteBasicSetting(UISettings::values.game_list_single_line_mode); + WriteBasicSetting(UISettings::values.show_3ds_files_warning); WriteBasicSetting(UISettings::values.show_compat_column); WriteBasicSetting(UISettings::values.show_region_column); diff --git a/src/citra_qt/game_list.cpp b/src/citra_qt/game_list.cpp index 1dbb3d7e1..98cebe9b7 100644 --- a/src/citra_qt/game_list.cpp +++ b/src/citra_qt/game_list.cpp @@ -1,4 +1,4 @@ -// Copyright 2015 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -350,6 +350,41 @@ GameList::GameList(PlayTime::PlayTimeManager& play_time_manager_, GMainWindow* p layout->setContentsMargins(0, 0, 0, 0); layout->setSpacing(0); + + if (UISettings::values.show_3ds_files_warning.GetValue()) { + + warning_layout = new QHBoxLayout; + deprecated_3ds_warning = new QLabel; + deprecated_3ds_warning->setText( + tr("IMPORTANT: Encrypted files and .3ds files are no longer supported. Decrypting " + "and/or renaming to .cci may be necessary. Learn more.")); + deprecated_3ds_warning->setOpenExternalLinks(true); + deprecated_3ds_warning->setStyleSheet( + QString::fromStdString("color: black; font-weight: bold;")); + + warning_hide = new QPushButton(tr("Don't show again")); + warning_hide->setStyleSheet( + QString::fromStdString("color: blue; text-decoration: underline;")); + warning_hide->setFlat(true); + warning_hide->setCursor(Qt::PointingHandCursor); + + connect(warning_hide, &QPushButton::clicked, [this]() { + warning_widget->setVisible(false); + UISettings::values.show_3ds_files_warning.SetValue(false); + }); + + warning_layout->addWidget(deprecated_3ds_warning); + warning_layout->addStretch(); + warning_layout->addWidget(warning_hide); + 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/citra_qt/game_list.h b/src/citra_qt/game_list.h index 995af0489..f900b9b96 100644 --- a/src/citra_qt/game_list.h +++ b/src/citra_qt/game_list.h @@ -1,10 +1,11 @@ -// Copyright 2015 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. #pragma once #include +#include #include #include #include @@ -133,6 +134,10 @@ private: void changeEvent(QEvent*) override; void RetranslateUI(); + QHBoxLayout* warning_layout = nullptr; + QWidget* warning_widget = nullptr; + QLabel* deprecated_3ds_warning = nullptr; + QPushButton* warning_hide = nullptr; GameListSearchField* search_field; GMainWindow* main_window = nullptr; QVBoxLayout* layout = nullptr; diff --git a/src/citra_qt/uisettings.h b/src/citra_qt/uisettings.h index 9ac9d86d6..392954cf8 100644 --- a/src/citra_qt/uisettings.h +++ b/src/citra_qt/uisettings.h @@ -94,6 +94,7 @@ struct Values { Settings::Setting game_list_row_2{GameListText::FileName, "row2"}; Settings::Setting game_list_hide_no_icon{false, "hideNoIcon"}; Settings::Setting game_list_single_line_mode{false, "singleLineMode"}; + Settings::Setting show_3ds_files_warning{true, "show_3ds_files_warning"}; // Compatibility List Settings::Setting show_compat_column{true, "show_compat_column"};