diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 45fe94b..1e653f5 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -499,12 +499,12 @@ dependencies { implementation("com.github.Fox2Code:AndroidANSI:1.2.1") // sentry - implementation("io.sentry:sentry-android:6.28.0") - implementation("io.sentry:sentry-android-timber:6.28.0") - implementation("io.sentry:sentry-android-fragment:6.28.0") - implementation("io.sentry:sentry-android-okhttp:6.28.0") - implementation("io.sentry:sentry-kotlin-extensions:6.28.0") - implementation("io.sentry:sentry-android-ndk:6.28.0") + implementation("io.sentry:sentry-android:6.29.0") + implementation("io.sentry:sentry-android-timber:6.29.0") + implementation("io.sentry:sentry-android-fragment:6.29.0") + implementation("io.sentry:sentry-android-okhttp:6.29.0") + implementation("io.sentry:sentry-kotlin-extensions:6.29.0") + implementation("io.sentry:sentry-android-ndk:6.29.0") // Markdown // TODO: switch to an updated implementation @@ -554,6 +554,8 @@ dependencies { // optional - Kotlin Extensions and Coroutines support for Room implementation("androidx.room:room-ktx:2.5.2") + + implementation("pl.droidsonroids.gif:android-gif-drawable:1.2.28") } android { @@ -563,7 +565,7 @@ android { } } - ndkVersion = "25.2.9519653" + ndkVersion = "26.0.10636728 rc2" dependenciesInfo { includeInApk = false includeInBundle = false diff --git a/app/src/main/kotlin/com/fox2code/mmm/NotificationType.kt b/app/src/main/kotlin/com/fox2code/mmm/NotificationType.kt index aab84e6..a0fc141 100644 --- a/app/src/main/kotlin/com/fox2code/mmm/NotificationType.kt +++ b/app/src/main/kotlin/com/fox2code/mmm/NotificationType.kt @@ -27,6 +27,7 @@ import com.fox2code.mmm.utils.IntentHelper import com.fox2code.mmm.utils.io.Files.Companion.patchModuleSimple import com.fox2code.mmm.utils.io.Files.Companion.read import com.fox2code.mmm.utils.io.net.Http +import com.google.android.material.dialog.MaterialAlertDialogBuilder import timber.log.Timber import java.io.BufferedReader import java.io.File @@ -195,6 +196,15 @@ enum class NotificationType( androidx.appcompat.R.attr.colorBackgroundFloating, com.google.android.material.R.attr.colorOnBackground, View.OnClickListener { v: View? -> + if (MainApplication.getSharedPreferences("mmm")?.getBoolean("pref_require_security", false) == true) { + // block local install for safety + MaterialAlertDialogBuilder(v!!.context) + .setTitle(R.string.install_from_storage) + .setMessage(R.string.install_from_storage_safe_modules) + .setPositiveButton(android.R.string.ok, null) + .show() + return@OnClickListener + } val compatActivity = FoxActivity.getFoxActivity(v) val module = File( compatActivity.cacheDir, "installer" + File.separator + "module.zip" diff --git a/app/src/main/kotlin/com/fox2code/mmm/SetupActivity.kt b/app/src/main/kotlin/com/fox2code/mmm/SetupActivity.kt index ddbe98a..7047432 100644 --- a/app/src/main/kotlin/com/fox2code/mmm/SetupActivity.kt +++ b/app/src/main/kotlin/com/fox2code/mmm/SetupActivity.kt @@ -11,6 +11,7 @@ import android.content.DialogInterface import android.content.Intent import android.content.pm.PackageManager import android.content.res.Resources.Theme +import android.net.Uri import android.os.Bundle import android.os.Process import android.view.View @@ -46,6 +47,7 @@ class SetupActivity : FoxActivity(), LanguageActivity { private var cachedTheme = 0 @SuppressLint("ApplySharedPref", "RestrictedApi") + @Suppress("KotlinConstantConditions", "NAME_SHADOWING") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) this.setTitle(R.string.setup_title) @@ -69,7 +71,7 @@ class SetupActivity : FoxActivity(), LanguageActivity { if (ts.time > buildTime.time) { val pm = packageManager val intent = Intent(this, ExpiredActivity::class.java) - @Suppress("DEPRECATION") val resolveInfo = pm.queryIntentActivities(intent, 0) + val resolveInfo = pm.queryIntentActivities(intent, 0) if (resolveInfo.size > 0) { startActivity(intent) finish() @@ -85,6 +87,67 @@ class SetupActivity : FoxActivity(), LanguageActivity { } } val view: View = binding.root + // if our application id is "com.androidacy.mmm" or begins with it, check if com.fox2code.mmm is installed and offer to uninstall it. if we're com.fox2code.mmm, check if com.fox2code.mmm.fdroid or com.fox2code.mmm.debug is installed and offer to uninstall it + val ourPackageName = BuildConfig.APPLICATION_ID + val foxPkgName = "com.fox2code.mmm" + val foxPkgNameFdroid = "com.fox2code.mmm.fdroid" + val foxPkgNameDebug = "com.fox2code.mmm.debug" + val foxPkgNamePlay = "com.androidacy.mmm.play" + val androidacyPkgName = "com.androidacy.mmm" + val pm = packageManager + val intent = Intent(Intent.ACTION_MAIN, null) + intent.addCategory(Intent.CATEGORY_LAUNCHER) + val resolveInfoList = pm.queryIntentActivities(intent, 0) + for (resolveInfo in resolveInfoList) { + val packageName = resolveInfo.activityInfo.packageName + if (packageName == ourPackageName) { + continue + } + when (ourPackageName) { + foxPkgName -> { + if (packageName == foxPkgNameDebug || packageName == foxPkgNameFdroid || packageName == foxPkgNamePlay) { + val materialAlertDialogBuilder = MaterialAlertDialogBuilder(this) + materialAlertDialogBuilder.setTitle(R.string.setup_uninstall_title) + materialAlertDialogBuilder.setMessage(getString(R.string.setup_uninstall_message, packageName)) + materialAlertDialogBuilder.setPositiveButton(R.string.uninstall) { _: DialogInterface?, _: Int -> + // start uninstall intent + val intent = Intent(Intent.ACTION_DELETE) + intent.data = Uri.parse("package:$packageName") + startActivity(intent) + } + materialAlertDialogBuilder.setNegativeButton(R.string.cancel) { _: DialogInterface?, _: Int -> } + } + } + androidacyPkgName -> { + if (packageName == foxPkgName || packageName == foxPkgNameFdroid || packageName == foxPkgNameDebug || packageName == foxPkgNamePlay) { + val materialAlertDialogBuilder = MaterialAlertDialogBuilder(this) + materialAlertDialogBuilder.setTitle(R.string.setup_uninstall_title) + materialAlertDialogBuilder.setMessage(getString(R.string.setup_uninstall_message, packageName)) + materialAlertDialogBuilder.setPositiveButton(R.string.uninstall) { _: DialogInterface?, _: Int -> + // start uninstall intent + val intent = Intent(Intent.ACTION_DELETE) + intent.data = Uri.parse("package:$packageName") + startActivity(intent) + } + materialAlertDialogBuilder.setNegativeButton(R.string.cancel) { _: DialogInterface?, _: Int -> } + } + } + else -> { + if (packageName == foxPkgNameDebug) { + val materialAlertDialogBuilder = MaterialAlertDialogBuilder(this) + materialAlertDialogBuilder.setTitle(R.string.setup_uninstall_title) + materialAlertDialogBuilder.setMessage(getString(R.string.setup_uninstall_message, packageName)) + materialAlertDialogBuilder.setPositiveButton(R.string.uninstall) { _: DialogInterface?, _: Int -> + // start uninstall intent + val intent = Intent(Intent.ACTION_DELETE) + intent.data = Uri.parse("package:$packageName") + startActivity(intent) + } + materialAlertDialogBuilder.setNegativeButton(R.string.cancel) { _: DialogInterface?, _: Int -> } + } + } + } + } (Objects.requireNonNull(view.findViewById(R.id.setup_background_update_check)) as MaterialSwitch).isChecked = BuildConfig.ENABLE_AUTO_UPDATER (Objects.requireNonNull(view.findViewById(R.id.setup_crash_reporting)) as MaterialSwitch).isChecked = @@ -205,10 +268,16 @@ class SetupActivity : FoxActivity(), LanguageActivity { val setupButton = view.findViewById(R.id.setup_finish) // on clicking setup_agree_eula, enable the setup button if it's checked, if it's not, disable it val agreeEula = view.findViewById(R.id.setup_agree_eula) - agreeEula.setOnCheckedChangeListener { _: CompoundButton?, isChecked: Boolean -> - setupButton.isEnabled = isChecked - } setupButton.setOnClickListener { _: View? -> + // if agreeEula is not checked, show a toast and return + if (!agreeEula.isChecked) { + Toast.makeText( + this, + R.string.setup_agree_eula_toast, + Toast.LENGTH_LONG + ).show() + return@setOnClickListener + } Timber.i("Setup button clicked") // get instance of editor if (BuildConfig.DEBUG) Timber.d("Saving preferences") @@ -247,6 +316,14 @@ class SetupActivity : FoxActivity(), LanguageActivity { "pref_analytics_enabled", (Objects.requireNonNull(view.findViewById(R.id.setup_app_analytics)) as MaterialSwitch).isChecked ) + // setup_require_security -> pref_require_security + editor.putBoolean( + "pref_require_security", (Objects.requireNonNull( + view.findViewById( + R.id.setup_require_security + ) + ) as MaterialSwitch).isChecked + ) if (BuildConfig.DEBUG) Timber.d("Saving preferences") // now basically do the same thing for room db val db = Room.databaseBuilder( @@ -262,7 +339,7 @@ class SetupActivity : FoxActivity(), LanguageActivity { reposListDao.setEnabled(androidacyRepoRoomObj.id, androidacyRepoRoom) reposListDao.setEnabled(magiskAltRepoRoomObj.id, magiskAltRepoRoom) db.close() - editor.putString("last_shown_setup", "v3") + editor.putString("last_shown_setup", "v4") // Commit the changes editor.commit() // Log the changes @@ -415,11 +492,11 @@ class SetupActivity : FoxActivity(), LanguageActivity { safe = false, stats = 0, ) + moduleListCacheDao.deleteAll() // insert the modulelistcache into the database moduleListCacheDao.insert(moduleListCache) // now make sure reposlist is updated with 2 entries and modulelistcache is updated with 1 entry val reposList = reposListDao.getAll() - val moduleListCacheList = moduleListCacheDao.getAll() // make sure reposlist is updated with 2 entries if (reposList.size != 2) { Timber.e("ReposList is not updated with 2 entries") @@ -435,7 +512,7 @@ class SetupActivity : FoxActivity(), LanguageActivity { if (BuildConfig.DEBUG) Timber.d("ReposList is updated with 2 entries") } // make sure modulelistcache is updated with 1 entry - if (moduleListCacheList.size != 1) { + if (moduleListCacheDao.getAll().size != 1) { Timber.e("ModuleListCache is not updated with 1 entry") // show a toast runOnUiThread { diff --git a/app/src/main/kotlin/com/fox2code/mmm/background/BackgroundUpdateChecker.kt b/app/src/main/kotlin/com/fox2code/mmm/background/BackgroundUpdateChecker.kt index 2002715..d6030da 100644 --- a/app/src/main/kotlin/com/fox2code/mmm/background/BackgroundUpdateChecker.kt +++ b/app/src/main/kotlin/com/fox2code/mmm/background/BackgroundUpdateChecker.kt @@ -14,7 +14,6 @@ import android.content.Intent import android.content.pm.PackageManager import android.net.ConnectivityManager import android.net.NetworkCapabilities -import android.os.Build import androidx.core.app.NotificationChannelCompat import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat @@ -381,19 +380,17 @@ class BackgroundUpdateChecker(context: Context, workerParams: WorkerParameters) fun onMainActivityCreate(context: Context) { // Refuse to run if first_launch pref is not false if (MainApplication.getSharedPreferences("mmm")!! - .getString("last_shown_setup", null) != "v3" + .getString("last_shown_setup", null) != "v4" ) return // create notification channel group - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - val groupName: CharSequence = context.getString(R.string.notification_group_updates) - val mNotificationManager = - ContextCompat.getSystemService(context, NotificationManager::class.java) - mNotificationManager?.createNotificationChannelGroup( - NotificationChannelGroup( - NOTFIICATION_GROUP, groupName - ) + val groupName: CharSequence = context.getString(R.string.notification_group_updates) + val mNotificationManager = + ContextCompat.getSystemService(context, NotificationManager::class.java) + mNotificationManager?.createNotificationChannelGroup( + NotificationChannelGroup( + NOTFIICATION_GROUP, groupName ) - } + ) val notificationManagerCompat = NotificationManagerCompat.from(context) notificationManagerCompat.createNotificationChannel( NotificationChannelCompat.Builder( diff --git a/app/src/main/kotlin/com/fox2code/mmm/manager/ModuleManager.kt b/app/src/main/kotlin/com/fox2code/mmm/manager/ModuleManager.kt index 03744c1..4543c58 100644 --- a/app/src/main/kotlin/com/fox2code/mmm/manager/ModuleManager.kt +++ b/app/src/main/kotlin/com/fox2code/mmm/manager/ModuleManager.kt @@ -32,9 +32,9 @@ class ModuleManager private constructor() : SyncManager() { private var updatableModuleCount = 0 override fun scanInternal(updateListener: UpdateListener) { - // if last_shown_setup is not "v3", then refuse to continue + // if last_shown_setup is not "v4", then refuse to continue if (MainApplication.getSharedPreferences("mmm")!! - .getString("last_shown_setup", "") != "v3" + .getString("last_shown_setup", "") != "v4" ) { return } diff --git a/app/src/main/kotlin/com/fox2code/mmm/module/ActionButtonType.kt b/app/src/main/kotlin/com/fox2code/mmm/module/ActionButtonType.kt index c90b3bd..060a5d7 100644 --- a/app/src/main/kotlin/com/fox2code/mmm/module/ActionButtonType.kt +++ b/app/src/main/kotlin/com/fox2code/mmm/module/ActionButtonType.kt @@ -14,6 +14,7 @@ import androidx.annotation.DrawableRes import com.fox2code.foxcompat.app.FoxActivity import com.fox2code.foxcompat.view.FoxDisplay import com.fox2code.mmm.BuildConfig +import com.fox2code.mmm.MainApplication import com.fox2code.mmm.MainApplication.Companion.INSTANCE import com.fox2code.mmm.MainApplication.Companion.isShowcaseMode import com.fox2code.mmm.R @@ -121,6 +122,19 @@ enum class ActionButtonType { } override fun doAction(button: Chip, moduleHolder: ModuleHolder) { + if (MainApplication.getSharedPreferences("mmm")?.getBoolean("pref_require_security", false) == true) { + // get safe status from either mainmoduleinfo or repo module + val safe = moduleHolder.mainModuleInfo.safe || moduleHolder.repoModule?.moduleInfo?.safe ?: false + if (!safe) { + // block local install for safety + MaterialAlertDialogBuilder(button.context) + .setTitle(R.string.install_blocked) + .setMessage(R.string.install_blocked_message) + .setPositiveButton(android.R.string.ok, null) + .show() + return + } + } // if mainmoduleinfo is null, we are in repo mode val moduleInfo: ModuleInfo = if (moduleHolder.mainModuleInfo != null) { moduleHolder.mainModuleInfo diff --git a/app/src/main/kotlin/com/fox2code/mmm/repo/CustomRepoManager.kt b/app/src/main/kotlin/com/fox2code/mmm/repo/CustomRepoManager.kt index 823ff2a..2088c70 100644 --- a/app/src/main/kotlin/com/fox2code/mmm/repo/CustomRepoManager.kt +++ b/app/src/main/kotlin/com/fox2code/mmm/repo/CustomRepoManager.kt @@ -30,7 +30,7 @@ class CustomRepoManager internal constructor( init { repoCount = 0 // refuse to load if setup is not complete - if (getSharedPreferences("mmm")!!.getString("last_shown_setup", "") == "v3") { + if (getSharedPreferences("mmm")!!.getString("last_shown_setup", "") == "v4") { val i = 0 val lastFilled = intArrayOf(0) // now the same as above but for room database diff --git a/app/src/main/kotlin/com/fox2code/mmm/repo/RepoManager.kt b/app/src/main/kotlin/com/fox2code/mmm/repo/RepoManager.kt index 051358f..984aace 100644 --- a/app/src/main/kotlin/com/fox2code/mmm/repo/RepoManager.kt +++ b/app/src/main/kotlin/com/fox2code/mmm/repo/RepoManager.kt @@ -56,7 +56,7 @@ class RepoManager private constructor(mainApplication: MainApplication) : SyncMa repoData = LinkedHashMap() modules = HashMap() // refuse to load if setup is not complete - if (getSharedPreferences("mmm")!!.getString("last_shown_setup", "") == "v3") { + if (getSharedPreferences("mmm")!!.getString("last_shown_setup", "") == "v4") { // We do not have repo list config yet. androidacyRepoData = addAndroidacyRepoData() val altRepo = addRepoData(MAGISK_ALT_REPO, "Magisk Modules Alt Repo") @@ -82,8 +82,8 @@ class RepoManager private constructor(mainApplication: MainApplication) : SyncMa } private fun populateDefaultCache(repoData: RepoData?) { - // if last_shown_setup is not "v3", them=n refuse to continue - if (getSharedPreferences("mmm")!!.getString("last_shown_setup", "") != "v3") { + // if last_shown_setup is not "v4", them=n refuse to continue + if (getSharedPreferences("mmm")!!.getString("last_shown_setup", "") != "v4") { return } // make sure repodata is not null diff --git a/app/src/main/kotlin/com/fox2code/mmm/settings/DebugFragment.kt b/app/src/main/kotlin/com/fox2code/mmm/settings/DebugFragment.kt index 68ab673..3120c03 100644 --- a/app/src/main/kotlin/com/fox2code/mmm/settings/DebugFragment.kt +++ b/app/src/main/kotlin/com/fox2code/mmm/settings/DebugFragment.kt @@ -25,6 +25,7 @@ import java.io.File import java.io.FileOutputStream import java.io.IOException import java.io.InputStreamReader +import java.util.Date class DebugFragment : PreferenceFragmentCompat() { override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { @@ -182,6 +183,17 @@ class DebugFragment : PreferenceFragmentCompat() { } } } + // save logs to our external storage - name is current date and time + try { + val extStorage = File(requireContext().getExternalFilesDir(null), "logs" + File.separator + "log-" + Date().toString() + ".txt") + FileUtils.copyFile(logsFile, extStorage) + } catch (e: IOException) { + e.printStackTrace() + Toast.makeText( + requireContext(), R.string.error_saving_logs, Toast.LENGTH_SHORT + ).show() + return@setOnPreferenceClickListener true + } // Share logs val shareIntent = Intent() // create a new intent and grantUriPermission to the file provider diff --git a/app/src/main/kotlin/com/fox2code/mmm/utils/RuntimeUtils.kt b/app/src/main/kotlin/com/fox2code/mmm/utils/RuntimeUtils.kt index 81aa5b8..253e229 100644 --- a/app/src/main/kotlin/com/fox2code/mmm/utils/RuntimeUtils.kt +++ b/app/src/main/kotlin/com/fox2code/mmm/utils/RuntimeUtils.kt @@ -159,7 +159,7 @@ class RuntimeUtils { if (BuildConfig.DEBUG) Timber.i("Checking if we need to run setup") // Check if context is the first launch using prefs and if doSetupRestarting was passed in the intent val prefs = MainApplication.getSharedPreferences("mmm")!! - var firstLaunch = prefs.getString("last_shown_setup", null) != "v3" + var firstLaunch = prefs.getString("last_shown_setup", null) != "v4" // First launch // context is intentionally separate from the above if statement, because it needs to be checked even if the first launch check is true due to some weird edge cases if (activity.intent.getBooleanExtra("doSetupRestarting", false)) { diff --git a/app/src/main/kotlin/com/fox2code/mmm/utils/sentry/SentryMain.kt b/app/src/main/kotlin/com/fox2code/mmm/utils/sentry/SentryMain.kt index c50fa23..34b1fde 100644 --- a/app/src/main/kotlin/com/fox2code/mmm/utils/sentry/SentryMain.kt +++ b/app/src/main/kotlin/com/fox2code/mmm/utils/sentry/SentryMain.kt @@ -72,7 +72,7 @@ object SentryMain { } // If first_launch pref is not false, refuse to initialize Sentry val sharedPreferences = MainApplication.getSharedPreferences("mmm")!! - if (sharedPreferences.getString("last_shown_setup", null) != "v3") { + if (sharedPreferences.getString("last_shown_setup", null) != "v4") { return } isSentryEnabled = sharedPreferences.getBoolean("pref_crash_reporting_enabled", false) diff --git a/app/src/main/res/drawable/baseline_keyboard_arrow_right_24.xml b/app/src/main/res/drawable/baseline_keyboard_arrow_right_24.xml new file mode 100644 index 0000000..5d47b4d --- /dev/null +++ b/app/src/main/res/drawable/baseline_keyboard_arrow_right_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/font/inter.xml b/app/src/main/res/font/inter.xml deleted file mode 100644 index 9fbf8c0..0000000 --- a/app/src/main/res/font/inter.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/font/interbold.otf b/app/src/main/res/font/interbold.otf deleted file mode 100644 index c74cc0c..0000000 Binary files a/app/src/main/res/font/interbold.otf and /dev/null differ diff --git a/app/src/main/res/font/interitalic.otf b/app/src/main/res/font/interitalic.otf deleted file mode 100644 index 39d6016..0000000 Binary files a/app/src/main/res/font/interitalic.otf and /dev/null differ diff --git a/app/src/main/res/font/interregular.otf b/app/src/main/res/font/interregular.otf deleted file mode 100644 index 84e6a61..0000000 Binary files a/app/src/main/res/font/interregular.otf and /dev/null differ diff --git a/app/src/main/res/font/jetbrainsmono.xml b/app/src/main/res/font/jetbrainsmono.xml index b3c6252..c02ba67 100644 --- a/app/src/main/res/font/jetbrainsmono.xml +++ b/app/src/main/res/font/jetbrainsmono.xml @@ -2,12 +2,11 @@ ~ Copyright (c) 2023 to present Androidacy and contributors. Names, logos, icons, and the Androidacy name are all trademarks of Androidacy and may not be used without license. See LICENSE for more information. --> - + + /> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_setup.xml b/app/src/main/res/layout/activity_setup.xml index c374ca7..d372f3c 100644 --- a/app/src/main/res/layout/activity_setup.xml +++ b/app/src/main/res/layout/activity_setup.xml @@ -2,7 +2,8 @@ ~ Copyright (c) 2023 to present Androidacy and contributors. Names, logos, icons, and the Androidacy name are all trademarks of Androidacy and may not be used without license. See LICENSE for more information. --> - + + + + + + + + + @@ -44,8 +45,8 @@ android:id="@+id/bottom_navigation" android:layout_width="match_parent" android:layout_height="wrap_content" - app:layout_constraintTop_toBottomOf="@id/install_horizontal_scroller" app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintTop_toBottomOf="@id/install_horizontal_scroller" app:menu="@menu/bottom_nav_install" /> \ No newline at end of file diff --git a/app/src/main/res/layout/installer_wrap.xml b/app/src/main/res/layout/installer_wrap.xml index 55a68e5..57d380f 100644 --- a/app/src/main/res/layout/installer_wrap.xml +++ b/app/src/main/res/layout/installer_wrap.xml @@ -18,6 +18,7 @@ android:fontFamily="@font/jetbrainsmono" android:overScrollMode="never" android:textSize="16sp" + app:flow_wrapMode="aligned" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintBottom_toTopOf="@id/bottom_navigation" diff --git a/app/src/main/res/menu/setup_bottom_nav.xml b/app/src/main/res/menu/setup_bottom_nav.xml index 94936fc..42932ee 100644 --- a/app/src/main/res/menu/setup_bottom_nav.xml +++ b/app/src/main/res/menu/setup_bottom_nav.xml @@ -7,7 +7,7 @@ \ No newline at end of file diff --git a/app/src/main/res/values-v27/themes.xml b/app/src/main/res/values-v27/themes.xml new file mode 100644 index 0000000..8c9802e --- /dev/null +++ b/app/src/main/res/values-v27/themes.xml @@ -0,0 +1,37 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-v29/themes.xml b/app/src/main/res/values-v29/themes.xml new file mode 100644 index 0000000..fdb1759 --- /dev/null +++ b/app/src/main/res/values-v29/themes.xml @@ -0,0 +1,38 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-v31/themes.xml b/app/src/main/res/values-v31/themes.xml index 7023535..bcf58b6 100644 --- a/app/src/main/res/values-v31/themes.xml +++ b/app/src/main/res/values-v31/themes.xml @@ -11,9 +11,6 @@ @style/Widget.Material3.Chip.Assist.Elevated @color/system_accent2_100 - - @font/inter - @font/inter false true false @@ -28,9 +25,6 @@ @color/system_neutral1_800 @color/system_neutral1_900 @style/Widget.Material3.Chip.Assist.Elevated - - @font/inter - @font/inter false true false @@ -57,9 +51,6 @@ @color/system_accent2_700 @style/Widget.Material3.Chip.Assist.Elevated - - @font/inter - @font/inter false true false diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e2e5436..b27bad6 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -188,8 +188,7 @@ Allow us to check for module and app updates in the background. This feature may use more battery and data. Enable the Androidacy repo Features user reviews, automatic virus scans, fast updates, a wide selection, and is backed by Androidacy. - + Enable the Magisk Alt Repo Much more lax than the original. Has a lot of modules at the cost of some safety. Enable Sentry @@ -401,5 +400,16 @@ 6 hours 12 hours Daily - experimental and may have issues. Compatibility with modules is not guaraunteed.]]> + KernelSU support is currently experimental and may have issues. Compatibility with modules is not guaraunteed.> + Uninstall other version? + There\'s another version of this app present on your device. We recommend removing it to prevent unexpected behavior.\n\nApp: %s + Require that modules are safe. This status is repository dependent and will disable local install. + Only allow safe modules + For your security, local module install is disabled by module security. You can toggle this in settings at your own risk. + Install blocked + You currently cannot install this module because you have module security enabled in settings. Please disable it if you want to continue, but you disable at your own risk. + Require modules be safe + Requires modules to be marked as safe before installing. This will disable local module install and module safety is determined by the repository owner. + Please agree to the terms first + We recommend you to enable just the Androidacy repo. This ensures you will receive an optimized and more secure experience. diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index f892a90..5b285f3 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -19,7 +19,6 @@ @color/status_bar_color @color/transparent true - true true - @font/inter - @font/inter false true false @@ -60,9 +56,6 @@ @style/Theme.Design.NoActionBar @style/Widget.Material3.Chip.Assist.Elevated - - @font/inter - @font/inter false true false @@ -86,7 +79,6 @@ @color/status_bar_color @color/transparent false - false true - @font/inter - @font/inter false true false @@ -128,9 +117,6 @@ @style/Theme.Design.NoActionBar @style/Widget.Material3.Chip.Assist.Elevated - - @font/inter - @font/inter false true false diff --git a/app/src/main/res/xml/security_preferences.xml b/app/src/main/res/xml/security_preferences.xml index a34a511..3d4880b 100644 --- a/app/src/main/res/xml/security_preferences.xml +++ b/app/src/main/res/xml/security_preferences.xml @@ -28,6 +28,15 @@ app:singleLineTitle="false" app:summary="@string/prevent_reboot_desc" app:title="@string/prevent_reboot_pref" /> + + + \ No newline at end of file