diff --git a/README.md b/README.md index f6393bb..dbb7108 100644 --- a/README.md +++ b/README.md @@ -39,6 +39,7 @@ The Androidacy Module Manager serves as a robust alternative to the official Mag #### Dark | Light + Dark Screenshot Light Screenshot ### Default Repositories diff --git a/app/src/main/kotlin/com/fox2code/mmm/AppUpdateManager.kt b/app/src/main/kotlin/com/fox2code/mmm/AppUpdateManager.kt index 2388732..60f5000 100644 --- a/app/src/main/kotlin/com/fox2code/mmm/AppUpdateManager.kt +++ b/app/src/main/kotlin/com/fox2code/mmm/AppUpdateManager.kt @@ -16,7 +16,7 @@ import java.io.InputStream @Suppress("unused") class AppUpdateManager private constructor() { - var changes: String? = null + private var changes: String? = null private val compatDataId = HashMap() private val updateLock = Any() private val compatFile: File = File(MainApplication.INSTANCE!!.filesDir, "compat.txt") @@ -132,7 +132,6 @@ class AppUpdateManager private constructor() { return appUpdateManager.getCompatibilityFlags(moduleId) } - @JvmStatic fun shouldForceHide(repoId: String): Boolean { return if (BuildConfig.DEBUG || repoId.startsWith("repo_") || repoId == "magisk_alt_repo") false else !repoId.startsWith( "repo_" diff --git a/app/src/main/kotlin/com/fox2code/mmm/CrashHandler.kt b/app/src/main/kotlin/com/fox2code/mmm/CrashHandler.kt index e1c8962..6a0a548 100644 --- a/app/src/main/kotlin/com/fox2code/mmm/CrashHandler.kt +++ b/app/src/main/kotlin/com/fox2code/mmm/CrashHandler.kt @@ -12,7 +12,7 @@ import android.os.Bundle import android.view.View import android.widget.EditText import android.widget.Toast -import com.fox2code.foxcompat.app.FoxActivity +import androidx.appcompat.app.AppCompatActivity import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.textview.MaterialTextView import io.sentry.Sentry @@ -22,7 +22,7 @@ import timber.log.Timber import java.io.PrintWriter import java.io.StringWriter -class CrashHandler : FoxActivity() { +class CrashHandler : AppCompatActivity() { @Suppress("DEPRECATION", "KotlinConstantConditions") @SuppressLint("RestrictedApi") override fun onCreate(savedInstanceState: Bundle?) { diff --git a/app/src/main/kotlin/com/fox2code/mmm/ExpiredActivity.kt b/app/src/main/kotlin/com/fox2code/mmm/ExpiredActivity.kt index ec2951d..0c079cb 100644 --- a/app/src/main/kotlin/com/fox2code/mmm/ExpiredActivity.kt +++ b/app/src/main/kotlin/com/fox2code/mmm/ExpiredActivity.kt @@ -4,10 +4,10 @@ import android.annotation.SuppressLint import android.content.Intent import android.net.Uri import android.os.Bundle -import com.fox2code.foxcompat.app.FoxActivity +import androidx.appcompat.app.AppCompatActivity import com.google.android.material.button.MaterialButton -class ExpiredActivity : FoxActivity() { +class ExpiredActivity : AppCompatActivity() { @SuppressLint("RestrictedApi") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) diff --git a/app/src/main/kotlin/com/fox2code/mmm/MainActivity.kt b/app/src/main/kotlin/com/fox2code/mmm/MainActivity.kt index 712cf92..55fdddd 100644 --- a/app/src/main/kotlin/com/fox2code/mmm/MainActivity.kt +++ b/app/src/main/kotlin/com/fox2code/mmm/MainActivity.kt @@ -10,7 +10,6 @@ import android.annotation.SuppressLint import android.content.Context import android.content.DialogInterface import android.content.Intent -import android.content.res.Configuration import android.graphics.Color import android.graphics.Rect import android.os.Bundle @@ -27,6 +26,7 @@ import android.view.inputmethod.EditorInfo import android.view.inputmethod.InputMethodManager import android.widget.EditText import android.widget.Toast +import androidx.appcompat.app.AppCompatActivity import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsAnimationCompat import androidx.core.view.WindowInsetsCompat @@ -35,7 +35,6 @@ import androidx.recyclerview.widget.RecyclerView import androidx.room.Room import androidx.swiperefreshlayout.widget.SwipeRefreshLayout import androidx.swiperefreshlayout.widget.SwipeRefreshLayout.OnRefreshListener -import com.fox2code.foxcompat.app.FoxActivity import com.fox2code.foxcompat.view.FoxDisplay import com.fox2code.mmm.AppUpdateManager.Companion.appUpdateManager import com.fox2code.mmm.OverScrollManager.OverScrollHelper @@ -71,7 +70,7 @@ import timber.log.Timber import java.sql.Timestamp -class MainActivity : FoxActivity(), OnRefreshListener, OverScrollHelper { +class MainActivity : AppCompatActivity(), OnRefreshListener, OverScrollHelper { private lateinit var bottomNavigationView: BottomNavigationView val moduleViewListBuilder: ModuleViewListBuilder = ModuleViewListBuilder(this) val moduleViewListBuilderOnline: ModuleViewListBuilder = ModuleViewListBuilder(this) @@ -105,6 +104,8 @@ class MainActivity : FoxActivity(), OnRefreshListener, OverScrollHelper { } else { bottomNavigationView.selectedItemId = R.id.online_menu_item } + // rescan modules + instance!!.scanAsync() super.onResume() } @@ -183,8 +184,7 @@ class MainActivity : FoxActivity(), OnRefreshListener, OverScrollHelper { val view = findViewById(R.id.root_container) var startBottom = 0f var endBottom = 0f - ViewCompat.setWindowInsetsAnimationCallback( - view, + ViewCompat.setWindowInsetsAnimationCallback(view, object : WindowInsetsAnimationCompat.Callback(DISPATCH_MODE_STOP) { // Override methods… override fun onProgress( @@ -217,8 +217,7 @@ class MainActivity : FoxActivity(), OnRefreshListener, OverScrollHelper { startBottom = view.bottom.toFloat() Timber.d("IME animation prepare: %f", startBottom) } - } - ) + }) // set search view listeners for text edit. filter the appropriate list based on visibility. do the filtering as the user types not just on submit as a background task textInputEditText.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged( @@ -316,33 +315,32 @@ class MainActivity : FoxActivity(), OnRefreshListener, OverScrollHelper { // set on click listener for reboot fab rebootFab.setOnClickListener { // show reboot dialog with options to reboot, reboot to recovery, bootloader, or edl, and use RuntimeUtils to reboot - val rebootDialog = MaterialAlertDialogBuilder(this@MainActivity) - .setTitle(R.string.reboot) - .setItems( - arrayOf( - getString(R.string.reboot), - getString(R.string.reboot_recovery), - getString(R.string.reboot_bootloader), - getString(R.string.reboot_edl) - ) - ) { _: DialogInterface?, which: Int -> - when (which) { - 0 -> RuntimeUtils.reboot(this@MainActivity, RuntimeUtils.RebootMode.REBOOT) - 1 -> RuntimeUtils.reboot( - this@MainActivity, - RuntimeUtils.RebootMode.RECOVERY + val rebootDialog = + MaterialAlertDialogBuilder(this@MainActivity).setTitle(R.string.reboot).setItems( + arrayOf( + getString(R.string.reboot), + getString(R.string.reboot_recovery), + getString(R.string.reboot_bootloader), + getString(R.string.reboot_edl) ) + ) { _: DialogInterface?, which: Int -> + when (which) { + 0 -> RuntimeUtils.reboot( + this@MainActivity, + RuntimeUtils.RebootMode.REBOOT + ) - 2 -> RuntimeUtils.reboot( - this@MainActivity, - RuntimeUtils.RebootMode.BOOTLOADER - ) + 1 -> RuntimeUtils.reboot( + this@MainActivity, RuntimeUtils.RebootMode.RECOVERY + ) - 3 -> RuntimeUtils.reboot(this@MainActivity, RuntimeUtils.RebootMode.EDL) - } - } - .setNegativeButton(R.string.cancel, null) - .create() + 2 -> RuntimeUtils.reboot( + this@MainActivity, RuntimeUtils.RebootMode.BOOTLOADER + ) + + 3 -> RuntimeUtils.reboot(this@MainActivity, RuntimeUtils.RebootMode.EDL) + } + }.setNegativeButton(R.string.cancel, null).create() rebootDialog.show() } // get background color and elevation of reboot fab @@ -400,8 +398,6 @@ class MainActivity : FoxActivity(), OnRefreshListener, OverScrollHelper { textInputEditText.minimumHeight = FoxDisplay.dpToPixel(16f) textInputEditText.imeOptions = EditorInfo.IME_ACTION_SEARCH or EditorInfo.IME_FLAG_NO_FULLSCREEN - textInputEditText.isEnabled = false // Enabled later - this.updateScreenInsets(this.resources.configuration) // on the bottom nav, there's a settings item. open the settings activity when it's clicked. bottomNavigationView = findViewById(R.id.bottom_navigation) @@ -521,7 +517,6 @@ class MainActivity : FoxActivity(), OnRefreshListener, OverScrollHelper { progressIndicator.max = PRECISION } } - updateScreenInsets() // Fix an edge case val context: Context = this@MainActivity if (runtimeUtils!!.waitInitialSetupFinished(context, this@MainActivity)) { if (BuildConfig.DEBUG) Timber.d("waiting...") @@ -583,8 +578,6 @@ class MainActivity : FoxActivity(), OnRefreshListener, OverScrollHelper { runOnUiThread { progressIndicator.setProgressCompat(PRECISION, true) progressIndicator.visibility = View.GONE - textInputEditText.isEnabled = false - updateScreenInsets(resources.configuration) } return } @@ -613,8 +606,7 @@ class MainActivity : FoxActivity(), OnRefreshListener, OverScrollHelper { val currentTmp = current runOnUiThread { progressIndicator.setProgressCompat( - currentTmp / max, - true + currentTmp / max, true ) } } @@ -641,8 +633,6 @@ class MainActivity : FoxActivity(), OnRefreshListener, OverScrollHelper { runOnUiThread { progressIndicator.setProgressCompat(PRECISION, true) progressIndicator.visibility = View.GONE - textInputEditText.isEnabled = true - updateScreenInsets(resources.configuration) } maybeShowUpgrade() Timber.i("Finished app opening state!") @@ -662,27 +652,6 @@ class MainActivity : FoxActivity(), OnRefreshListener, OverScrollHelper { initMode = false } - fun updateScreenInsets() { - runOnUiThread { this.updateScreenInsets(this.resources.configuration) } - } - - private fun updateScreenInsets(configuration: Configuration) { - val landscape = configuration.orientation == Configuration.ORIENTATION_LANDSCAPE - val bottomInset = if (landscape) 0 else this.navigationBarHeight - val statusBarHeight = statusBarHeight + FoxDisplay.dpToPixel(2f) - swipeRefreshLayout!!.setProgressViewOffset( - false, - swipeRefreshLayoutOrigStartOffset + statusBarHeight, - swipeRefreshLayoutOrigEndOffset + statusBarHeight - ) - moduleViewListBuilder.setHeaderPx(statusBarHeight) - moduleViewListBuilderOnline.setHeaderPx(statusBarHeight) - moduleViewListBuilder.updateInsets() - //this.actionBarBlur.invalidate(); - overScrollInsetTop = statusBarHeight - overScrollInsetBottom = bottomInset - } - private fun updateBlurState() { if (MainApplication.isBlurEnabled) { // set bottom navigation bar color to transparent blur @@ -698,98 +667,6 @@ class MainActivity : FoxActivity(), OnRefreshListener, OverScrollHelper { } } - override fun refreshUI() { - super.refreshUI() - if (initMode) return - initMode = true - Timber.i("Item Before") - searchTextInputEditText!!.clearFocus() - searchTextInputEditText!!.text?.clear() - this.updateScreenInsets() - updateBlurState() - moduleViewListBuilder.setQuery(null) - Timber.i("Item After") - moduleViewListBuilder.refreshNotificationsUI(moduleViewAdapter!!) - tryGetMagiskPathAsync(object : InstallerInitializer.Callback { - override fun onPathReceived(path: String?) { - val context: Context = this@MainActivity - val mainActivity = this@MainActivity - runtimeUtils!!.checkShowInitialSetup(context, mainActivity) - // Wait for doSetupNow to finish - while (doSetupNowRunning) { - try { - Thread.sleep(100) - } catch (ignored: InterruptedException) { - Thread.currentThread().interrupt() - } - } - if (peekMagiskVersion() < Constants.MAGISK_VER_CODE_INSTALL_COMMAND) moduleViewListBuilder.addNotification( - NotificationType.MAGISK_OUTDATED - ) - if (!MainApplication.isShowcaseMode) moduleViewListBuilder.addNotification( - NotificationType.INSTALL_FROM_STORAGE - ) - instance!!.scan() - instance!!.runAfterScan { moduleViewListBuilder.appendInstalledModules() } - commonNext() - } - - override fun onFailure(error: Int) { - Timber.e("Error: %s", error) - moduleViewListBuilder.addNotification(errorNotification) - moduleViewListBuilderOnline.addNotification(errorNotification) - commonNext() - } - - fun commonNext() { - Timber.i("Common Before") - if (MainApplication.isShowcaseMode) moduleViewListBuilder.addNotification( - NotificationType.SHOWCASE_MODE - ) - NotificationType.NEED_CAPTCHA_ANDROIDACY.autoAdd(moduleViewListBuilderOnline) - NotificationType.NO_INTERNET.autoAdd(moduleViewListBuilderOnline) - if (appUpdateManager.checkUpdate(false)) moduleViewListBuilder.addNotification( - NotificationType.UPDATE_AVAILABLE - ) - RepoManager.getINSTANCE()!!.updateEnabledStates() - if (RepoManager.getINSTANCE()!!.customRepoManager!!.needUpdate()) { - runOnUiThread { - progressIndicator!!.isIndeterminate = false - progressIndicator!!.max = PRECISION - } - if (BuildConfig.DEBUG) Timber.i("Check Update") - val updateListener: SyncManager.UpdateListener = - object : SyncManager.UpdateListener { - override fun update(value: Int) { - runOnUiThread { - progressIndicator!!.setProgressCompat( - value, true - ) - } - } - } - RepoManager.getINSTANCE()!!.update(updateListener) - runOnUiThread { - progressIndicator!!.setProgressCompat(PRECISION, true) - progressIndicator!!.visibility = View.GONE - } - } - if (BuildConfig.DEBUG) Timber.i("Apply") - RepoManager.getINSTANCE() - ?.runAfterUpdate { moduleViewListBuilderOnline.appendRemoteModules() } - Timber.i("Common Before applyTo") - moduleViewListBuilder.applyTo(moduleList!!, moduleViewAdapter!!) - moduleViewListBuilderOnline.applyTo(moduleListOnline!!, moduleViewAdapterOnline!!) - Timber.i("Common After") - } - }) - initMode = false - } - - override fun onWindowUpdated() { - this.updateScreenInsets() - } - override fun onRefresh() { if (swipeRefreshBlocker > System.currentTimeMillis() || initMode || progressIndicator == null || progressIndicator!!.visibility == View.VISIBLE || doSetupNowRunning) { swipeRefreshLayout!!.isRefreshing = false @@ -819,6 +696,8 @@ class MainActivity : FoxActivity(), OnRefreshListener, OverScrollHelper { } } RepoManager.getINSTANCE()!!.update(updateListener) + // rescan modules + instance!!.scan() NotificationType.NEED_CAPTCHA_ANDROIDACY.autoAdd(moduleViewListBuilder) if (!NotificationType.NO_INTERNET.shouldRemove()) { moduleViewListBuilderOnline.addNotification(NotificationType.NO_INTERNET) @@ -846,8 +725,7 @@ class MainActivity : FoxActivity(), OnRefreshListener, OverScrollHelper { val currentTmp = current runOnUiThread { progressIndicator!!.setProgressCompat( - currentTmp / max, - true + currentTmp / max, true ) } } @@ -870,16 +748,6 @@ class MainActivity : FoxActivity(), OnRefreshListener, OverScrollHelper { }, "Repo update thread").start() } - override fun onConfigurationChanged(newConfig: Configuration) { - super.onConfigurationChanged(newConfig) - this.updateScreenInsets() - } - - override fun onWindowFocusChanged(hasFocus: Boolean) { - super.onWindowFocusChanged(hasFocus) - this.updateScreenInsets() - } - fun maybeShowUpgrade() { if (AndroidacyRepoData.instance.memberLevel == null) { // wait for up to 10 seconds for AndroidacyRepoData to be initialized @@ -946,22 +814,13 @@ class MainActivity : FoxActivity(), OnRefreshListener, OverScrollHelper { return super.dispatchTouchEvent(event) } - override fun setOnBackPressedCallback(onBackPressedCallback: OnBackPressedCallback?) { - // if is on online list, go back to installed list - if (moduleListOnline!!.visibility == View.VISIBLE) { - bottomNavigationView.selectedItemId = R.id.installed_menu_item - } else { - super.setOnBackPressedCallback(onBackPressedCallback) - } - } - companion object { - fun getFoxActivity(activity: FoxActivity): FoxActivity { + fun getAppCompatActivity(activity: AppCompatActivity): AppCompatActivity { return activity } - fun getFoxActivity(context: Context): FoxActivity { - return context as FoxActivity + fun getAppCompatActivity(context: Context): AppCompatActivity { + return context as AppCompatActivity } private const val PRECISION = 100 diff --git a/app/src/main/kotlin/com/fox2code/mmm/MainApplication.kt b/app/src/main/kotlin/com/fox2code/mmm/MainApplication.kt index 0ed3bbe..a4ccf5c 100644 --- a/app/src/main/kotlin/com/fox2code/mmm/MainApplication.kt +++ b/app/src/main/kotlin/com/fox2code/mmm/MainApplication.kt @@ -5,25 +5,28 @@ package com.fox2code.mmm import android.annotation.SuppressLint +import android.app.Activity import android.app.ActivityManager import android.app.ActivityManager.RunningAppProcessInfo +import android.app.Application +import android.app.Application.ActivityLifecycleCallbacks import android.content.Context import android.content.Intent import android.content.SharedPreferences import android.content.pm.PackageManager import android.content.res.Resources import android.os.Build +import android.os.Bundle import android.os.SystemClock import android.util.Log import androidx.annotation.StyleRes +import androidx.appcompat.app.AppCompatActivity import androidx.core.app.NotificationManagerCompat import androidx.emoji2.text.DefaultEmojiCompatConfig import androidx.emoji2.text.EmojiCompat import androidx.security.crypto.EncryptedSharedPreferences import androidx.security.crypto.MasterKey import androidx.work.Configuration -import com.fox2code.foxcompat.app.FoxActivity -import com.fox2code.foxcompat.app.FoxApplication import com.fox2code.foxcompat.app.internal.FoxProcessExt import com.fox2code.foxcompat.view.FoxThemeWrapper import com.fox2code.mmm.installer.InstallerInitializer @@ -58,29 +61,36 @@ import java.util.Random import kotlin.math.abs @Suppress("unused", "MemberVisibilityCanBePrivate") -class MainApplication : FoxApplication(), Configuration.Provider { +class MainApplication : Application(), Configuration.Provider, ActivityLifecycleCallbacks { var isTainted = false - @JvmField + var lastActivity: AppCompatActivity? = null + var modulesHaveUpdates = false - @JvmField var updateModuleCount = 0 - @JvmField var updateModules: List = ArrayList() @StyleRes private var managerThemeResId = R.style.Theme_MagiskModuleManager private var markwonThemeContext: FoxThemeWrapper? = null - @JvmField var markwon: Markwon? = null private var existingKey: CharArray? = null - @JvmField var tracker: Tracker? = null + get() { + if (field == null) { + field = TrackerBuilder.createDefault(BuildConfig.ANALYTICS_ENDPOINT, 1) + .build(Matomo.getInstance(this)) + val tracker = field!! + tracker.startNewSession() + tracker.dispatchInterval = 1000 + } + return field + } private var makingNewKey = false private var isCrashHandler = false @@ -124,7 +134,7 @@ class MainApplication : FoxApplication(), Configuration.Provider { return existingKey!! } - fun getMarkwon(): Markwon? { + fun reallyGetMarkwon(): Markwon? { if (isCrashHandler) return null if (markwon != null) return markwon var contextThemeWrapper = markwonThemeContext @@ -140,7 +150,7 @@ class MainApplication : FoxApplication(), Configuration.Provider { ) ) ).build() - return markwon.also { this.markwon = it } + return reallyGetMarkwon().also { this.markwon = it } } override fun getWorkManagerConfiguration(): Configuration { @@ -194,32 +204,23 @@ class MainApplication : FoxApplication(), Configuration.Provider { markwon = null } - @SuppressLint("NonConstantResourceId") - override fun isLightTheme(): Boolean { - return when (getSharedPreferences("mmm")!!.getString("pref_theme", "system")) { - "system" -> isSystemLightTheme - "dark", "black" -> false + val isLightTheme: Boolean + get() = when (managerThemeResId) { + R.style.Theme_MagiskModuleManager, + R.style.Theme_MagiskModuleManager_Monet, + R.style.Theme_MagiskModuleManager_Dark, + R.style.Theme_MagiskModuleManager_Monet_Dark, + R.style.Theme_MagiskModuleManager_Black, + R.style.Theme_MagiskModuleManager_Monet_Black -> false + else -> true } - } private val isSystemLightTheme: Boolean get() = (this.resources.configuration.uiMode and android.content.res.Configuration.UI_MODE_NIGHT_MASK) != android.content.res.Configuration.UI_MODE_NIGHT_YES val isDarkTheme: Boolean get() = !this.isLightTheme - @Synchronized - fun getTracker(): Tracker? { - if (tracker == null) { - tracker = TrackerBuilder.createDefault(BuildConfig.ANALYTICS_ENDPOINT, 1) - .build(Matomo.getInstance(this)) - val tracker = tracker!! - tracker.startNewSession() - tracker.dispatchInterval = 1000 - } - return tracker - } - override fun onCreate() { supportedLocales.addAll( listOf( @@ -251,6 +252,7 @@ class MainApplication : FoxApplication(), Configuration.Provider { if (INSTANCE == null) INSTANCE = this relPackageName = this.packageName super.onCreate() + registerActivityLifecycleCallbacks(this) initialize(this) // Initialize Timber configTimber() @@ -274,7 +276,6 @@ class MainApplication : FoxApplication(), Configuration.Provider { if (BuildConfig.DEBUG) Timber.d("AMM is running in debug mode") // analytics if (BuildConfig.DEBUG) Timber.d("Initializing matomo") - getTracker() if (!isMatomoAllowed()) { if (BuildConfig.DEBUG) Timber.d("Matomo is not allowed") tracker!!.isOptOut = true @@ -282,7 +283,7 @@ class MainApplication : FoxApplication(), Configuration.Provider { tracker!!.isOptOut = false } if (getSharedPreferences("matomo")!!.getBoolean("install_tracked", false)) { - TrackHelper.track().download().with(INSTANCE!!.getTracker()) + TrackHelper.track().download().with(INSTANCE!!.tracker) if (BuildConfig.DEBUG) Timber.d("Sent install event to matomo") getSharedPreferences("matomo")!!.edit().putBoolean("install_tracked", true).apply() } else { @@ -345,22 +346,12 @@ class MainApplication : FoxApplication(), Configuration.Provider { Timber.w("ANDROIDACY_CLIENT_ID is empty, disabling AndroidacyRepoData 1") editor.apply() } - getMarkwon() + reallyGetMarkwon() } private val intent: Intent? get() = this.packageManager.getLaunchIntentForPackage(this.packageName) - override fun onCreateFoxActivity(compatActivity: FoxActivity) { - super.onCreateFoxActivity(compatActivity) - compatActivity.setTheme(managerThemeResId) - } - - override fun onRefreshUI(compatActivity: FoxActivity) { - super.onRefreshUI(compatActivity) - compatActivity.setThemeRecreate(managerThemeResId) - } - override fun onConfigurationChanged(newConfig: android.content.res.Configuration) { val newTimeFormatLocale = newConfig.locales[0] if (timeFormatLocale !== newTimeFormatLocale) { @@ -503,7 +494,6 @@ class MainApplication : FoxApplication(), Configuration.Provider { private var relPackageName = BuildConfig.APPLICATION_ID @SuppressLint("StaticFieldLeak") - @JvmStatic var INSTANCE: MainApplication? = null private set get() { @@ -514,7 +504,6 @@ class MainApplication : FoxApplication(), Configuration.Provider { return field } - @JvmStatic var isFirstBoot = false private var mSharedPrefs: HashMap? = null var updateCheckBg: String? = null @@ -555,7 +544,6 @@ class MainApplication : FoxApplication(), Configuration.Provider { } @Suppress("NAME_SHADOWING") - @JvmStatic fun getSharedPreferences(name: String): SharedPreferences? { // encryptedSharedPreferences is used var name = name @@ -627,7 +615,6 @@ class MainApplication : FoxApplication(), Configuration.Provider { val isBlurEnabled: Boolean get() = getSharedPreferences("mmm")!!.getBoolean("pref_enable_blur", false) - @JvmStatic val isDeveloper: Boolean get() { return if (BuildConfig.DEBUG) true else getSharedPreferences("mmm")!!.getBoolean( @@ -645,7 +632,6 @@ class MainApplication : FoxApplication(), Configuration.Provider { "mmm" )!!.getBoolean("pref_use_magisk_install_command", false) && isDeveloper && !InstallerInitializer.isKsu - @JvmStatic val isBackgroundUpdateCheckEnabled: Boolean get() { if (updateCheckBg != null) { @@ -677,17 +663,14 @@ class MainApplication : FoxApplication(), Configuration.Provider { val bootSharedPreferences: SharedPreferences? get() = getSharedPreferences("mmm_boot") - @JvmStatic fun formatTime(timeStamp: Long): String { // new Date(x) also get the local timestamp for format return timeFormat.format(Date(timeStamp)) } - @JvmStatic val isNotificationPermissionGranted: Boolean get() = NotificationManagerCompat.from((INSTANCE)!!).areNotificationsEnabled() - @JvmStatic fun isMatomoAllowed(): Boolean { return getSharedPreferences("mmm")!!.getBoolean( "pref_analytics_enabled", @@ -695,4 +678,29 @@ class MainApplication : FoxApplication(), Configuration.Provider { ) } } + + override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) { + lastActivity = activity as AppCompatActivity + activity.setTheme(managerThemeResId) + } + + override fun onActivityStarted(activity: Activity) { + } + + override fun onActivityResumed(activity: Activity) { + lastActivity = activity as AppCompatActivity + activity.setTheme(managerThemeResId) + } + + override fun onActivityPaused(activity: Activity) { + } + + override fun onActivityStopped(activity: Activity) { + } + + override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) { + } + + override fun onActivityDestroyed(activity: Activity) { + } } diff --git a/app/src/main/kotlin/com/fox2code/mmm/NotificationType.kt b/app/src/main/kotlin/com/fox2code/mmm/NotificationType.kt index a0fc141..e892d49 100644 --- a/app/src/main/kotlin/com/fox2code/mmm/NotificationType.kt +++ b/app/src/main/kotlin/com/fox2code/mmm/NotificationType.kt @@ -5,9 +5,7 @@ @file:Suppress( "KotlinConstantConditions", "UNINITIALIZED_ENUM_COMPANION_WARNING", - "ktConcatNullable", - "BlockingMethodInNonBlockingContext", - "UnusedEquals" + "ktConcatNullable" ) package com.fox2code.mmm @@ -19,7 +17,6 @@ import android.widget.Toast import androidx.annotation.AttrRes import androidx.annotation.DrawableRes import androidx.annotation.StringRes -import com.fox2code.foxcompat.app.FoxActivity import com.fox2code.mmm.installer.InstallerInitializer import com.fox2code.mmm.module.ModuleViewListBuilder import com.fox2code.mmm.repo.RepoManager @@ -38,13 +35,14 @@ import java.util.Date import java.util.zip.ZipFile +@Suppress("SameParameterValue") enum class NotificationType( @field:StringRes @param:StringRes @JvmField val textId: Int, @field:DrawableRes @JvmField val iconId: Int, @field:AttrRes @JvmField val backgroundAttr: Int = androidx.appcompat.R.attr.colorError, @field:AttrRes @JvmField val foregroundAttr: Int = com.google.android.material.R.attr.colorOnPrimary, - @JvmField val onClickListener: View.OnClickListener? = null, - @JvmField var special: Boolean = false + val onClickListener: View.OnClickListener? = null, + var special: Boolean = false ) : NotificationTypeCst { @JvmStatic @@ -171,8 +169,7 @@ enum class NotificationType( v.context, 0, Intent( - v.context, - UpdateActivity::class.java + v.context, UpdateActivity::class.java ).setAction(UpdateActivity.ACTIONS.DOWNLOAD.toString()), android.app.PendingIntent.FLAG_UPDATE_CURRENT ) @@ -196,16 +193,16 @@ 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) { + if (MainApplication.getSharedPreferences("mmm") + ?.getBoolean("pref_require_security", false) == true + ) { // block local install for safety - MaterialAlertDialogBuilder(v!!.context) - .setTitle(R.string.install_from_storage) + MaterialAlertDialogBuilder(v!!.context).setTitle(R.string.install_from_storage) .setMessage(R.string.install_from_storage_safe_modules) - .setPositiveButton(android.R.string.ok, null) - .show() + .setPositiveButton(android.R.string.ok, null).show() return@OnClickListener } - val compatActivity = FoxActivity.getFoxActivity(v) + val compatActivity = MainApplication.INSTANCE!!.lastActivity!! val module = File( compatActivity.cacheDir, "installer" + File.separator + "module.zip" ) @@ -327,4 +324,4 @@ enum class NotificationType( return false } } -} \ No newline at end of file +} diff --git a/app/src/main/kotlin/com/fox2code/mmm/SetupActivity.kt b/app/src/main/kotlin/com/fox2code/mmm/SetupActivity.kt index 7047432..c884cf8 100644 --- a/app/src/main/kotlin/com/fox2code/mmm/SetupActivity.kt +++ b/app/src/main/kotlin/com/fox2code/mmm/SetupActivity.kt @@ -18,9 +18,9 @@ import android.view.View import android.webkit.CookieManager import android.widget.CompoundButton import android.widget.Toast +import androidx.appcompat.app.AppCompatActivity import androidx.fragment.app.FragmentActivity import androidx.room.Room -import com.fox2code.foxcompat.app.FoxActivity import com.fox2code.mmm.databinding.ActivitySetupBinding import com.fox2code.mmm.repo.RepoManager import com.fox2code.mmm.utils.IntentHelper @@ -43,7 +43,7 @@ import java.io.IOException import java.sql.Timestamp import java.util.Objects -class SetupActivity : FoxActivity(), LanguageActivity { +class SetupActivity : AppCompatActivity(), LanguageActivity { private var cachedTheme = 0 @SuppressLint("ApplySharedPref", "RestrictedApi") diff --git a/app/src/main/kotlin/com/fox2code/mmm/UpdateActivity.kt b/app/src/main/kotlin/com/fox2code/mmm/UpdateActivity.kt index a8e07f3..a7666d2 100644 --- a/app/src/main/kotlin/com/fox2code/mmm/UpdateActivity.kt +++ b/app/src/main/kotlin/com/fox2code/mmm/UpdateActivity.kt @@ -13,11 +13,11 @@ import android.webkit.CookieManager import android.webkit.WebSettings import android.webkit.WebView import android.widget.Toast +import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.content.res.AppCompatResources import androidx.core.content.FileProvider import androidx.webkit.WebSettingsCompat import androidx.webkit.WebViewFeature -import com.fox2code.foxcompat.app.FoxActivity import com.fox2code.mmm.androidacy.AndroidacyRepoData import com.fox2code.mmm.utils.io.net.Http import com.google.android.material.bottomnavigation.BottomNavigationItemView @@ -34,7 +34,7 @@ import java.io.IOException import java.sql.Timestamp import java.util.Objects -class UpdateActivity : FoxActivity() { +class UpdateActivity : AppCompatActivity() { private var chgWv: WebView? = null private var url: String = String() @@ -234,7 +234,7 @@ class UpdateActivity : FoxActivity() { updateCancel.setOnClickListener { _: View? -> // end any download updateThread.interrupt() - forceBackPressed() + finish() finish() } updateThread.start() diff --git a/app/src/main/kotlin/com/fox2code/mmm/XHooks.kt b/app/src/main/kotlin/com/fox2code/mmm/XHooks.kt index 79b237d..9023239 100644 --- a/app/src/main/kotlin/com/fox2code/mmm/XHooks.kt +++ b/app/src/main/kotlin/com/fox2code/mmm/XHooks.kt @@ -17,30 +17,26 @@ import com.fox2code.mmm.repo.RepoManager * It will not be obfuscated on release builds */ @Suppress("UNUSED_PARAMETER") +@Deprecated("This class is deprecated and will be removed in the future") @Keep enum class XHooks { ; companion object { - @JvmStatic @Keep fun onRepoManagerInitialize() { // Call addXRepo here if you are an XPosed module } - @JvmStatic @Keep fun onRepoManagerInitialized() { } - @JvmStatic @Keep fun isModuleActive(moduleId: String?): Boolean { return ModuleManager.isModuleActive(moduleId!!) } - @Suppress("DEPRECATION") - @JvmStatic @Keep @Throws(PackageManager.NameNotFoundException::class) fun checkConfigTargetExists(context: Context, packageName: String, config: String) { @@ -51,13 +47,11 @@ enum class XHooks { } @Suppress("UNUSED_PARAMETER") - @JvmStatic @Keep fun getConfigIntent(context: Context, packageName: String?, config: String?): Intent? { return context.packageManager.getLaunchIntentForPackage(packageName!!) } - @JvmStatic @Keep fun onWebViewInitialize(webView: WebView?, allowInstall: Boolean) { if (webView == null) throw NullPointerException("WebView is null!") diff --git a/app/src/main/kotlin/com/fox2code/mmm/androidacy/AndroidacyActivity.kt b/app/src/main/kotlin/com/fox2code/mmm/androidacy/AndroidacyActivity.kt index 4e14b9a..638379c 100644 --- a/app/src/main/kotlin/com/fox2code/mmm/androidacy/AndroidacyActivity.kt +++ b/app/src/main/kotlin/com/fox2code/mmm/androidacy/AndroidacyActivity.kt @@ -7,13 +7,11 @@ package com.fox2code.mmm.androidacy import android.annotation.SuppressLint -import android.content.Intent import android.content.pm.PackageManager import android.graphics.Bitmap import android.net.Uri import android.net.http.SslError import android.os.Bundle -import android.view.MenuItem import android.view.View import android.webkit.ConsoleMessage import android.webkit.ConsoleMessage.MessageLevel @@ -28,13 +26,13 @@ import android.webkit.WebSettings import android.webkit.WebView import android.widget.TextView import android.widget.Toast +import androidx.appcompat.app.AppCompatActivity import androidx.core.content.FileProvider import androidx.swiperefreshlayout.widget.SwipeRefreshLayout import androidx.webkit.WebResourceErrorCompat import androidx.webkit.WebSettingsCompat import androidx.webkit.WebViewClientCompat import androidx.webkit.WebViewFeature -import com.fox2code.foxcompat.app.FoxActivity import com.fox2code.mmm.BuildConfig import com.fox2code.mmm.Constants import com.fox2code.mmm.MainApplication @@ -58,16 +56,14 @@ import java.io.IOException /** * Per Androidacy repo implementation agreement, no request of this WebView shall be modified. */ -class AndroidacyActivity : FoxActivity() { +class AndroidacyActivity : AppCompatActivity() { private var moduleFile: File? = null - @JvmField var webView: WebView? = null var webViewNote: TextView? = null private var androidacyWebAPI: AndroidacyWebAPI? = null var progressIndicator: LinearProgressIndicator? = null - @JvmField var backOnResume = false var downloadMode = false @@ -86,22 +82,21 @@ class AndroidacyActivity : FoxActivity() { @Suppress("KotlinConstantConditions") if (!MainApplication.checkSecret(intent) || intent.data.also { uri = it!! } == null) { Timber.w("Impersonation detected") - forceBackPressed() + finish() return } var url = uri.toString() if (!AndroidacyUtil.isAndroidacyLink(url, uri!!)) { Timber.w("Calling non androidacy link in secure WebView: %s", url) - forceBackPressed() + finish() return } if (!hasWebView()) { Timber.w("No WebView found to load url: %s", url) - forceBackPressed() + finish() return } // if action bar is shown, hide it - hideActionBar() markCaptchaAndroidacySolved() if (!url.contains(AndroidacyUtil.REFERRER)) { url = if (url.lastIndexOf('/') < url.lastIndexOf('?')) { @@ -135,22 +130,14 @@ class AndroidacyActivity : FoxActivity() { val config = intent.getStringExtra(Constants.EXTRA_ANDROIDACY_ACTIONBAR_CONFIG) val compatLevel = intent.getIntExtra(Constants.EXTRA_ANDROIDACY_COMPAT_LEVEL, 0) this.setContentView(R.layout.webview) - setActionBarBackground(null) - setDisplayHomeAsUpEnabled(true) if (title.isNullOrEmpty()) { title = "Androidacy" } - if (allowInstall || title.isEmpty()) { - hideActionBar() - } else { // Only used for note section + if (!allowInstall && title.isNotEmpty()) { if (!config.isNullOrEmpty()) { val configPkg = IntentHelper.getPackageOfConfig(config) try { checkConfigTargetExists(this, configPkg, config) - this.setActionBarExtraMenuButton(R.drawable.ic_baseline_app_settings_alt_24) { _: MenuItem? -> - IntentHelper.openConfig(this, config) - true - } } catch (ignored: PackageManager.NameNotFoundException) { } } @@ -243,9 +230,9 @@ class AndroidacyActivity : FoxActivity() { ) { Toast.makeText(this@AndroidacyActivity, "Too many requests!", Toast.LENGTH_LONG) .show() - runOnUiThread { forceBackPressed() } + runOnUiThread { finish() } } else if (url == pageUrl) { - postOnUiThread { webViewNote!!.visibility = View.VISIBLE } + runOnUiThread { webViewNote!!.visibility = View.VISIBLE } } } @@ -291,10 +278,18 @@ class AndroidacyActivity : FoxActivity() { filePathCallback: ValueCallback>, fileChooserParams: FileChooserParams ): Boolean { - getFoxActivity(webView).startActivityForResult(fileChooserParams.createIntent()) { code: Int, data: Intent? -> - filePathCallback.onReceiveValue( - FileChooserParams.parseResult(code, data) - ) + // start file chooser activity + val intent1 = fileChooserParams.createIntent() + try { + @Suppress("DEPRECATION") + startActivityForResult(intent1, 1) + } catch (e: Exception) { + Timber.e(e) + Toast.makeText( + this@AndroidacyActivity, + R.string.file_picker_failure, + Toast.LENGTH_SHORT + ).show() } return true } @@ -355,7 +350,7 @@ class AndroidacyActivity : FoxActivity() { } else if (moduleId != null) { // Download module Timber.i("megaIntercept failure. Forcing onBackPress") - forceBackPressed() + finish() } } androidacyWebAPI.consumedAction = true @@ -388,7 +383,7 @@ class AndroidacyActivity : FoxActivity() { super.onResume() if (backOnResume) { backOnResume = false - forceBackPressed() + finish() } else if (androidacyWebAPI != null) { androidacyWebAPI!!.consumedAction = false } diff --git a/app/src/main/kotlin/com/fox2code/mmm/androidacy/AndroidacyRepoData.kt b/app/src/main/kotlin/com/fox2code/mmm/androidacy/AndroidacyRepoData.kt index e3768dc..147b2d5 100644 --- a/app/src/main/kotlin/com/fox2code/mmm/androidacy/AndroidacyRepoData.kt +++ b/app/src/main/kotlin/com/fox2code/mmm/androidacy/AndroidacyRepoData.kt @@ -50,11 +50,13 @@ class AndroidacyRepoData(cacheRoot: File?, testMode: Boolean) : RepoData( private val clientID = BuildConfig.ANDROIDACY_CLIENT_ID private val testMode: Boolean private val host: String + override var url: String = "https://production-api.androidacy.com/magisk/repo" + get() { + return if (token == null) field else field + "?token=" + token + "&v=" + BuildConfig.VERSION_CODE + "&c=" + BuildConfig.VERSION_NAME + "&device_id=" + generateDeviceId() + "&client_id=" + BuildConfig.ANDROIDACY_CLIENT_ID + } - @JvmField var userInfo = arrayOf(arrayOf("role", null), arrayOf("permissions", null)) - @JvmField var memberLevel: String? = null // Avoid spamming requests to Androidacy @@ -102,7 +104,7 @@ class AndroidacyRepoData(cacheRoot: File?, testMode: Boolean) : RepoData( val handler = Handler(Looper.getMainLooper()) handler.post { Toast.makeText( - INSTANCE, + INSTANCE!!.lastActivity, INSTANCE!!.getString(R.string.androidacy_api_error, e.errorCode), Toast.LENGTH_LONG ).show() @@ -118,7 +120,12 @@ class AndroidacyRepoData(cacheRoot: File?, testMode: Boolean) : RepoData( val editor = getSharedPreferences("androidacy")!!.edit() editor.remove("pref_androidacy_api_token") editor.apply() - false + requestNewToken() + isValidToken( + getSharedPreferences("androidacy")!!.getString( + "pref_androidacy_api_token", + null + )) } } @@ -234,7 +241,7 @@ class AndroidacyRepoData(cacheRoot: File?, testMode: Boolean) : RepoData( val handler = Handler(mainLooper) handler.post { Toast.makeText( - INSTANCE, + INSTANCE!!.lastActivity, R.string.androidacy_failed_to_validate_token, Toast.LENGTH_LONG ).show() @@ -408,10 +415,6 @@ class AndroidacyRepoData(cacheRoot: File?, testMode: Boolean) : RepoData( return false } - override fun getUrl(): String { - return if (token == null) url else url + "?token=" + token + "&v=" + BuildConfig.VERSION_CODE + "&c=" + BuildConfig.VERSION_NAME + "&device_id=" + generateDeviceId() + "&client_id=" + BuildConfig.ANDROIDACY_CLIENT_ID - } - @Suppress("NAME_SHADOWING") private fun injectToken(url: String?): String? { // Do not inject token for non Androidacy urls @@ -471,7 +474,6 @@ class AndroidacyRepoData(cacheRoot: File?, testMode: Boolean) : RepoData( OK_HTTP_URL_BUILDER.build() } - @JvmStatic val instance: AndroidacyRepoData get() = RepoManager.getINSTANCE()!!.androidacyRepoData!! diff --git a/app/src/main/kotlin/com/fox2code/mmm/androidacy/AndroidacyUtil.kt b/app/src/main/kotlin/com/fox2code/mmm/androidacy/AndroidacyUtil.kt index 57c5960..adce843 100644 --- a/app/src/main/kotlin/com/fox2code/mmm/androidacy/AndroidacyUtil.kt +++ b/app/src/main/kotlin/com/fox2code/mmm/androidacy/AndroidacyUtil.kt @@ -11,6 +11,7 @@ import com.fox2code.mmm.BuildConfig import com.fox2code.mmm.utils.io.net.Http.Companion.doHttpGet import java.io.IOException +@Suppress("MemberVisibilityCanBePrivate", "MemberVisibilityCanBePrivate") enum class AndroidacyUtil { ; @@ -31,7 +32,6 @@ enum class AndroidacyUtil { .endsWith("api.androidacy.com") && uri.host?.endsWith("api.androidacy.com") ?: false } - @JvmStatic fun isAndroidacyFileUrl(url: String?): Boolean { if (url == null) return false for (prefix in arrayOf( @@ -46,7 +46,6 @@ enum class AndroidacyUtil { // Avoid logging token @Suppress("NAME_SHADOWING") - @JvmStatic fun hideToken(url: String): String { // for token, device_id, and client_id, replace with by using replaceAll to match until the next non-alphanumeric character or end // Also, URL decode @@ -61,7 +60,6 @@ enum class AndroidacyUtil { return url } - @JvmStatic fun getModuleId(moduleUrl: String): String? { // Get the &module= part val i = moduleUrl.indexOf("&module=") @@ -84,7 +82,6 @@ enum class AndroidacyUtil { return null } - @JvmStatic fun getModuleTitle(moduleUrl: String): String? { // Get the &title= part val i = moduleUrl.indexOf("&moduleTitle=") @@ -139,5 +136,13 @@ enum class AndroidacyUtil { } return String(md) } + + fun getMarkdownForModule(moduleId: String): String? { + try { + return getMarkdownFromAPI("https://production-api.androidacy.com/magisk/$moduleId/markdown") + } catch (ignored: IOException) { + } + return null + } } } \ No newline at end of file diff --git a/app/src/main/kotlin/com/fox2code/mmm/androidacy/AndroidacyWebAPI.kt b/app/src/main/kotlin/com/fox2code/mmm/androidacy/AndroidacyWebAPI.kt index c952966..8c5ebb2 100644 --- a/app/src/main/kotlin/com/fox2code/mmm/androidacy/AndroidacyWebAPI.kt +++ b/app/src/main/kotlin/com/fox2code/mmm/androidacy/AndroidacyWebAPI.kt @@ -45,6 +45,7 @@ import java.io.IOException import java.nio.charset.StandardCharsets import java.util.Objects +@Suppress("SameReturnValue") @Keep class AndroidacyWebAPI( private val activity: AndroidacyActivity, @@ -62,7 +63,7 @@ class AndroidacyWebAPI( var notifiedCompatMode = 0 fun forceQuitRaw(error: String?) { Toast.makeText(activity, error, Toast.LENGTH_LONG).show() - activity.runOnUiThread { activity.forceBackPressed() } + activity.runOnUiThread { activity.finish() } activity.backOnResume = true // Set backOnResume just in case downloadMode = false } @@ -197,7 +198,7 @@ class AndroidacyWebAPI( // Allow forceQuit and cancel in downloadMode if (consumedAction && !downloadMode) return consumedAction = true - activity.runOnUiThread { activity.forceBackPressed() } + activity.runOnUiThread { activity.finish() } } /** @@ -374,7 +375,6 @@ class AndroidacyWebAPI( if (consumedAction) return consumedAction = true activity.runOnUiThread { - activity.hideActionBar() consumedAction = false } } @@ -388,7 +388,6 @@ class AndroidacyWebAPI( if (consumedAction) return consumedAction = true activity.runOnUiThread { - activity.showActionBar() if (!title.isNullOrEmpty()) { activity.title = title } @@ -479,7 +478,7 @@ class AndroidacyWebAPI( */ @get:JavascriptInterface val navigationBarHeight: Int - get() = activity.navigationBarHeight + get() = 48 /** * Return current theme accent color @@ -497,13 +496,6 @@ class AndroidacyWebAPI( return typedValue.data } - /** - * Return current theme foreground color - */ - @get:JavascriptInterface - val foregroundColor: Int - get() = if (activity.isLightTheme) Color.BLACK else Color.WHITE - /** * Return current theme background color */ 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 d6030da..d0c3dfc 100644 --- a/app/src/main/kotlin/com/fox2code/mmm/background/BackgroundUpdateChecker.kt +++ b/app/src/main/kotlin/com/fox2code/mmm/background/BackgroundUpdateChecker.kt @@ -315,7 +315,6 @@ class BackgroundUpdateChecker(context: Context, workerParams: WorkerParameters) ).apply() } - @JvmStatic fun postNotification( context: Context, updateable: HashMap, @@ -376,7 +375,6 @@ class BackgroundUpdateChecker(context: Context, workerParams: WorkerParameters) NotificationManagerCompat.from(context).notify(NOTIFICATION_ID, builder.build()) } - @JvmStatic fun onMainActivityCreate(context: Context) { // Refuse to run if first_launch pref is not false if (MainApplication.getSharedPreferences("mmm")!! @@ -433,7 +431,6 @@ class BackgroundUpdateChecker(context: Context, workerParams: WorkerParameters) ) } - @JvmStatic fun onMainActivityResume(context: Context?) { NotificationManagerCompat.from(context!!).cancel(NOTIFICATION_ID) } diff --git a/app/src/main/kotlin/com/fox2code/mmm/installer/InstallerActivity.kt b/app/src/main/kotlin/com/fox2code/mmm/installer/InstallerActivity.kt index a5c27c7..dedcfca 100644 --- a/app/src/main/kotlin/com/fox2code/mmm/installer/InstallerActivity.kt +++ b/app/src/main/kotlin/com/fox2code/mmm/installer/InstallerActivity.kt @@ -7,6 +7,7 @@ package com.fox2code.mmm.installer import android.annotation.SuppressLint +import android.content.ComponentName import android.content.DialogInterface import android.content.Intent import android.content.pm.PackageManager @@ -17,25 +18,21 @@ import android.os.Bundle import android.os.PowerManager import android.os.PowerManager.WakeLock import android.view.KeyEvent -import android.view.MenuItem import android.view.View import android.view.WindowManager import android.widget.Toast import androidx.annotation.Keep +import androidx.appcompat.app.AppCompatActivity import androidx.recyclerview.widget.RecyclerView import com.fox2code.androidansi.AnsiConstants import com.fox2code.androidansi.AnsiParser -import com.fox2code.foxcompat.app.FoxActivity -import com.fox2code.foxcompat.app.FoxActivity.OnBackPressedCallback import com.fox2code.mmm.AppUpdateManager import com.fox2code.mmm.BuildConfig import com.fox2code.mmm.Constants -import com.fox2code.mmm.MainActivity import com.fox2code.mmm.MainApplication import com.fox2code.mmm.R import com.fox2code.mmm.XHooks import com.fox2code.mmm.androidacy.AndroidacyUtil -import com.fox2code.mmm.module.ActionButtonType import com.fox2code.mmm.utils.FastException import com.fox2code.mmm.utils.IntentHelper import com.fox2code.mmm.utils.RuntimeUtils @@ -52,6 +49,7 @@ import com.fox2code.mmm.utils.io.net.Http import com.fox2code.mmm.utils.sentry.SentryBreadcrumb import com.fox2code.mmm.utils.sentry.SentryMain import com.google.android.material.bottomnavigation.BottomNavigationItemView +import com.google.android.material.bottomnavigation.BottomNavigationView import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.progressindicator.LinearProgressIndicator import com.topjohnwu.superuser.CallbackList @@ -70,7 +68,10 @@ import java.util.Enumeration import java.util.concurrent.Executor import java.util.zip.ZipEntry -class InstallerActivity : FoxActivity() { +class InstallerActivity : AppCompatActivity() { + private var canGoBack: Boolean = false + private val isLightTheme: Boolean + get() = MainApplication.INSTANCE!!.isLightTheme private var progressIndicator: LinearProgressIndicator? = null private var rebootFloatingButton: BottomNavigationItemView? = null private var cancelFloatingButton: BottomNavigationItemView? = null @@ -89,12 +90,6 @@ class InstallerActivity : FoxActivity() { if (!moduleCache!!.exists() && !moduleCache!!.mkdirs()) Timber.e("Failed to mkdir module cache dir!") super.onCreate(savedInstanceState) TrackHelper.track().screen(this).with(MainApplication.INSTANCE!!.tracker) - setDisplayHomeAsUpEnabled(true) - setActionBarBackground(null) - setOnBackPressedCallback { _: FoxActivity? -> - canceled = true - false - } val intent = this.intent val target: String val name: String? @@ -106,7 +101,7 @@ class InstallerActivity : FoxActivity() { if (Constants.INTENT_INSTALL_INTERNAL == intent.action) { if (!MainApplication.checkSecret(intent)) { Timber.e("Security check failed!") - forceBackPressed() + finish() return } // ensure the intent is from our app, and is either a url or within our directory. replace all instances of .. and url encoded .. and remove whitespace @@ -117,7 +112,7 @@ class InstallerActivity : FoxActivity() { "https://" ) ) { - forceBackPressed() + finish() return } name = intent.getStringExtra(Constants.EXTRA_INSTALL_NAME) @@ -133,7 +128,7 @@ class InstallerActivity : FoxActivity() { ) } else { Toast.makeText(this, "Unknown intent!", Toast.LENGTH_SHORT).show() - forceBackPressed() + finish() return } // Note: Sentry only send this info on crash. @@ -188,8 +183,7 @@ class InstallerActivity : FoxActivity() { wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Fox:Installer") prgInd?.visibility = View.VISIBLE if (urlMode) installerTerminal!!.addLine("- Downloading $name") - TrackHelper.track().event("installer_start", name) - .with(MainApplication.INSTANCE!!.tracker) + TrackHelper.track().event("installer_start", name).with(MainApplication.INSTANCE!!.tracker) Thread(Runnable { // ensure module cache is is in our cache dir @@ -290,9 +284,7 @@ class InstallerActivity : FoxActivity() { } if (!isModule && !isAnyKernel3 && !isInstallZipModule) { setInstallStateFinished( - false, - "! File is not a valid Magisk module or AnyKernel3 zip", - "" + false, "! File is not a valid Magisk module or AnyKernel3 zip", "" ) return@Runnable } @@ -325,29 +317,23 @@ class InstallerActivity : FoxActivity() { if ("Failed to install module zip" == errMessage) throw e // Ignore if in installation state. Timber.e(e) setInstallStateFinished( - false, - "! Module is too large to be loaded on this device", - "" + false, "! Module is too large to be loaded on this device", "" ) } }, "Module install Thread").start() } + @SuppressLint("RestrictedApi") @Suppress("KotlinConstantConditions") @Keep private fun doInstall(file: File?, noExtensions: Boolean, rootless: Boolean) { @Suppress("NAME_SHADOWING") var noExtensions = noExtensions if (canceled) return - UiThreadHandler.runAndWait { - this.onBackPressedCallback = DISABLE_BACK_BUTTON - setDisplayHomeAsUpEnabled(false) - } + // disable back + runOnUiThread { cancelFloatingButton!!.isEnabled = false } Timber.i("Installing: %s", moduleCache!!.name) val installerController = InstallerController( - progressIndicator, - installerTerminal, - file!!.absoluteFile, - noExtensions + progressIndicator, installerTerminal, file!!.absoluteFile, noExtensions ) val installerMonitor: InstallerMonitor val installJob: Shell.Job @@ -364,13 +350,11 @@ class InstallerActivity : FoxActivity() { if (zipEntry != null) { FileOutputStream( File( - file.parentFile, - "customize.sh" + file.parentFile, "customize.sh" ) ).use { fileOutputStream -> copy( - zipFile.getInputStream(zipEntry), - fileOutputStream + zipFile.getInputStream(zipEntry), fileOutputStream ) } } @@ -482,9 +466,7 @@ class InstallerActivity : FoxActivity() { installExecutable = extractInstallScript("anykernel3_installer.sh") if (installExecutable == null) { setInstallStateFinished( - false, - "! Failed to extract AnyKernel3 install script", - "" + false, "! Failed to extract AnyKernel3 install script", "" ) return } @@ -496,9 +478,7 @@ class InstallerActivity : FoxActivity() { installExecutable = extractInstallScript("module_installer_wrapper.sh") if (installExecutable == null) { setInstallStateFinished( - false, - "! Failed to extract Magisk module wrapper script", - "" + false, "! Failed to extract Magisk module wrapper script", "" ) return } @@ -513,9 +493,7 @@ class InstallerActivity : FoxActivity() { installExecutable = extractInstallScript("module_installer_compat.sh") if (installExecutable == null) { setInstallStateFinished( - false, - "! Failed to extract Magisk module install script", - "" + false, "! Failed to extract Magisk module install script", "" ) return } @@ -523,9 +501,7 @@ class InstallerActivity : FoxActivity() { ashExec + " \"" + installExecutable.absolutePath + "\"" + " 3 1 \"" + file.absolutePath + "\"" } else { setInstallStateFinished( - false, - "! Zip file is not a valid Magisk module or AnyKernel3 zip!", - "" + false, "! Zip file is not a valid Magisk module or AnyKernel3 zip!", "" ) return } @@ -565,8 +541,7 @@ class InstallerActivity : FoxActivity() { breadcrumb.setData("noExtensions", if (noExtensions) "true" else "false") breadcrumb.setData("magiskCmdLine", if (magiskCmdLine) "true" else "false") breadcrumb.setData( - "ansi", - if (installerTerminal!!.isAnsiEnabled) "enabled" else "disabled" + "ansi", if (installerTerminal!!.isAnsiEnabled) "enabled" else "disabled" ) breadcrumb.setCategory("app.action.install") SentryMain.addSentryBreadcrumb(breadcrumb) @@ -632,20 +607,14 @@ class InstallerActivity : FoxActivity() { wakeLock = null } // Set the back press to finish the activity and return to the main activity - this.onBackPressedCallback = OnBackPressedCallback { _: FoxActivity? -> - finishAndRemoveTask() - startActivity(Intent(this, MainActivity::class.java)) - true - } - setDisplayHomeAsUpEnabled(true) + cancelFloatingButton!!.isEnabled = true + canGoBack = true progressIndicator!!.visibility = View.GONE rebootFloatingButton!!.setOnClickListener { _: View? -> if (MainApplication.shouldPreventReboot()) { // toast and do nothing Toast.makeText( - this, - R.string.install_terminal_reboot_prevented, - Toast.LENGTH_SHORT + this, R.string.install_terminal_reboot_prevented, Toast.LENGTH_SHORT ).show() } else { val builder = MaterialAlertDialogBuilder(this) @@ -663,13 +632,14 @@ class InstallerActivity : FoxActivity() { rebootFloatingButton!!.isEnabled = true cancelFloatingButton!!.isEnabled = true // handle back button - cancelFloatingButton!!.setOnClickListener { _: View? -> forceBackPressed() } + cancelFloatingButton!!.setOnClickListener { _: View? -> finish() } if (!message.isNullOrEmpty()) installerTerminal!!.addLine(message) if (!optionalLink.isNullOrEmpty()) { - this.setActionBarExtraMenuButton(ActionButtonType.supportIconForUrl(optionalLink)) { _: MenuItem? -> - IntentHelper.openUrl(this, optionalLink) - true - } + installerTerminal!!.addLine( + String.format( + this.getString(R.string.install_terminal_support_link), optionalLink + ) + ) } else if (success) { val intent = this.intent val config = @@ -678,16 +648,34 @@ class InstallerActivity : FoxActivity() { val configPkg = IntentHelper.getPackageOfConfig(config) try { XHooks.checkConfigTargetExists(this, configPkg, config) - this.setActionBarExtraMenuButton(R.drawable.ic_baseline_app_settings_alt_24) { _: MenuItem? -> - IntentHelper.openConfig(this, config) + val configIntent = Intent() + configIntent.component = ComponentName(configPkg, config) + configIntent.putExtra(Constants.EXTRA_INSTALL_NAME, this.packageName) + configIntent.putExtra(Constants.EXTRA_INSTALL_PATH, this.packageCodePath) + // set menuitem install_terminal_config on bottomnavigationview to launch + // config activity + val bottomNavigationView = + findViewById(R.id.bottom_navigation) + bottomNavigationView.menu.findItem(R.id.install_terminal_config).isVisible = true + bottomNavigationView.setOnItemSelectedListener { item -> + when (item.itemId) { + // config is at position 3 + R.id.install_terminal_config -> { + startActivity(configIntent) + true + } + + else -> { + false + } + } } } catch (e: PackageManager.NameNotFoundException) { Timber.w("Config package \"$configPkg\" missing for installer view") installerTerminal!!.addLine( String.format( - this.getString(R.string.install_terminal_config_missing), - configPkg + this.getString(R.string.install_terminal_config_missing), configPkg ) ) } @@ -805,8 +793,7 @@ class InstallerActivity : FoxActivity() { "setSupportLink" -> { // Only set link if valid if (arg.isEmpty() || arg.startsWith("https://") && arg.indexOf( - '/', - 8 + '/', 8 ) > 8 ) supportLink = arg } @@ -827,8 +814,8 @@ class InstallerActivity : FoxActivity() { } } - class InstallerMonitor(installScript: File) : CallbackList( - Executor { obj: Runnable -> obj.run() }) { + class InstallerMonitor(installScript: File) : + CallbackList(Executor { obj: Runnable -> obj.run() }) { private val installScriptErr: String private var lastCommand = "" private var forCleanUp: String? = null diff --git a/app/src/main/kotlin/com/fox2code/mmm/manager/LocalModuleInfo.kt b/app/src/main/kotlin/com/fox2code/mmm/manager/LocalModuleInfo.kt index e7b016b..9c0414c 100644 --- a/app/src/main/kotlin/com/fox2code/mmm/manager/LocalModuleInfo.kt +++ b/app/src/main/kotlin/com/fox2code/mmm/manager/LocalModuleInfo.kt @@ -15,13 +15,10 @@ import java.io.IOException import java.nio.charset.StandardCharsets class LocalModuleInfo(id: String?) : ModuleInfo(id!!) { - @JvmField var updateVersion: String? = null - @JvmField var updateVersionCode = Long.MIN_VALUE - @JvmField var updateZipUrl: String? = null private var updateChangeLogUrl: String? = null @@ -37,10 +34,8 @@ class LocalModuleInfo(id: String?) : ModuleInfo(id!!) { return field } - @JvmField var updateChangeLog = "" - @JvmField var updateChecksum: String? = null fun checkModuleUpdate() { if (updateJson != null && flags and FLAG_MM_REMOTE_MODULE == 0) { diff --git a/app/src/main/kotlin/com/fox2code/mmm/manager/ModuleInfo.kt b/app/src/main/kotlin/com/fox2code/mmm/manager/ModuleInfo.kt index 05f2ea6..0e7ffc1 100644 --- a/app/src/main/kotlin/com/fox2code/mmm/manager/ModuleInfo.kt +++ b/app/src/main/kotlin/com/fox2code/mmm/manager/ModuleInfo.kt @@ -14,62 +14,44 @@ import com.fox2code.mmm.utils.io.PropUtils */ open class ModuleInfo { // Magisk standard - @JvmField var id: String - @JvmField var name: String? - @JvmField var version: String? = null - @JvmField var versionCode: Long = 0 - @JvmField var author: String? = null - @JvmField var description: String? = null - @JvmField var updateJson: String? = null // Community meta - @JvmField var changeBoot = false - @JvmField var mmtReborn = false - @JvmField var support: String? = null - @JvmField var donate: String? = null - @JvmField var config: String? = null // Community restrictions - @JvmField var needRamdisk = false - @JvmField var minMagisk = 0 - @JvmField var minApi = 0 - @JvmField var maxApi = 0 // Module status (0 if not from Module Manager) - @JvmField var flags = 0 // Module safety (null if not provided) - @JvmField var safe = false constructor(id: String) { 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 4543c58..0add2f1 100644 --- a/app/src/main/kotlin/com/fox2code/mmm/manager/ModuleManager.kt +++ b/app/src/main/kotlin/com/fox2code/mmm/manager/ModuleManager.kt @@ -2,8 +2,6 @@ * 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. */ -@file:Suppress("unused") - package com.fox2code.mmm.manager import android.content.SharedPreferences @@ -217,13 +215,11 @@ class ModuleManager private constructor() : SyncManager() { MainApplication.INSTANCE!!.localModules = value } - @Suppress("unused") fun getUpdatableModuleCount(): Int { afterScan() return updatableModuleCount } - @Suppress("unused") fun setEnabledState(moduleInfo: ModuleInfo, checked: Boolean): Boolean { if (BuildConfig.DEBUG) Timber.d("setEnabledState(%s, %s)", moduleInfo.id, checked) if (moduleInfo.hasFlag(ModuleInfo.FLAG_MODULE_UPDATING) && !checked) return false @@ -243,7 +239,6 @@ class ModuleManager private constructor() : SyncManager() { return true } - @Suppress("unused") fun setUninstallState(moduleInfo: ModuleInfo, checked: Boolean): Boolean { if (checked && moduleInfo.hasFlag(ModuleInfo.FLAG_MODULE_UPDATING)) return false val disable = SuFile("/data/adb/modules/" + moduleInfo.id + "/remove") @@ -305,7 +300,6 @@ class ModuleManager private constructor() : SyncManager() { private const val FLAGS_RESET_UPDATE = FLAG_MM_INVALID or FLAG_MM_UNPROCESSED private var instAnce: ModuleManager? = null - @JvmStatic val instance: ModuleManager? get() { if (instAnce == null) { diff --git a/app/src/main/kotlin/com/fox2code/mmm/markdown/MarkdownActivity.kt b/app/src/main/kotlin/com/fox2code/mmm/markdown/MarkdownActivity.kt index 60b69ed..5e98e57 100644 --- a/app/src/main/kotlin/com/fox2code/mmm/markdown/MarkdownActivity.kt +++ b/app/src/main/kotlin/com/fox2code/mmm/markdown/MarkdownActivity.kt @@ -6,17 +6,15 @@ package com.fox2code.mmm.markdown import android.content.DialogInterface import android.content.pm.PackageManager -import android.content.res.Configuration import android.graphics.Color import android.os.Build import android.os.Bundle -import android.view.MenuItem import android.view.View import android.view.ViewGroup import android.view.WindowManager import android.widget.TextView import android.widget.Toast -import com.fox2code.foxcompat.app.FoxActivity +import androidx.appcompat.app.AppCompatActivity import com.fox2code.mmm.Constants import com.fox2code.mmm.MainApplication import com.fox2code.mmm.R @@ -27,24 +25,21 @@ import com.google.android.material.bottomnavigation.BottomNavigationView import com.google.android.material.chip.Chip import com.google.android.material.chip.ChipGroup import com.google.android.material.dialog.MaterialAlertDialogBuilder -import com.topjohnwu.superuser.internal.UiThreadHandler import org.matomo.sdk.extra.TrackHelper import timber.log.Timber import java.io.IOException import java.nio.charset.StandardCharsets -class MarkdownActivity : FoxActivity() { +class MarkdownActivity : AppCompatActivity() { private var header: TextView? = null private var footer: TextView? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) TrackHelper.track().screen(this).with(MainApplication.INSTANCE!!.tracker) - setDisplayHomeAsUpEnabled(true) val intent = this.intent if (!MainApplication.checkSecret(intent)) { Timber.e("Impersonation detected!") - forceBackPressed() - return + finish() } val url = intent.extras?.getString(Constants.EXTRA_MARKDOWN_URL) var title = intent.extras!!.getString(Constants.EXTRA_MARKDOWN_TITLE) @@ -60,17 +55,14 @@ class MarkdownActivity : FoxActivity() { @Suppress("UNUSED_VALUE") title = url } - setActionBarBackground(null) - @Suppress("DEPRECATION") - this.window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION, 0) + @Suppress("DEPRECATION") this.window.setFlags( + WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION, + 0 + ) if (!config.isNullOrEmpty()) { val configPkg = IntentHelper.getPackageOfConfig(config) try { XHooks.checkConfigTargetExists(this, configPkg, config) - this.setActionBarExtraMenuButton(R.drawable.ic_baseline_app_settings_alt_24) { _: MenuItem? -> - IntentHelper.openConfig(this, config) - true - } } catch (e: PackageManager.NameNotFoundException) { Timber.w("Config package \"$configPkg\" missing for markdown view") } @@ -78,7 +70,7 @@ class MarkdownActivity : FoxActivity() { // validate the url won't crash the app if (url.isNullOrEmpty() || url.contains("..")) { Timber.e("Invalid url %s", url.toString()) - forceBackPressed() + finish() return } Timber.i("Url for markdown %s", url.toString()) @@ -88,9 +80,6 @@ class MarkdownActivity : FoxActivity() { header = findViewById(R.id.markdownHeader) footer = findViewById(R.id.markdownFooter) updateBlurState() - UiThreadHandler.handler.post { // Fix header/footer height - this.updateScreenInsets(this.resources.configuration) - } // Really bad created (MSG by Der_Googler) // set "message" to null to disable dialog @@ -107,10 +96,8 @@ class MarkdownActivity : FoxActivity() { val markdown = String(rawMarkdown, StandardCharsets.UTF_8) Timber.i("Done!") runOnUiThread { - footer?.minimumHeight = this.navigationBarHeight MainApplication.INSTANCE!!.markwon?.setMarkdown( - textView, - MarkdownUrlLinker.urlLinkify(markdown) + textView, MarkdownUrlLinker.urlLinkify(markdown) ) if (markdownBackground != null) { markdownBackground.isClickable = true @@ -140,31 +127,6 @@ class MarkdownActivity : FoxActivity() { } } - private fun updateScreenInsets() { - runOnUiThread { this.updateScreenInsets(this.resources.configuration) } - } - - private fun updateScreenInsets(configuration: Configuration) { - val landscape = configuration.orientation == Configuration.ORIENTATION_LANDSCAPE - val bottomInset = if (landscape) 0 else this.navigationBarHeight - val statusBarHeight = statusBarHeight - val actionBarHeight = actionBarHeight - val combinedBarsHeight = statusBarHeight + actionBarHeight - header!!.minHeight = combinedBarsHeight - footer!!.minHeight = bottomInset - //this.actionBarBlur.invalidate(); - } - - override fun refreshUI() { - super.refreshUI() - this.updateScreenInsets() - updateBlurState() - } - - override fun onWindowUpdated() { - this.updateScreenInsets() - } - private fun addChip(markdownChip: MarkdownChip) { makeChip( this.getString(markdownChip.title), @@ -222,12 +184,6 @@ class MarkdownActivity : FoxActivity() { } } - override fun onResume() { - super.onResume() - val footer = findViewById(R.id.markdownFooter) - if (footer != null) footer.minimumHeight = this.navigationBarHeight - } - companion object { private val redirects = HashMap(4) private val variants = arrayOf("readme.md", "README.MD", ".github/README.md") diff --git a/app/src/main/kotlin/com/fox2code/mmm/markdown/MarkdownUrlLinker.kt b/app/src/main/kotlin/com/fox2code/mmm/markdown/MarkdownUrlLinker.kt index c29b89e..3605b6d 100644 --- a/app/src/main/kotlin/com/fox2code/mmm/markdown/MarkdownUrlLinker.kt +++ b/app/src/main/kotlin/com/fox2code/mmm/markdown/MarkdownUrlLinker.kt @@ -17,7 +17,6 @@ enum class MarkdownUrlLinker { } companion object { - @JvmStatic fun urlLinkify(url: String): String { var index = url.indexOf("https://") if (index == -1) return url 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 060a5d7..bf4b0bc 100644 --- a/app/src/main/kotlin/com/fox2code/mmm/module/ActionButtonType.kt +++ b/app/src/main/kotlin/com/fox2code/mmm/module/ActionButtonType.kt @@ -11,7 +11,6 @@ import android.text.Spanned import android.widget.TextView import android.widget.Toast 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 @@ -51,7 +50,7 @@ enum class ActionButtonType { } else { moduleHolder.repoModule?.moduleInfo?.name } - TrackHelper.track().event("view_notes", name).with(INSTANCE!!.getTracker()) + TrackHelper.track().event("view_notes", name).with(INSTANCE!!.tracker) val notesUrl = moduleHolder.repoModule?.notesUrl if (isAndroidacyLink(notesUrl)) { try { @@ -146,7 +145,7 @@ enum class ActionButtonType { } else { moduleHolder.repoModule?.moduleInfo?.name } - TrackHelper.track().event("view_update_install", name).with(INSTANCE!!.getTracker()) + TrackHelper.track().event("view_update_install", name).with(INSTANCE!!.tracker) // if text is reinstall, we need to uninstall first - warn the user but don't proceed if (moduleHolder.moduleInfo != null) { // get the text @@ -183,7 +182,7 @@ enum class ActionButtonType { var markwon: Markwon? = null val localModuleInfo = moduleHolder.moduleInfo if (localModuleInfo != null && localModuleInfo.updateChangeLog.isNotEmpty()) { - markwon = INSTANCE!!.getMarkwon() + markwon = INSTANCE!!.reallyGetMarkwon() // Re-render each time in cse of config changes desc = markwon!!.toMarkdown(localModuleInfo.updateChangeLog) } @@ -256,7 +255,7 @@ enum class ActionButtonType { } else { moduleHolder.repoModule?.moduleInfo?.name } - TrackHelper.track().event("uninstall_module", name).with(INSTANCE!!.getTracker()) + TrackHelper.track().event("uninstall_module", name).with(INSTANCE!!.tracker) Timber.i(Integer.toHexString(moduleHolder.moduleInfo?.flags ?: 0)) if (!instance!!.setUninstallState( moduleHolder.moduleInfo!!, !moduleHolder.hasFlag( @@ -284,7 +283,7 @@ enum class ActionButtonType { .show() } else { moduleHolder.moduleInfo = null - FoxActivity.getFoxActivity(button).refreshUI() + INSTANCE!!.lastActivity!! Timber.e("Cleared: %s", moduleId) } } @@ -311,7 +310,7 @@ enum class ActionButtonType { } else { moduleHolder.repoModule?.moduleInfo?.name } - TrackHelper.track().event("config_module", name).with(INSTANCE!!.getTracker()) + TrackHelper.track().event("config_module", name).with(INSTANCE!!.tracker) if (isAndroidacyLink(config)) { openUrlAndroidacy(button.context, config, true) } else { @@ -334,7 +333,7 @@ enum class ActionButtonType { } else { moduleHolder.repoModule?.moduleInfo?.name } - TrackHelper.track().event("support_module", name).with(INSTANCE!!.getTracker()) + TrackHelper.track().event("support_module", name).with(INSTANCE!!.tracker) openUrl(button.context, Objects.requireNonNull(moduleHolder.mainModuleInfo.support)) } }, @@ -353,7 +352,7 @@ enum class ActionButtonType { } else { moduleHolder.repoModule?.moduleInfo?.name } - TrackHelper.track().event("donate_module", name).with(INSTANCE!!.getTracker()) + TrackHelper.track().event("donate_module", name).with(INSTANCE!!.tracker) openUrl(button.context, moduleHolder.mainModuleInfo.donate) } }, @@ -369,7 +368,7 @@ enum class ActionButtonType { } else { moduleHolder.repoModule?.moduleInfo?.name } - TrackHelper.track().event("warning_module", name).with(INSTANCE!!.getTracker()) + TrackHelper.track().event("warning_module", name).with(INSTANCE!!.tracker) MaterialAlertDialogBuilder(button.context).setTitle(R.string.warning) .setMessage(R.string.warning_message).setPositiveButton( R.string.understand @@ -391,7 +390,7 @@ enum class ActionButtonType { } else { moduleHolder.repoModule?.moduleInfo?.name } - TrackHelper.track().event("safe_module", name).with(INSTANCE!!.getTracker()) + TrackHelper.track().event("safe_module", name).with(INSTANCE!!.tracker) MaterialAlertDialogBuilder(button.context).setTitle(R.string.safe_module) .setMessage(R.string.safe_message).setPositiveButton( R.string.understand @@ -410,7 +409,7 @@ enum class ActionButtonType { moduleHolder.repoModule?.moduleInfo?.name } // positive button executes install logic and says reinstall. negative button does nothing - TrackHelper.track().event("remote_module", name).with(INSTANCE!!.getTracker()) + TrackHelper.track().event("remote_module", name).with(INSTANCE!!.tracker) val madb = MaterialAlertDialogBuilder(button.context) madb.setTitle(R.string.remote_module) val moduleInfo: ModuleInfo = if (moduleHolder.mainModuleInfo != null) { @@ -464,7 +463,7 @@ enum class ActionButtonType { } if (BuildConfig.DEBUG) Timber.d("doAction: remote module for %s", name) TrackHelper.track().event("view_update_install", name) - .with(INSTANCE!!.getTracker()) + .with(INSTANCE!!.tracker) // Androidacy manage the selection between download and install if (isAndroidacyLink(updateZipUrl)) { if (BuildConfig.DEBUG) Timber.d("Androidacy link detected") @@ -485,7 +484,7 @@ enum class ActionButtonType { var markwon: Markwon? = null val localModuleInfo = moduleHolder.moduleInfo if (localModuleInfo != null && localModuleInfo.updateChangeLog.isNotEmpty()) { - markwon = INSTANCE!!.getMarkwon() + markwon = INSTANCE!!.reallyGetMarkwon() // Re-render each time in cse of config changes desc = markwon!!.toMarkdown(localModuleInfo.updateChangeLog) } @@ -555,7 +554,6 @@ enum class ActionButtonType { iconId = 0 } - @Suppress("unused") constructor(iconId: Int) { this.iconId = iconId } @@ -570,7 +568,6 @@ enum class ActionButtonType { } companion object { - @JvmStatic @DrawableRes fun supportIconForUrl(url: String?): Int { var icon = R.drawable.ic_baseline_support_24 @@ -590,7 +587,6 @@ enum class ActionButtonType { return icon } - @JvmStatic @DrawableRes fun donateIconForUrl(url: String?): Int { var icon = R.drawable.ic_baseline_monetization_on_24 diff --git a/app/src/main/kotlin/com/fox2code/mmm/module/ModuleHolder.kt b/app/src/main/kotlin/com/fox2code/mmm/module/ModuleHolder.kt index b75b43a..0497a55 100644 --- a/app/src/main/kotlin/com/fox2code/mmm/module/ModuleHolder.kt +++ b/app/src/main/kotlin/com/fox2code/mmm/module/ModuleHolder.kt @@ -24,7 +24,7 @@ import com.fox2code.mmm.utils.io.net.Http.Companion.hasWebView import timber.log.Timber import java.util.Objects -@Suppress("unused", "KotlinConstantConditions", "RedundantSetter") +@Suppress("unused", "KotlinConstantConditions") class ModuleHolder : Comparable { val moduleId: String val notificationType: NotificationType? @@ -69,9 +69,10 @@ class ModuleHolder : Comparable { get() = notificationType == null && separator == null && footerPx == -1 val mainModuleInfo: ModuleInfo get() = if (repoModule != null && (moduleInfo == null || moduleInfo!!.versionCode < repoModule!!.moduleInfo.versionCode)) repoModule!!.moduleInfo else moduleInfo!! + var updateZipUrl: String? = null - get() = if (moduleInfo == null || repoModule != null && moduleInfo!!.updateVersionCode < repoModule!!.moduleInfo.versionCode) repoModule!!.zipUrl else moduleInfo!!.updateZipUrl - set + get() = if (moduleInfo == null || repoModule != null && moduleInfo!!.updateVersionCode < repoModule!!.moduleInfo.versionCode) repoModule!!.zipUrl else moduleInfo!!.updateZipUrl ?: field + val updateZipRepo: String? get() = if (moduleInfo == null || repoModule != null && moduleInfo!!.updateVersionCode < repoModule!!.moduleInfo.versionCode) repoModule!!.repoData.preferenceId else "update_json" val updateZipChecksum: String? diff --git a/app/src/main/kotlin/com/fox2code/mmm/module/ModuleViewAdapter.kt b/app/src/main/kotlin/com/fox2code/mmm/module/ModuleViewAdapter.kt index 745d58b..fc14398 100644 --- a/app/src/main/kotlin/com/fox2code/mmm/module/ModuleViewAdapter.kt +++ b/app/src/main/kotlin/com/fox2code/mmm/module/ModuleViewAdapter.kt @@ -39,7 +39,6 @@ import com.topjohnwu.superuser.internal.UiThreadHandler import timber.log.Timber class ModuleViewAdapter : RecyclerView.Adapter() { - @JvmField val moduleHolders = ArrayList() override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { val view = LayoutInflater.from(parent.context).inflate(R.layout.module_entry, parent, false) diff --git a/app/src/main/kotlin/com/fox2code/mmm/module/ModuleViewListBuilder.kt b/app/src/main/kotlin/com/fox2code/mmm/module/ModuleViewListBuilder.kt index 4c54b41..aea7c77 100644 --- a/app/src/main/kotlin/com/fox2code/mmm/module/ModuleViewListBuilder.kt +++ b/app/src/main/kotlin/com/fox2code/mmm/module/ModuleViewListBuilder.kt @@ -33,8 +33,6 @@ class ModuleViewListBuilder(private val activity: Activity) { private val queryLock = Any() private var query = "" private var updating = false - private var headerPx = 0 - private var footerPx = 0 private var tries = 0 private var moduleSorter: ModuleSorter = ModuleSorter.UPDATE private var updateInsets = RUNNABLE @@ -149,13 +147,6 @@ class ModuleViewListBuilder(private val activity: Activity) { } } - fun refreshNotificationsUI(moduleViewAdapter: ModuleViewAdapter) { - val notificationCount = notifications.size - notifySizeChanged( - moduleViewAdapter, 0, notificationCount, notificationCount - ) - } - private fun matchFilter(moduleHolder: ModuleHolder): Boolean { val moduleInfo = moduleHolder.mainModuleInfo val query = query @@ -327,14 +318,6 @@ class ModuleViewListBuilder(private val activity: Activity) { } } - @Suppress("ktConcatNullable") - fun setQuery(query: String?) { - synchronized(queryLock) { - Timber.i("Query " + this.query + " -> " + query) - this.query = query?.trim { it <= ' ' }?.lowercase() ?: "" - } - } - fun setQueryChange(query: String?): Boolean { synchronized(queryLock) { val newQuery = query?.trim { it <= ' ' }?.lowercase() ?: "" @@ -345,22 +328,6 @@ class ModuleViewListBuilder(private val activity: Activity) { return true } - fun setHeaderPx(headerPx: Int) { - if (this.headerPx != headerPx) { - synchronized(updateLock) { this.headerPx = headerPx } - } - } - - fun setFooterPx(footerPx: Int) { - if (this.footerPx != footerPx) { - synchronized(updateLock) { this.footerPx = footerPx } - } - } - - fun updateInsets() { - updateInsets.run() - } - companion object { private val RUNNABLE = Runnable {} private fun notifySizeChanged( diff --git a/app/src/main/kotlin/com/fox2code/mmm/repo/CustomRepoData.kt b/app/src/main/kotlin/com/fox2code/mmm/repo/CustomRepoData.kt index 7551391..38c0411 100644 --- a/app/src/main/kotlin/com/fox2code/mmm/repo/CustomRepoData.kt +++ b/app/src/main/kotlin/com/fox2code/mmm/repo/CustomRepoData.kt @@ -13,10 +13,8 @@ import java.nio.charset.StandardCharsets class CustomRepoData internal constructor(url: String?, cacheRoot: File?) : RepoData( url!!, cacheRoot!! ) { - @JvmField var loadedExternal = false - @JvmField var override: String? = null override val isEnabledByDefault: Boolean get() = override != null || loadedExternal @@ -26,13 +24,13 @@ class CustomRepoData internal constructor(url: String?, cacheRoot: File?) : Repo val jsonObject = JSONObject( String( doHttpGet( - getUrl()!!, + url, false ), StandardCharsets.UTF_8 ) ) // make sure there's at least a name and a modules or data object - require(!(!jsonObject.has("name") || !jsonObject.has("modules") && !jsonObject.has("data"))) { "Invalid repo: " + getUrl() } + require(!(!jsonObject.has("name") || !jsonObject.has("modules") && !jsonObject.has("data"))) { "Invalid repo: $url" } name = jsonObject.getString("name").trim { it <= ' ' } website = jsonObject.optString("website") support = jsonObject.optString("support") 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 2088c70..fe69014 100644 --- a/app/src/main/kotlin/com/fox2code/mmm/repo/CustomRepoManager.kt +++ b/app/src/main/kotlin/com/fox2code/mmm/repo/CustomRepoManager.kt @@ -22,7 +22,6 @@ class CustomRepoManager internal constructor( ) { private val customRepos: Array = arrayOfNulls(MAX_CUSTOM_REPOS) - @JvmField var dirty = false var repoCount: Int private set diff --git a/app/src/main/kotlin/com/fox2code/mmm/repo/RepoData.kt b/app/src/main/kotlin/com/fox2code/mmm/repo/RepoData.kt index 8e3f784..de05179 100644 --- a/app/src/main/kotlin/com/fox2code/mmm/repo/RepoData.kt +++ b/app/src/main/kotlin/com/fox2code/mmm/repo/RepoData.kt @@ -27,47 +27,33 @@ open class RepoData(url: String, cacheRoot: File) : XRepo() { private val supportedProperties = JSONObject() private val populateLock = Any() - @JvmField - var url: String + open var url: String = "" - @JvmField var preferenceId: String? = null - @JvmField var cacheRoot: File - @JvmField var moduleHashMap: HashMap private var metaDataCache: JSONObject? - @JvmField var lastUpdate: Long = 0 - @JvmField var website: String? = null - @JvmField var support: String? = null - @JvmField var donate: String? = null - @JvmField var submitModule: String? = null - @JvmField var defaultName: String - @JvmField var defaultWebsite: String - @JvmField protected var defaultSupport: String? = null - @JvmField protected var defaultDonate: String? = null - @JvmField var defaultSubmitModule: String? = null override var name: String? = null @@ -389,27 +375,6 @@ open class RepoData(url: String, cacheRoot: File) : XRepo() { } } - open fun getUrl(): String? { - return url - } - - fun getWebsite(): String { - if (isNonNull(website)) return website!! - return if (defaultWebsite != null) defaultWebsite else url - } - - fun getSupport(): String? { - return if (isNonNull(support)) support else defaultSupport - } - - fun getDonate(): String? { - return if (isNonNull(donate)) donate else defaultDonate - } - - fun getSubmitModule(): String? { - return if (isNonNull(submitModule)) submitModule else defaultSubmitModule - } - // should update (lastUpdate > 15 minutes) fun shouldUpdate(): Boolean { if (BuildConfig.DEBUG) Timber.d("Repo $preferenceId should update check called") @@ -449,9 +414,5 @@ open class RepoData(url: String, cacheRoot: File) : XRepo() { return true } - companion object { - private fun isNonNull(str: String?): Boolean { - return !str.isNullOrEmpty() && "null" != str - } - } + companion object } \ No newline at end of file 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 984aace..8a06a39 100644 --- a/app/src/main/kotlin/com/fox2code/mmm/repo/RepoManager.kt +++ b/app/src/main/kotlin/com/fox2code/mmm/repo/RepoManager.kt @@ -33,7 +33,7 @@ import timber.log.Timber import java.io.File import java.nio.charset.StandardCharsets -@Suppress("NAME_SHADOWING", "unused") +@Suppress("NAME_SHADOWING") class RepoManager private constructor(mainApplication: MainApplication) : SyncManager() { private val mainApplication: MainApplication private val repoData: LinkedHashMap @@ -242,7 +242,7 @@ class RepoManager private constructor(mainApplication: MainApplication) : SyncMa if (!isLastUpdateSuccess || modules.isEmpty()) { Timber.e("Failed to update %s", repoUpdaters[i]!!.repoData.name) // Show snackbar on main looper and add some bottom padding - val context: Activity? = MainApplication.INSTANCE!!.lastCompatActivity + val context: Activity? = MainApplication.INSTANCE!!.lastActivity Handler(Looper.getMainLooper()).post { if (context != null) { // Show material dialogue with the repo name. for androidacy repo, show an option to reset the api key. show a message then a list of errors @@ -354,7 +354,6 @@ class RepoManager private constructor(mainApplication: MainApplication) : SyncMa @Volatile private var INSTANCE: RepoManager? = null - @JvmStatic fun getINSTANCE(): RepoManager? { if (INSTANCE == null || !INSTANCE!!.initialized) { synchronized(lock) { @@ -390,7 +389,6 @@ class RepoManager private constructor(mainApplication: MainApplication) : SyncMa return INSTANCE } - @JvmStatic fun internalIdOfUrl(url: String): String { return when (url) { MAGISK_ALT_REPO, MAGISK_ALT_REPO_JSDELIVR -> "magisk_alt_repo" diff --git a/app/src/main/kotlin/com/fox2code/mmm/repo/RepoModule.kt b/app/src/main/kotlin/com/fox2code/mmm/repo/RepoModule.kt index be12b55..b368cd7 100644 --- a/app/src/main/kotlin/com/fox2code/mmm/repo/RepoModule.kt +++ b/app/src/main/kotlin/com/fox2code/mmm/repo/RepoModule.kt @@ -9,41 +9,29 @@ import com.fox2code.mmm.MainApplication import com.fox2code.mmm.manager.ModuleInfo class RepoModule { - @JvmField val repoData: RepoData - @JvmField val moduleInfo: ModuleInfo - @JvmField val id: String - @JvmField var repoName: String? = null - @JvmField var lastUpdated: Long = 0 - @JvmField var propUrl: String? = null - @JvmField var zipUrl: String? = null - @JvmField var notesUrl: String? = null - @JvmField var checksum: String? = null - @JvmField var processed = false - @JvmField @StringRes var qualityText = 0 - @JvmField var qualityValue = 0 var safe: Boolean diff --git a/app/src/main/kotlin/com/fox2code/mmm/repo/RepoUpdater.kt b/app/src/main/kotlin/com/fox2code/mmm/repo/RepoUpdater.kt index b274a51..f9978dd 100644 --- a/app/src/main/kotlin/com/fox2code/mmm/repo/RepoUpdater.kt +++ b/app/src/main/kotlin/com/fox2code/mmm/repo/RepoUpdater.kt @@ -20,7 +20,6 @@ import java.util.concurrent.atomic.AtomicBoolean class RepoUpdater(repoData2: RepoData) { private var indexRaw: ByteArray? = null - @JvmField var repoData: RepoData = repoData2 private var toUpdate: List? = null private var toApply: Collection? = null @@ -120,7 +119,7 @@ class RepoUpdater(repoData2: RepoData) { toApply = repoData.moduleHashMap.values return 0 } - indexRaw = repoData.getUrl()?.let { doHttpGet(it, false) } + indexRaw = doHttpGet(repoData.url, false) toUpdate = repoData.populate(JSONObject(String(indexRaw!!, StandardCharsets.UTF_8))) // Since we reuse instances this should work toApply = HashSet(repoData.moduleHashMap.values) diff --git a/app/src/main/kotlin/com/fox2code/mmm/settings/AppearanceFragment.kt b/app/src/main/kotlin/com/fox2code/mmm/settings/AppearanceFragment.kt index f0db2b9..ddc1c10 100644 --- a/app/src/main/kotlin/com/fox2code/mmm/settings/AppearanceFragment.kt +++ b/app/src/main/kotlin/com/fox2code/mmm/settings/AppearanceFragment.kt @@ -10,13 +10,13 @@ import android.net.Uri import android.os.Build import android.os.Bundle import android.widget.Toast +import androidx.appcompat.app.AppCompatActivity import androidx.preference.ListPreference import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat import androidx.preference.TwoStatePreference import androidx.security.crypto.EncryptedSharedPreferences import androidx.security.crypto.MasterKey -import com.fox2code.foxcompat.app.FoxActivity import com.fox2code.mmm.BuildConfig import com.fox2code.mmm.MainApplication import com.fox2code.mmm.R @@ -101,8 +101,6 @@ class AppearanceFragment : PreferenceFragmentCompat() { // Refresh activity UiThreadHandler.handler.postDelayed({ MainApplication.INSTANCE!!.updateTheme() - FoxActivity.getFoxActivity(this) - .setThemeRecreate(MainApplication.INSTANCE!!.getManagerThemeResId()) }, 1) val intent = Intent(requireContext(), SettingsActivity::class.java) intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) @@ -121,7 +119,7 @@ class AppearanceFragment : PreferenceFragmentCompat() { } UiThreadHandler.handler.postDelayed({ MainApplication.INSTANCE!!.updateTheme() - FoxActivity.getFoxActivity(this).setThemeRecreate(MainApplication.INSTANCE!!.getManagerThemeResId()) + MainApplication.INSTANCE!!.lastActivity!! }, 1) true } @@ -134,7 +132,6 @@ class AppearanceFragment : PreferenceFragmentCompat() { disableMonet!!.onPreferenceClickListener = Preference.OnPreferenceClickListener { UiThreadHandler.handler.postDelayed({ MainApplication.INSTANCE!!.updateTheme() - (requireActivity() as FoxActivity).setThemeRecreate(MainApplication.INSTANCE!!.getManagerThemeResId()) }, 1) true } @@ -201,7 +198,7 @@ class AppearanceFragment : PreferenceFragmentCompat() { languageSelectorCta.onPreferenceLongClickListener = LongClickablePreference.OnPreferenceLongClickListener { _: Preference? -> val clipboard = - requireContext().getSystemService(FoxActivity.CLIPBOARD_SERVICE) as ClipboardManager + requireContext().getSystemService(AppCompatActivity.CLIPBOARD_SERVICE) as ClipboardManager val clip = ClipData.newPlainText("URL", "https://translate.nift4.org/engage/foxmmm/") clipboard.setPrimaryClip(clip) diff --git a/app/src/main/kotlin/com/fox2code/mmm/settings/CreditsFragment.kt b/app/src/main/kotlin/com/fox2code/mmm/settings/CreditsFragment.kt index f639577..f9f258f 100644 --- a/app/src/main/kotlin/com/fox2code/mmm/settings/CreditsFragment.kt +++ b/app/src/main/kotlin/com/fox2code/mmm/settings/CreditsFragment.kt @@ -5,11 +5,11 @@ import android.content.ClipboardManager import android.content.Context import android.os.Bundle import android.widget.Toast +import androidx.appcompat.app.AppCompatActivity import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat import androidx.security.crypto.EncryptedSharedPreferences import androidx.security.crypto.MasterKey -import com.fox2code.foxcompat.app.FoxActivity import com.fox2code.mmm.BuildConfig import com.fox2code.mmm.MainApplication import com.fox2code.mmm.R @@ -48,7 +48,7 @@ class CreditsFragment : PreferenceFragmentCompat() { - val clipboard = requireContext().getSystemService(FoxActivity.CLIPBOARD_SERVICE) as ClipboardManager + val clipboard = requireContext().getSystemService(AppCompatActivity.CLIPBOARD_SERVICE) as ClipboardManager // pref_contributors should lead to the contributors page var linkClickable: LongClickablePreference? = findPreference("pref_contributors") diff --git a/app/src/main/kotlin/com/fox2code/mmm/settings/InfoFragment.kt b/app/src/main/kotlin/com/fox2code/mmm/settings/InfoFragment.kt index 9c73921..156da00 100644 --- a/app/src/main/kotlin/com/fox2code/mmm/settings/InfoFragment.kt +++ b/app/src/main/kotlin/com/fox2code/mmm/settings/InfoFragment.kt @@ -5,11 +5,11 @@ import android.content.ClipboardManager import android.content.Context import android.os.Bundle import android.widget.Toast +import androidx.appcompat.app.AppCompatActivity import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat import androidx.security.crypto.EncryptedSharedPreferences import androidx.security.crypto.MasterKey -import com.fox2code.foxcompat.app.FoxActivity import com.fox2code.mmm.BuildConfig import com.fox2code.mmm.MainApplication import com.fox2code.mmm.R @@ -47,7 +47,7 @@ class InfoFragment : PreferenceFragmentCompat() { setPreferencesFromResource(R.xml.app_info_preferences, rootKey) val clipboard = - requireContext().getSystemService(FoxActivity.CLIPBOARD_SERVICE) as ClipboardManager + requireContext().getSystemService(AppCompatActivity.CLIPBOARD_SERVICE) as ClipboardManager var linkClickable: LongClickablePreference? if (BuildConfig.DEBUG || BuildConfig.ENABLE_AUTO_UPDATER) { linkClickable = findPreference("pref_report_bug") @@ -119,7 +119,7 @@ class InfoFragment : PreferenceFragmentCompat() { Preference.OnPreferenceClickListener { _: Preference? -> // open fox IntentHelper.openUrl( - FoxActivity.getFoxActivity(this), "https://paypal.me/fox2code" + MainApplication.INSTANCE!!.lastActivity!!, "https://paypal.me/fox2code" ) true } @@ -151,7 +151,7 @@ class InfoFragment : PreferenceFragmentCompat() { Toast.makeText(requireContext(), toastText, Toast.LENGTH_SHORT).show() // open androidacy IntentHelper.openUrl( - FoxActivity.getFoxActivity(this), + MainApplication.INSTANCE!!.lastActivity!!, "https://www.androidacy.com/membership-join/?utm_source=foxmmm&utm_medium=app&utm_campaign=donate" ) true diff --git a/app/src/main/kotlin/com/fox2code/mmm/settings/LongClickablePreference.kt b/app/src/main/kotlin/com/fox2code/mmm/settings/LongClickablePreference.kt index 820fcd4..3ab4969 100644 --- a/app/src/main/kotlin/com/fox2code/mmm/settings/LongClickablePreference.kt +++ b/app/src/main/kotlin/com/fox2code/mmm/settings/LongClickablePreference.kt @@ -10,7 +10,6 @@ import android.view.View import androidx.preference.Preference import androidx.preference.PreferenceViewHolder -@Suppress("unused") class LongClickablePreference : Preference { var onPreferenceLongClickListener: OnPreferenceLongClickListener? = null diff --git a/app/src/main/kotlin/com/fox2code/mmm/settings/PrivacyFragment.kt b/app/src/main/kotlin/com/fox2code/mmm/settings/PrivacyFragment.kt index e7bf202..7b1e20e 100644 --- a/app/src/main/kotlin/com/fox2code/mmm/settings/PrivacyFragment.kt +++ b/app/src/main/kotlin/com/fox2code/mmm/settings/PrivacyFragment.kt @@ -7,12 +7,12 @@ import android.content.Context import android.content.DialogInterface import android.content.Intent import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat import androidx.preference.TwoStatePreference import androidx.security.crypto.EncryptedSharedPreferences import androidx.security.crypto.MasterKey -import com.fox2code.foxcompat.app.FoxActivity import com.fox2code.mmm.BuildConfig import com.fox2code.mmm.MainActivity import com.fox2code.mmm.MainApplication @@ -76,7 +76,7 @@ class PrivacyFragment : PreferenceFragmentCompat() { PendingIntent.FLAG_CANCEL_CURRENT or PendingIntent.FLAG_IMMUTABLE ) val mgr = - requireContext().getSystemService(FoxActivity.ALARM_SERVICE) as AlarmManager + requireContext().getSystemService(AppCompatActivity.ALARM_SERVICE) as AlarmManager mgr[AlarmManager.RTC, System.currentTimeMillis() + 100] = mPendingIntent if (BuildConfig.DEBUG) Timber.d("Restarting app to save crash reporting preference: %s", newValue) exitProcess(0) // Exit app process diff --git a/app/src/main/kotlin/com/fox2code/mmm/settings/RepoFragment.kt b/app/src/main/kotlin/com/fox2code/mmm/settings/RepoFragment.kt index 84ea14a..81d6a01 100644 --- a/app/src/main/kotlin/com/fox2code/mmm/settings/RepoFragment.kt +++ b/app/src/main/kotlin/com/fox2code/mmm/settings/RepoFragment.kt @@ -24,7 +24,6 @@ import androidx.preference.PreferenceFragmentCompat import androidx.preference.SwitchPreferenceCompat import androidx.preference.TwoStatePreference import androidx.room.Room -import com.fox2code.foxcompat.app.FoxActivity import com.fox2code.foxcompat.view.FoxDisplay import com.fox2code.foxcompat.view.FoxViewCompat import com.fox2code.mmm.BuildConfig @@ -668,12 +667,12 @@ class RepoFragment : PreferenceFragmentCompat() { preference.title = repoData.name preference.isVisible = true // set website, support, and submitmodule as well as donate - if (repoData.getWebsite() != null) { + if (repoData.website != null) { findPreference(preferenceName + "_website")!!.onPreferenceClickListener = Preference.OnPreferenceClickListener { IntentHelper.openUrl( - FoxActivity.getFoxActivity(this), - repoData.getWebsite() + MainApplication.INSTANCE!!.lastActivity!!, + repoData.website ) true } @@ -681,12 +680,12 @@ class RepoFragment : PreferenceFragmentCompat() { findPreference(preferenceName + "_website")!!.isVisible = false } - if (repoData.getSupport() != null) { + if (repoData.support != null) { findPreference(preferenceName + "_support")!!.onPreferenceClickListener = Preference.OnPreferenceClickListener { IntentHelper.openUrl( - FoxActivity.getFoxActivity(this), - repoData.getSupport() + MainApplication.INSTANCE!!.lastActivity!!, + repoData.support ) true } @@ -694,12 +693,12 @@ class RepoFragment : PreferenceFragmentCompat() { findPreference("${preferenceName}_support")!!.isVisible = false } - if (repoData.getSubmitModule() != null) { + if (repoData.submitModule != null) { findPreference(preferenceName + "_submit")!!.onPreferenceClickListener = Preference.OnPreferenceClickListener { IntentHelper.openUrl( - FoxActivity.getFoxActivity(this), - repoData.getSubmitModule() + MainApplication.INSTANCE!!.lastActivity!!, + repoData.submitModule ) true } @@ -707,12 +706,12 @@ class RepoFragment : PreferenceFragmentCompat() { findPreference(preferenceName + "_submit")!!.isVisible = false } - if (repoData.getDonate() != null) { + if (repoData.donate != null) { findPreference(preferenceName + "_donate")!!.onPreferenceClickListener = Preference.OnPreferenceClickListener { IntentHelper.openUrl( - FoxActivity.getFoxActivity(this), - repoData.getDonate() + MainApplication.INSTANCE!!.lastActivity!!, + repoData.donate ) true } @@ -752,13 +751,13 @@ class RepoFragment : PreferenceFragmentCompat() { } } preference = findPreference(preferenceName + "_website") ?: return - val homepage = repoData.getWebsite() + val homepage = repoData.website if (preference != null) { - if (homepage.isNotEmpty()) { + if (homepage?.isNotEmpty() == true) { preference.isVisible = true preference.onPreferenceClickListener = Preference.OnPreferenceClickListener { - IntentHelper.openUrl(FoxActivity.getFoxActivity(this), homepage) + IntentHelper.openUrl(MainApplication.INSTANCE!!.lastActivity!!, homepage) true } (preference as LongClickablePreference).onPreferenceLongClickListener = @@ -773,14 +772,14 @@ class RepoFragment : PreferenceFragmentCompat() { } } preference = findPreference(preferenceName + "_support") ?: return - val supportUrl = repoData.getSupport() + val supportUrl = repoData.support if (preference != null) { if (!supportUrl.isNullOrEmpty()) { preference.isVisible = true preference.setIcon(ActionButtonType.supportIconForUrl(supportUrl)) preference.onPreferenceClickListener = Preference.OnPreferenceClickListener { - IntentHelper.openUrl(FoxActivity.getFoxActivity(this), supportUrl) + IntentHelper.openUrl(MainApplication.INSTANCE!!.lastActivity!!, supportUrl) true } (preference as LongClickablePreference).onPreferenceLongClickListener = @@ -795,14 +794,14 @@ class RepoFragment : PreferenceFragmentCompat() { } } preference = findPreference(preferenceName + "_donate") ?: return - val donateUrl = repoData.getDonate() + val donateUrl = repoData.donate if (preference != null) { if (donateUrl != null) { preference.isVisible = true preference.setIcon(ActionButtonType.donateIconForUrl(donateUrl)) preference.onPreferenceClickListener = Preference.OnPreferenceClickListener { - IntentHelper.openUrl(FoxActivity.getFoxActivity(this), donateUrl) + IntentHelper.openUrl(MainApplication.INSTANCE!!.lastActivity!!, donateUrl) true } (preference as LongClickablePreference).onPreferenceLongClickListener = @@ -817,13 +816,13 @@ class RepoFragment : PreferenceFragmentCompat() { } } preference = findPreference(preferenceName + "_submit") ?: return - val submissionUrl = repoData.getSubmitModule() + val submissionUrl = repoData.submitModule if (preference != null) { if (!submissionUrl.isNullOrEmpty()) { preference.isVisible = true preference.onPreferenceClickListener = Preference.OnPreferenceClickListener { - IntentHelper.openUrl(FoxActivity.getFoxActivity(this), submissionUrl) + IntentHelper.openUrl(MainApplication.INSTANCE!!.lastActivity!!, submissionUrl) true } (preference as LongClickablePreference).onPreferenceLongClickListener = diff --git a/app/src/main/kotlin/com/fox2code/mmm/settings/SecurityFragment.kt b/app/src/main/kotlin/com/fox2code/mmm/settings/SecurityFragment.kt index 5108f4a..e116fdc 100644 --- a/app/src/main/kotlin/com/fox2code/mmm/settings/SecurityFragment.kt +++ b/app/src/main/kotlin/com/fox2code/mmm/settings/SecurityFragment.kt @@ -7,12 +7,12 @@ import android.content.DialogInterface import android.content.Intent import android.content.SharedPreferences import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat import androidx.preference.TwoStatePreference import androidx.security.crypto.EncryptedSharedPreferences import androidx.security.crypto.MasterKey -import com.fox2code.foxcompat.app.FoxActivity import com.fox2code.mmm.BuildConfig import com.fox2code.mmm.MainActivity import com.fox2code.mmm.MainApplication @@ -86,7 +86,7 @@ class SecurityFragment : PreferenceFragmentCompat() { PendingIntent.FLAG_CANCEL_CURRENT or PendingIntent.FLAG_IMMUTABLE ) val mgr = - requireContext().getSystemService(FoxActivity.ALARM_SERVICE) as AlarmManager + requireContext().getSystemService(AppCompatActivity.ALARM_SERVICE) as AlarmManager mgr[AlarmManager.RTC, System.currentTimeMillis() + 100] = mPendingIntent if (BuildConfig.DEBUG) Timber.d("Restarting app to save showcase mode preference: %s", v) @@ -109,7 +109,7 @@ class SecurityFragment : PreferenceFragmentCompat() { PendingIntent.FLAG_CANCEL_CURRENT or PendingIntent.FLAG_IMMUTABLE ) val mgr = - requireContext().getSystemService(FoxActivity.ALARM_SERVICE) as AlarmManager + requireContext().getSystemService(AppCompatActivity.ALARM_SERVICE) as AlarmManager mgr[AlarmManager.RTC, System.currentTimeMillis() + 100] = mPendingIntent if (BuildConfig.DEBUG) Timber.d("Restarting app to save showcase mode preference: %s", v) diff --git a/app/src/main/kotlin/com/fox2code/mmm/settings/SettingsActivity.kt b/app/src/main/kotlin/com/fox2code/mmm/settings/SettingsActivity.kt index 37952c8..f34129f 100644 --- a/app/src/main/kotlin/com/fox2code/mmm/settings/SettingsActivity.kt +++ b/app/src/main/kotlin/com/fox2code/mmm/settings/SettingsActivity.kt @@ -14,12 +14,12 @@ import android.os.Bundle import android.view.MenuItem import android.view.View import android.widget.Toast +import androidx.appcompat.app.AppCompatActivity import androidx.fragment.app.FragmentTransaction import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat import androidx.security.crypto.EncryptedSharedPreferences import androidx.security.crypto.MasterKey -import com.fox2code.foxcompat.app.FoxActivity import com.fox2code.mmm.BuildConfig import com.fox2code.mmm.ExpiredActivity import com.fox2code.mmm.MainActivity @@ -38,7 +38,7 @@ import timber.log.Timber import java.sql.Timestamp @Suppress("SENSELESS_COMPARISON") -class SettingsActivity : FoxActivity(), LanguageActivity, +class SettingsActivity : AppCompatActivity(), LanguageActivity, PreferenceFragmentCompat.OnPreferenceStartFragmentCallback { private lateinit var bottomNavigationView: BottomNavigationView lateinit var sharedPreferences: SharedPreferences @@ -89,7 +89,7 @@ class SettingsActivity : FoxActivity(), LanguageActivity, .commit() true } - TrackHelper.track().screen(this).with(INSTANCE!!.getTracker()) + TrackHelper.track().screen(this).with(INSTANCE!!.tracker) setContentView(R.layout.settings_activity) setTitle(R.string.app_name_v2) val ts = Timestamp(System.currentTimeMillis() - 30L * 24 * 60 * 60 * 1000) @@ -205,24 +205,18 @@ class SettingsActivity : FoxActivity(), LanguageActivity, if (dataStore.sharedPreferences.getBoolean("developer", false)) { editor.putBoolean("developer", false) Toast.makeText( - p.context, - R.string.dev_mode_disabled, - Toast.LENGTH_SHORT + p.context, R.string.dev_mode_disabled, Toast.LENGTH_SHORT ).show() } else { Toast.makeText( - p.context, - R.string.dev_mode_enabled, - Toast.LENGTH_SHORT + p.context, R.string.dev_mode_enabled, Toast.LENGTH_SHORT ).show() } editor.apply() // toast yer a wizard harry if (versionClicks == 3) { Toast.makeText( - p.context, - R.string.keep_tapping_to_enter_hogwarts, - Toast.LENGTH_LONG + p.context, R.string.keep_tapping_to_enter_hogwarts, Toast.LENGTH_LONG ).show() } true @@ -282,8 +276,7 @@ class SettingsActivity : FoxActivity(), LanguageActivity, } override fun onPreferenceStartFragment( - caller: PreferenceFragmentCompat, - pref: Preference + caller: PreferenceFragmentCompat, pref: Preference ): Boolean { val fragment = supportFragmentManager.fragmentFactory.instantiate( classLoader, pref.fragment.toString() @@ -291,18 +284,7 @@ class SettingsActivity : FoxActivity(), LanguageActivity, fragment.arguments = pref.extras @Suppress("DEPRECATION") fragment.setTargetFragment(caller, 0) supportFragmentManager.beginTransaction().replace(R.id.settings, fragment) - .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN).addToBackStack(null) - .commit() + .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN).addToBackStack(null).commit() return true } - - override fun setOnBackPressedCallback(onBackPressedCallback: OnBackPressedCallback?) { - super.setOnBackPressedCallback(onBackPressedCallback) - // set the active tab to the one from the intent - bottomNavigationView.selectedItemId = when (activeTabFromIntent) { - "installed" -> R.id.installed_menu_item - "online" -> R.id.online_menu_item - else -> R.id.installed_menu_item - } - } } \ No newline at end of file diff --git a/app/src/main/kotlin/com/fox2code/mmm/settings/UpdateFragment.kt b/app/src/main/kotlin/com/fox2code/mmm/settings/UpdateFragment.kt index 2d75280..53a6d2a 100644 --- a/app/src/main/kotlin/com/fox2code/mmm/settings/UpdateFragment.kt +++ b/app/src/main/kotlin/com/fox2code/mmm/settings/UpdateFragment.kt @@ -14,12 +14,12 @@ import android.widget.EditText import android.widget.LinearLayout import android.widget.ScrollView import android.widget.Toast +import androidx.appcompat.app.AppCompatActivity import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat import androidx.preference.SwitchPreferenceCompat import androidx.security.crypto.EncryptedSharedPreferences import androidx.security.crypto.MasterKey -import com.fox2code.foxcompat.app.FoxActivity import com.fox2code.mmm.AppUpdateManager import com.fox2code.mmm.BuildConfig import com.fox2code.mmm.MainApplication @@ -301,7 +301,7 @@ class UpdateFragment : PreferenceFragmentCompat() { } val clipboard = - requireContext().getSystemService(FoxActivity.CLIPBOARD_SERVICE) as ClipboardManager + requireContext().getSystemService(AppCompatActivity.CLIPBOARD_SERVICE) as ClipboardManager val linkClickable = findPreference("pref_update") linkClickable!!.isVisible = BuildConfig.ENABLE_AUTO_UPDATER && (BuildConfig.DEBUG || AppUpdateManager.appUpdateManager.peekHasUpdate()) diff --git a/app/src/main/kotlin/com/fox2code/mmm/utils/BudgetProgressDialog.kt b/app/src/main/kotlin/com/fox2code/mmm/utils/BudgetProgressDialog.kt deleted file mode 100644 index ef5ac15..0000000 --- a/app/src/main/kotlin/com/fox2code/mmm/utils/BudgetProgressDialog.kt +++ /dev/null @@ -1,69 +0,0 @@ -/* - * 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. - */ - -package com.fox2code.mmm.utils - -import android.content.Context -import android.util.TypedValue -import android.view.Gravity -import android.view.ViewGroup -import android.widget.ProgressBar -import android.widget.TextView -import androidx.appcompat.app.AlertDialog -import androidx.appcompat.widget.LinearLayoutCompat -import com.google.android.material.dialog.MaterialAlertDialogBuilder -import kotlin.math.roundToInt - -// ProgressDialog is deprecated because it's an bad UX pattern, but sometimes we have no other choice... -enum class BudgetProgressDialog { - ; - - companion object { - fun build(context: Context, title: String?, message: String?): AlertDialog { - val r = context.resources - val padding = TypedValue.applyDimension( - TypedValue.COMPLEX_UNIT_DIP, - 20f, - r.displayMetrics - ).roundToInt() - val v = LinearLayoutCompat(context) - v.orientation = LinearLayoutCompat.HORIZONTAL - val pb = ProgressBar(context) - v.addView( - pb, - LinearLayoutCompat.LayoutParams( - ViewGroup.LayoutParams.WRAP_CONTENT, - ViewGroup.LayoutParams.WRAP_CONTENT, - 1f - ) - ) - val t = TextView(context) - t.gravity = Gravity.CENTER - v.addView( - t, - LinearLayoutCompat.LayoutParams( - ViewGroup.LayoutParams.WRAP_CONTENT, - ViewGroup.LayoutParams.MATCH_PARENT, - 4f - ) - ) - v.setPadding(padding, padding, padding, padding) - t.text = message - return MaterialAlertDialogBuilder(context) - .setTitle(title) - .setView(v) - .setCancelable(false) - .create() - } - - fun build(context: Context, title: Int, message: String?): AlertDialog { - return build(context, context.getString(title), message) - } - - @JvmStatic - fun build(context: Context, title: Int, message: Int): AlertDialog { - return build(context, title, context.getString(message)) - } - } -} \ No newline at end of file diff --git a/app/src/main/kotlin/com/fox2code/mmm/utils/ExternalHelper.kt b/app/src/main/kotlin/com/fox2code/mmm/utils/ExternalHelper.kt index 237b55d..18a7828 100644 --- a/app/src/main/kotlin/com/fox2code/mmm/utils/ExternalHelper.kt +++ b/app/src/main/kotlin/com/fox2code/mmm/utils/ExternalHelper.kt @@ -35,7 +35,6 @@ class ExternalHelper private constructor() { ) ) } else { - @Suppress("DEPRECATION") context.packageManager.queryIntentActivities( intent, PackageManager.MATCH_DEFAULT_ONLY diff --git a/app/src/main/kotlin/com/fox2code/mmm/utils/IntentHelper.kt b/app/src/main/kotlin/com/fox2code/mmm/utils/IntentHelper.kt index 01dc86c..e4f7312 100644 --- a/app/src/main/kotlin/com/fox2code/mmm/utils/IntentHelper.kt +++ b/app/src/main/kotlin/com/fox2code/mmm/utils/IntentHelper.kt @@ -18,8 +18,9 @@ import android.os.Bundle import android.os.Environment import android.util.TypedValue import android.widget.Toast +import androidx.activity.result.contract.ActivityResultContracts +import androidx.appcompat.app.AppCompatActivity import androidx.core.app.ActivityOptionsCompat -import com.fox2code.foxcompat.app.FoxActivity import com.fox2code.mmm.BuildConfig import com.fox2code.mmm.Constants import com.fox2code.mmm.MainActivity @@ -43,6 +44,7 @@ import java.io.InputStream import java.io.OutputStream import java.net.URISyntaxException +@Suppress("unused") enum class IntentHelper {; companion object { @@ -60,7 +62,6 @@ enum class IntentHelper {; "android.support.customtabs.extra.EXIT_ANIMATION_BUNDLE" const val FLAG_GRANT_URI_PERMISSION = Intent.FLAG_GRANT_READ_URI_PERMISSION - @JvmStatic fun openUri(context: Context, uri: String) { if (uri.startsWith("intent://")) { try { @@ -86,14 +87,13 @@ enum class IntentHelper {; } catch (e: ActivityNotFoundException) { if (BuildConfig.DEBUG) Timber.d(e, "Could not find suitable activity to handle url") Toast.makeText( - context, FoxActivity.getFoxActivity(context).getString( + context, MainApplication.INSTANCE!!.lastActivity!!.getString( R.string.no_browser ), Toast.LENGTH_LONG ).show() } } - @JvmStatic fun openCustomTab(context: Context, url: String?) { if (BuildConfig.DEBUG) Timber.d("Opening url: %s in custom tab", url) try { @@ -106,14 +106,13 @@ enum class IntentHelper {; } catch (e: ActivityNotFoundException) { if (BuildConfig.DEBUG) Timber.d(e, "Could not find suitable activity to handle url") Toast.makeText( - context, FoxActivity.getFoxActivity(context).getString( + context, MainApplication.INSTANCE!!.lastActivity!!.getString( R.string.no_browser ), Toast.LENGTH_LONG ).show() } } - @JvmStatic @JvmOverloads fun openUrlAndroidacy( context: Context, @@ -154,7 +153,6 @@ enum class IntentHelper {; } @Suppress("NAME_SHADOWING") - @JvmStatic fun getPackageOfConfig(config: String): String { var config = config var i = config.indexOf(' ') @@ -164,7 +162,6 @@ enum class IntentHelper {; return config } - @JvmStatic fun openConfig(context: Context, config: String) { val pkg = getPackageOfConfig(config) try { @@ -195,7 +192,6 @@ enum class IntentHelper {; } } - @JvmStatic fun openMarkdown( context: Context, url: String?, @@ -228,7 +224,6 @@ enum class IntentHelper {; } } - @JvmStatic @JvmOverloads fun openInstaller( context: Context, @@ -309,7 +304,7 @@ enum class IntentHelper {; intent1.putExtras(bundle) } intent1.putExtra(EXTRA_TAB_EXIT_ANIMATION_BUNDLE, param) - if (activity is FoxActivity) { + if (activity is AppCompatActivity) { val typedValue = TypedValue() activity.getTheme().resolveAttribute( android.R.attr.background, typedValue, true @@ -318,7 +313,7 @@ enum class IntentHelper {; intent1.putExtra(EXTRA_TAB_TOOLBAR_COLOR, typedValue.data) intent1.putExtra( EXTRA_TAB_COLOR_SCHEME, - if (activity.isLightTheme) EXTRA_TAB_COLOR_SCHEME_LIGHT else EXTRA_TAB_COLOR_SCHEME_DARK + if (MainApplication.INSTANCE!!.isLightTheme) EXTRA_TAB_COLOR_SCHEME_LIGHT else EXTRA_TAB_COLOR_SCHEME_DARK ) } } @@ -367,7 +362,7 @@ enum class IntentHelper {; @SuppressLint("SdCardPath") fun openFileTo( - compatActivity: FoxActivity, destination: File?, callback: OnFileReceivedCallback + compatActivity: AppCompatActivity, destination: File?, callback: OnFileReceivedCallback ) { var destinationFolder: File? = null if ((destination == null) || (destination.parentFile.also { @@ -382,22 +377,21 @@ enum class IntentHelper {; intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, false) intent.putExtra(Intent.EXTRA_LOCAL_ONLY, false) intent.addCategory(Intent.CATEGORY_OPENABLE) - val param = ActivityOptionsCompat.makeCustomAnimation( - compatActivity, android.R.anim.fade_in, android.R.anim.fade_out - ).toBundle() - compatActivity.startActivityForResult(intent, param) { result: Int, data: Intent? -> + compatActivity.registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + val resultCode = result.resultCode + val data: Intent? = result.data val uri = data?.data - if (uri == null || result == Activity.RESULT_CANCELED) { + if (uri == null || resultCode == Activity.RESULT_CANCELED) { if (BuildConfig.DEBUG) Timber.d("invalid uri received") callback.onReceived(destination, null, RESPONSE_ERROR) - return@startActivityForResult + return@registerForActivityResult } Timber.i("FilePicker returned %s", uri) if ("http" == uri.scheme || "https" == uri.scheme) { callback.onReceived(destination, uri, RESPONSE_URL) - return@startActivityForResult + return@registerForActivityResult } - if (ContentResolver.SCHEME_FILE == uri.scheme || result != Activity.RESULT_OK && result != Activity.RESULT_FIRST_USER) { + if (ContentResolver.SCHEME_FILE == uri.scheme || resultCode != Activity.RESULT_OK && resultCode != Activity.RESULT_FIRST_USER) { Toast.makeText( compatActivity, R.string.file_picker_wierd, Toast.LENGTH_SHORT ).show() @@ -421,7 +415,9 @@ enum class IntentHelper {; inputStream = compatActivity.contentResolver.openInputStream(uri) } outputStream = FileOutputStream(destination) - copy(inputStream!!, outputStream) + if (inputStream != null) { + copy(inputStream, outputStream) + } Timber.i("File saved at %s", destination) success = true } catch (e: Exception) { @@ -437,28 +433,25 @@ enum class IntentHelper {; callback.onReceived( destination, uri, if (success) RESPONSE_FILE else RESPONSE_ERROR ) - } + }.launch(intent) + } - fun openFileTo( - compatActivity: FoxActivity?, - destination: File, - callback: (File, Uri, Int) -> Unit - ) { - openFileTo(compatActivity!!, destination, object : OnFileReceivedCallback { + fun openFileTo(compatActivity: AppCompatActivity, module: File, function: (File, Uri, Int) -> Unit) { + openFileTo(compatActivity, module, object : OnFileReceivedCallback { override fun onReceived(target: File?, uri: Uri?, response: Int) { if (response == RESPONSE_ERROR) { - MainActivity.getFoxActivity(compatActivity).runOnUiThread { + MainActivity.getAppCompatActivity(compatActivity).runOnUiThread { Toast.makeText( compatActivity, R.string.no_file_provided, Toast.LENGTH_SHORT ).show() } } else { try { - callback(target!!, uri!!, response) + function(target!!, uri!!, response) } catch (e: Exception) { Timber.e(e) - compatActivity.forceBackPressed() + compatActivity.finish() } } } diff --git a/app/src/main/kotlin/com/fox2code/mmm/utils/ProcessHelper.kt b/app/src/main/kotlin/com/fox2code/mmm/utils/ProcessHelper.kt index bbb4510..206413e 100644 --- a/app/src/main/kotlin/com/fox2code/mmm/utils/ProcessHelper.kt +++ b/app/src/main/kotlin/com/fox2code/mmm/utils/ProcessHelper.kt @@ -16,7 +16,6 @@ enum class ProcessHelper { companion object { private val sPendingIntentId = ThreadLocalRandom.current().nextInt(100, 1000000 + 1) - @JvmStatic fun restartApplicationProcess(context: Context) { val mStartActivity = Intent(context, MainActivity::class.java) mStartActivity.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK 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 253e229..b60ba72 100644 --- a/app/src/main/kotlin/com/fox2code/mmm/utils/RuntimeUtils.kt +++ b/app/src/main/kotlin/com/fox2code/mmm/utils/RuntimeUtils.kt @@ -17,10 +17,10 @@ import android.provider.Settings import android.view.View import android.widget.CheckBox import android.widget.CompoundButton +import androidx.appcompat.app.AppCompatActivity import androidx.core.app.NotificationManagerCompat import androidx.core.content.ContextCompat import androidx.preference.PreferenceManager -import com.fox2code.foxcompat.app.FoxActivity import com.fox2code.mmm.BuildConfig import com.fox2code.mmm.MainActivity import com.fox2code.mmm.MainApplication @@ -49,7 +49,7 @@ class RuntimeUtils { ) != PackageManager.PERMISSION_GRANTED ) { if (BuildConfig.DEBUG) Timber.i("Request Notification Permission") - if (FoxActivity.getFoxActivity(context) + if (MainApplication.INSTANCE!!.lastActivity!! .shouldShowRequestPermissionRationale(Manifest.permission.POST_NOTIFICATIONS) ) { // Show a dialog explaining why we need context permission, which is to show @@ -191,7 +191,6 @@ class RuntimeUtils { */ fun waitInitialSetupFinished(context: Context, activity: MainActivity): Boolean { if (BuildConfig.DEBUG) Timber.i("waitInitialSetupFinished") - if (MainActivity.doSetupNowRunning) activity.updateScreenInsets() // Fix an edge case try { // Wait for doSetupNow to finish while (MainActivity.doSetupNowRunning) { @@ -276,7 +275,7 @@ class RuntimeUtils { } companion object { - fun reboot(mainActivity: FoxActivity, reboot: RebootMode) { + fun reboot(mainActivity: AppCompatActivity, reboot: RebootMode) { // reboot based on the reboot cmd from the enum we were passed when (reboot) { RebootMode.REBOOT -> { @@ -308,7 +307,7 @@ class RuntimeUtils { } private fun showRebootDialog( - mainActivity: FoxActivity, + mainActivity: AppCompatActivity, showExtraWarning: Boolean, function: () -> Unit ) { diff --git a/app/src/main/kotlin/com/fox2code/mmm/utils/ZipFileOpener.kt b/app/src/main/kotlin/com/fox2code/mmm/utils/ZipFileOpener.kt index 6cdc093..780f129 100644 --- a/app/src/main/kotlin/com/fox2code/mmm/utils/ZipFileOpener.kt +++ b/app/src/main/kotlin/com/fox2code/mmm/utils/ZipFileOpener.kt @@ -4,16 +4,14 @@ package com.fox2code.mmm.utils import android.content.DialogInterface -import android.os.Build import android.os.Bundle import android.util.Log import android.widget.Toast import androidx.appcompat.app.AlertDialog -import com.fox2code.foxcompat.app.FoxActivity +import androidx.appcompat.app.AppCompatActivity import com.fox2code.mmm.BuildConfig import com.fox2code.mmm.R import com.fox2code.mmm.installer.InstallerInitializer.Companion.peekMagiskPath -import com.fox2code.mmm.utils.BudgetProgressDialog.Companion.build import com.fox2code.mmm.utils.IntentHelper.Companion.openInstaller import com.fox2code.mmm.utils.io.Files.Companion.getFileName import com.fox2code.mmm.utils.io.Files.Companion.getFileSize @@ -26,14 +24,21 @@ import java.io.IOException import java.util.zip.ZipEntry import java.util.zip.ZipFile -class ZipFileOpener : FoxActivity() { +class ZipFileOpener : AppCompatActivity() { var loading: AlertDialog? = null // Adds us as a handler for zip files, so we can pass them to the installer // We should have a content uri provided to us. override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - loading = build(this, R.string.loading, R.string.zip_unpacking) + loading = MaterialAlertDialogBuilder(this) + .setTitle(R.string.loading) + .setMessage(R.string.zip_unpacking) + .setCancelable(false) + .setNegativeButton(R.string.cancel) { _: DialogInterface, _: Int -> + finishAndRemoveTask() + } + .show() Thread(Runnable { if (BuildConfig.DEBUG) Timber.d("onCreate: %s", intent) val zipFile: File @@ -115,15 +120,11 @@ class ZipFileOpener : FoxActivity() { if (zip.getEntry("module.prop").also { entry = it } == null) { Timber.e("onCreate: Zip file is not a valid magisk module") if (BuildConfig.DEBUG) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - if (BuildConfig.DEBUG) Timber.d( - "onCreate: Zip file contents: %s", - zip.stream().map { obj: ZipEntry -> obj.name } - .reduce { a: String, b: String -> "$a, $b" }.orElse("empty") - ) - } else { - if (BuildConfig.DEBUG) Timber.d("onCreate: Zip file contents cannot be listed on this version of android") - } + if (BuildConfig.DEBUG) Timber.d( + "onCreate: Zip file contents: %s", + zip.stream().map { obj: ZipEntry -> obj.name } + .reduce { a: String, b: String -> "$a, $b" }.orElse("empty") + ) } runOnUiThread { Toast.makeText(this, R.string.invalid_format, Toast.LENGTH_LONG).show() @@ -193,7 +194,7 @@ class ZipFileOpener : FoxActivity() { .setPositiveButton(R.string.yes) { d: DialogInterface, _: Int -> d.dismiss() // Pass the file to the installer - val compatActivity = getFoxActivity(this) + val compatActivity = this openInstaller( compatActivity, zipFile.absolutePath, compatActivity.getString( diff --git a/app/src/main/kotlin/com/fox2code/mmm/utils/io/Files.kt b/app/src/main/kotlin/com/fox2code/mmm/utils/io/Files.kt index 5f9649f..1b7bc4c 100644 --- a/app/src/main/kotlin/com/fox2code/mmm/utils/io/Files.kt +++ b/app/src/main/kotlin/com/fox2code/mmm/utils/io/Files.kt @@ -42,7 +42,6 @@ enum class Files { private val is64bit = Build.SUPPORTED_64_BIT_ABIS.isNotEmpty() // stolen from https://stackoverflow.com/a/25005243 - @JvmStatic fun getFileName(context: Context, uri: Uri): String { var result: String? = null if (uri.scheme == "content") { @@ -66,7 +65,6 @@ enum class Files { } // based on https://stackoverflow.com/a/63018108 - @JvmStatic fun getFileSize(context: Context, uri: Uri): Long? { var result: Long? = null try { @@ -90,7 +88,6 @@ enum class Files { return result } - @JvmStatic @Throws(IOException::class) fun write(file: File, bytes: ByteArray?) { // make the dir if necessary @@ -101,13 +98,11 @@ enum class Files { } } - @JvmStatic @Throws(IOException::class) fun read(file: File?): ByteArray { FileInputStream(file).use { inputStream -> return readAllBytes(inputStream) } } - @JvmStatic @Throws(IOException::class) fun writeSU(file: File, bytes: ByteArray?) { // make the dir if necessary @@ -118,7 +113,6 @@ enum class Files { } } - @JvmStatic @Throws(IOException::class) fun readSU(file: File): ByteArray { if (file.isFile && file.canRead()) { @@ -130,12 +124,10 @@ enum class Files { SuFileInputStream.open(file).use { inputStream -> return readAllBytes(inputStream) } } - @JvmStatic fun existsSU(file: File): Boolean { return file.exists() || SuFile(file.absolutePath).exists() } - @JvmStatic @Throws(IOException::class) fun copy(inputStream: InputStream, outputStream: OutputStream) { var nRead: Int @@ -146,7 +138,6 @@ enum class Files { outputStream.flush() } - @JvmStatic fun closeSilently(closeable: Closeable?) { try { closeable?.close() @@ -154,7 +145,6 @@ enum class Files { } } - @JvmStatic fun makeBuffer(capacity: Long): ByteArrayOutputStream { // Cap buffer to 1 Gib (or 512 Mib for 32bit) to avoid memory errors return makeBuffer( @@ -170,7 +160,6 @@ enum class Files { } } - @JvmStatic @Throws(IOException::class) fun readAllBytes(inputStream: InputStream): ByteArray { val buffer = makeBuffer(inputStream.available()) @@ -178,13 +167,11 @@ enum class Files { return buffer.toByteArray() } - @JvmStatic fun fixJavaZipHax(bytes: ByteArray) { if (bytes.size > 8 && bytes[0x6].toInt() == 0x0 && bytes[0x7].toInt() == 0x0 && bytes[0x8].toInt() == 0x8) bytes[0x7] = 0x8 // Known hax to prevent java zip file read } - @JvmStatic @Throws(IOException::class) fun patchModuleSimple(bytes: ByteArray, outputStream: OutputStream?) { fixJavaZipHax(bytes) @@ -218,7 +205,6 @@ enum class Files { zipInputStream.close() } - @JvmStatic fun fixSourceArchiveShit(rawModule: ByteArray?) { // unzip the module, check if it has just one folder within. if so, switch to the folder and zip up contents, and replace the original file with that try { diff --git a/app/src/main/kotlin/com/fox2code/mmm/utils/io/GMSProviderInstaller.kt b/app/src/main/kotlin/com/fox2code/mmm/utils/io/GMSProviderInstaller.kt index b564fa6..bc24019 100644 --- a/app/src/main/kotlin/com/fox2code/mmm/utils/io/GMSProviderInstaller.kt +++ b/app/src/main/kotlin/com/fox2code/mmm/utils/io/GMSProviderInstaller.kt @@ -19,7 +19,6 @@ enum class GMSProviderInstaller { companion object { private var called = false - @JvmStatic fun installIfNeeded(context: Context?) { if (context == null) { throw NullPointerException("Context must not be null") diff --git a/app/src/main/kotlin/com/fox2code/mmm/utils/io/Hashes.kt b/app/src/main/kotlin/com/fox2code/mmm/utils/io/Hashes.kt index deb90cd..e926453 100644 --- a/app/src/main/kotlin/com/fox2code/mmm/utils/io/Hashes.kt +++ b/app/src/main/kotlin/com/fox2code/mmm/utils/io/Hashes.kt @@ -11,16 +11,14 @@ import java.security.MessageDigest import java.security.NoSuchAlgorithmException import java.util.regex.Pattern -@Suppress("UNUSED_EXPRESSION") -enum class Hashes { - ; +@Suppress("UNUSED_EXPRESSION", "MemberVisibilityCanBePrivate") +enum class Hashes {; companion object { private val HEX_ARRAY = "0123456789abcdef".toCharArray() private val nonAlphaNum = Pattern.compile("[^a-zA-Z0-9]") - @JvmStatic - fun bytesToHex(bytes: ByteArray): String { + private fun bytesToHex(bytes: ByteArray): String { val hexChars = CharArray(bytes.size * 2) for (j in bytes.indices) { val v = bytes[j].toInt() and 0xFF @@ -30,17 +28,6 @@ enum class Hashes { return String(hexChars) } - @JvmStatic - fun hashMd5(ignoredInput: ByteArray?): String { - throw SecurityException("MD5 is not secure") - } - - @JvmStatic - fun hashSha1(ignoredInput: ByteArray?): String { - throw SecurityException("SHA-1 is not secure") - } - - @JvmStatic fun hashSha256(input: ByteArray?): String { input ?: return "" return try { @@ -51,7 +38,6 @@ enum class Hashes { } } - @JvmStatic fun hashSha512(input: ByteArray?): String { input ?: return "" return try { @@ -66,7 +52,6 @@ enum class Hashes { * Check if the checksum match a file by picking the correct * hashing algorithm depending on the length of the checksum */ - @JvmStatic fun checkSumMatch(data: ByteArray?, checksum: String?): Boolean { if (checksum == null) return false val hash: String = when (checksum.length) { @@ -74,8 +59,6 @@ enum class Hashes { return true // No checksum } - 32 -> hashMd5(data) - 40 -> hashSha1(data) 64 -> hashSha256(data) 128 -> hashSha512(data) else -> { @@ -87,7 +70,6 @@ enum class Hashes { return hash == checksum.lowercase() } - @JvmStatic fun checkSumValid(checksum: String?): Boolean { return if (checksum == null) false else when (checksum.length) { 32, 40, 64, 128 -> { @@ -108,7 +90,6 @@ enum class Hashes { } } - @JvmStatic fun checkSumName(checksum: String?): String? { return if (checksum == null) null else when (checksum.length) { 32 -> "MD5" @@ -125,7 +106,6 @@ enum class Hashes { } } - @JvmStatic fun checkSumFormat(checksum: String?): String? { return if (checksum == null) null else nonAlphaNum.matcher(checksum.trim { it <= ' ' }) .replaceAll("") diff --git a/app/src/main/kotlin/com/fox2code/mmm/utils/io/PropUtils.kt b/app/src/main/kotlin/com/fox2code/mmm/utils/io/PropUtils.kt index 5625ba4..e4796f2 100644 --- a/app/src/main/kotlin/com/fox2code/mmm/utils/io/PropUtils.kt +++ b/app/src/main/kotlin/com/fox2code/mmm/utils/io/PropUtils.kt @@ -2,8 +2,6 @@ * 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. */ -@file:Suppress("unused") - package com.fox2code.mmm.utils.io import android.os.Build @@ -373,7 +371,6 @@ enum class PropUtils { } } - @JvmStatic fun readModulePropSimple(inputStream: InputStream?, what: String): String? { if (inputStream == null) return null var moduleId: String? = null @@ -404,7 +401,6 @@ enum class PropUtils { return readModulePropSimple(inputStream, "id") } - @JvmStatic fun applyFallbacks(moduleInfo: ModuleInfo) { if (moduleInfo.support == null || moduleInfo.support!!.isEmpty()) { moduleInfo.support = moduleSupportsFallbacks[moduleInfo.id] @@ -422,7 +418,6 @@ enum class PropUtils { } // Some module are really so low quality that it has become very annoying. - @JvmStatic fun isLowQualityModule(moduleInfo: ModuleInfo?): Boolean { var description: String = moduleInfo?.description ?: return true return (moduleInfo.hasFlag(ModuleInfo.FLAG_METADATA_INVALID) || moduleInfo.name!!.length < 3 || moduleInfo.versionCode < 0 || moduleInfo.author == null || !TextUtils.isGraphic( @@ -438,7 +433,6 @@ enum class PropUtils { return !TextUtils.isGraphic(name) || name!!.indexOf('\u0000') != -1 } - @JvmStatic fun isInvalidURL(url: String): Boolean { val i = url.indexOf('/', 8) val e = url.indexOf('.', 8) @@ -452,7 +446,6 @@ enum class PropUtils { moduleId.substring(1).replace('_', ' ') } - @JvmStatic fun isNullString(string: String?): Boolean { return string.isNullOrEmpty() || "null" == string } diff --git a/app/src/main/kotlin/com/fox2code/mmm/utils/io/net/Http.kt b/app/src/main/kotlin/com/fox2code/mmm/utils/io/net/Http.kt index d563007..6d7f39b 100644 --- a/app/src/main/kotlin/com/fox2code/mmm/utils/io/net/Http.kt +++ b/app/src/main/kotlin/com/fox2code/mmm/utils/io/net/Http.kt @@ -192,7 +192,6 @@ enum class Http {; private var httpClientWithCacheDoH: OkHttpClient? = null private var fallbackDNS: FallBackDNS? = null - @JvmStatic var androidacyUA: String? = null private var hasWebView = false private var needCaptchaAndroidacyHost: String? = null @@ -222,7 +221,7 @@ enum class Http {; Timber.e(t, "No WebView support!") // show a toast val context: Context = mainApplication.applicationContext - MainActivity.getFoxActivity(context).runOnUiThread { + MainActivity.getAppCompatActivity(context).runOnUiThread { Toast.makeText( mainApplication, R.string.error_creating_cookie_database, Toast.LENGTH_LONG ).show() @@ -441,7 +440,6 @@ enum class Http {; return if (doh) httpClientDoH else httpClient } - @JvmStatic fun getHttpClientWithCache(): OkHttpClient? { return if (doh) httpClientWithCacheDoH else httpClientWithCache } @@ -452,7 +450,6 @@ enum class Http {; } } - @JvmStatic fun needCaptchaAndroidacy(): Boolean { return needCaptchaAndroidacyHost != null } @@ -461,16 +458,16 @@ enum class Http {; return needCaptchaAndroidacyHost } - @JvmStatic fun markCaptchaAndroidacySolved() { needCaptchaAndroidacyHost = null } - @Suppress("unused") - @JvmStatic @SuppressLint("RestrictedApi") @Throws(IOException::class) fun doHttpGet(url: String, allowCache: Boolean): ByteArray { + if (url.isEmpty()) { + throw IOException("Empty URL") + } var response: Response? response = try { (if (allowCache) getHttpClientWithCache() else getHttpClient())!!.newCall( @@ -482,7 +479,7 @@ enum class Http {; Timber.e(e, "Failed to post %s", url) // detect ssl errors, i.e., cert authority invalid by looking at the message if (e.message != null && e.message!!.contains("_CERT_")) { - MainActivity.getFoxActivity(MainApplication.INSTANCE!!).runOnUiThread { + MainApplication.INSTANCE!!.lastActivity!!.runOnUiThread { // show toast Toast.makeText( MainApplication.INSTANCE, R.string.ssl_error, Toast.LENGTH_LONG @@ -558,7 +555,6 @@ enum class Http {; } @Suppress("unused") - @JvmStatic @Throws(IOException::class) fun doHttpPost(url: String, data: String, allowCache: Boolean): ByteArray { return doHttpPostRaw(url, data, allowCache) as ByteArray @@ -579,7 +575,7 @@ enum class Http {; Timber.e(e, "Failed to post %s", url) // detect ssl errors, i.e., cert authority invalid by looking at the message if (e.message != null && e.message!!.contains("_CERT_")) { - MainActivity.getFoxActivity(MainApplication.INSTANCE!!).runOnUiThread { + MainApplication.INSTANCE!!.lastActivity!!.runOnUiThread { // show toast Toast.makeText( MainApplication.INSTANCE, R.string.ssl_error, Toast.LENGTH_LONG @@ -643,7 +639,6 @@ enum class Http {; return responseBody.bytes() } - @JvmStatic @Throws(IOException::class) fun doHttpGet(url: String, progressListener: ProgressListener): ByteArray { val response: Response @@ -654,7 +649,7 @@ enum class Http {; Timber.e(e, "Failed to post %s", url) // detect ssl errors, i.e., cert authority invalid by looking at the message if (e.message != null && e.message!!.contains("_CERT_")) { - MainActivity.getFoxActivity(MainApplication.INSTANCE!!).runOnUiThread { + MainApplication.INSTANCE!!.lastActivity!!.runOnUiThread { // show toast Toast.makeText( MainApplication.INSTANCE, R.string.ssl_error, Toast.LENGTH_LONG @@ -733,7 +728,6 @@ enum class Http {; } // dohttpget with progress listener but as lambda - @JvmStatic @Throws(IOException::class) fun doHttpGet(url: String, progressListener: (Int, Int, Boolean) -> Unit): ByteArray { return doHttpGet(url, object : ProgressListener { @@ -743,23 +737,19 @@ enum class Http {; }) } - @JvmStatic fun cleanDnsCache() { fallbackDNS?.cleanDnsCache() } - @JvmStatic fun setDoh(doh: Boolean) { Timber.i("DoH: " + Companion.doh + " -> " + doh) Companion.doh = doh } - @JvmStatic fun hasWebView(): Boolean { return hasWebView } - @JvmStatic fun hasConnectivity(context: Context): Boolean { // cache result for 10 seconds so we don't spam the system if (System.currentTimeMillis() - lastConnectivityCheck < 10000) { diff --git a/app/src/main/kotlin/com/fox2code/mmm/utils/io/net/HttpException.kt b/app/src/main/kotlin/com/fox2code/mmm/utils/io/net/HttpException.kt index d63e9a7..560b45f 100644 --- a/app/src/main/kotlin/com/fox2code/mmm/utils/io/net/HttpException.kt +++ b/app/src/main/kotlin/com/fox2code/mmm/utils/io/net/HttpException.kt @@ -27,7 +27,6 @@ class HttpException : IOException { } companion object { - @JvmStatic fun shouldTimeout(exception: Exception?): Boolean { return exception is HttpException && exception.shouldTimeout() diff --git a/app/src/main/kotlin/com/fox2code/mmm/utils/room/ModuleListCache.kt b/app/src/main/kotlin/com/fox2code/mmm/utils/room/ModuleListCache.kt index d703fa8..2cb3e61 100644 --- a/app/src/main/kotlin/com/fox2code/mmm/utils/room/ModuleListCache.kt +++ b/app/src/main/kotlin/com/fox2code/mmm/utils/room/ModuleListCache.kt @@ -6,7 +6,6 @@ package com.fox2code.mmm.utils.room import androidx.room.Entity -@Suppress("unused") @Entity(tableName = "modulelistcache", primaryKeys = ["codename"], indices = [androidx.room.Index(value = ["codename"], unique = true)]) class ModuleListCache ( var codename: String, diff --git a/app/src/main/kotlin/com/fox2code/mmm/utils/room/ModuleListCacheDao.kt b/app/src/main/kotlin/com/fox2code/mmm/utils/room/ModuleListCacheDao.kt index d8adc9e..951daed 100644 --- a/app/src/main/kotlin/com/fox2code/mmm/utils/room/ModuleListCacheDao.kt +++ b/app/src/main/kotlin/com/fox2code/mmm/utils/room/ModuleListCacheDao.kt @@ -12,7 +12,6 @@ import androidx.room.Query // contains // codename (string, primary), version (string), versionCode (int), author (string), description (string), minApi (int), maxApi (int), minMagisk (int), needRamdisk (boolean), support (string), donate (string), config (string), changeBoot (bool), mmtReborn (bool), repoId (string), lastUpdate (bigint), safe (bool) -@Suppress("unused") @Dao interface ModuleListCacheDao { // functions: diff --git a/app/src/main/kotlin/com/fox2code/mmm/utils/room/ModuleListCacheDatabase.kt b/app/src/main/kotlin/com/fox2code/mmm/utils/room/ModuleListCacheDatabase.kt index 5a2ff2d..e5ed445 100644 --- a/app/src/main/kotlin/com/fox2code/mmm/utils/room/ModuleListCacheDatabase.kt +++ b/app/src/main/kotlin/com/fox2code/mmm/utils/room/ModuleListCacheDatabase.kt @@ -7,7 +7,6 @@ package com.fox2code.mmm.utils.room import androidx.room.Database import androidx.room.RoomDatabase -@Suppress("unused") @Database(entities = [ModuleListCache::class], version = 1) abstract class ModuleListCacheDatabase : RoomDatabase() { abstract fun moduleListCacheDao(): ModuleListCacheDao diff --git a/app/src/main/kotlin/com/fox2code/mmm/utils/room/ReposListDao.kt b/app/src/main/kotlin/com/fox2code/mmm/utils/room/ReposListDao.kt index 83c972d..7478c57 100644 --- a/app/src/main/kotlin/com/fox2code/mmm/utils/room/ReposListDao.kt +++ b/app/src/main/kotlin/com/fox2code/mmm/utils/room/ReposListDao.kt @@ -9,7 +9,6 @@ import androidx.room.Insert import androidx.room.OnConflictStrategy import androidx.room.Query -@Suppress("unused") @Dao interface ReposListDao { // contains diff --git a/app/src/main/kotlin/com/fox2code/mmm/utils/room/ReposListDatabase.kt b/app/src/main/kotlin/com/fox2code/mmm/utils/room/ReposListDatabase.kt index 18cd1f1..1c39288 100644 --- a/app/src/main/kotlin/com/fox2code/mmm/utils/room/ReposListDatabase.kt +++ b/app/src/main/kotlin/com/fox2code/mmm/utils/room/ReposListDatabase.kt @@ -7,7 +7,6 @@ package com.fox2code.mmm.utils.room import androidx.room.Database import androidx.room.RoomDatabase -@Suppress("unused") @Database(entities = [ReposList::class], version = 1) abstract class ReposListDatabase : RoomDatabase() { abstract fun reposListDao(): ReposListDao diff --git a/app/src/main/kotlin/com/fox2code/mmm/utils/sentry/SentryBreadcrumb.kt b/app/src/main/kotlin/com/fox2code/mmm/utils/sentry/SentryBreadcrumb.kt index 6c7eb7e..a0482d5 100644 --- a/app/src/main/kotlin/com/fox2code/mmm/utils/sentry/SentryBreadcrumb.kt +++ b/app/src/main/kotlin/com/fox2code/mmm/utils/sentry/SentryBreadcrumb.kt @@ -9,7 +9,6 @@ import io.sentry.SentryLevel import java.util.Objects class SentryBreadcrumb { - @JvmField val breadcrumb: Breadcrumb = Breadcrumb() init { diff --git a/app/src/main/res/drawable/baseline_search_24.xml b/app/src/main/res/drawable/baseline_search_24.xml deleted file mode 100644 index 502968e..0000000 --- a/app/src/main/res/drawable/baseline_search_24.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - diff --git a/app/src/main/res/drawable/ic_baseline_app_settings_alt_24.xml b/app/src/main/res/drawable/ic_baseline_app_settings_alt_24.xml index 7ea6d0c..de79c54 100644 --- a/app/src/main/res/drawable/ic_baseline_app_settings_alt_24.xml +++ b/app/src/main/res/drawable/ic_baseline_app_settings_alt_24.xml @@ -3,6 +3,7 @@ --> + android:pathData="M21.8,12.7l-0.8,-0.6v-0.2l0.8,-0.6c0.2,-0.1 0.2,-0.3 0.1,-0.5l-0.9,-1.5c-0.1,-0.1 -0.2,-0.2 -0.4,-0.2 -0.1,0 -0.1,0 -0.2,0l-1,0.4c-0.1,-0.1 -0.1,-0.1 -0.2,-0.1l-0.2,-1c0,-0.2 -0.2,-0.4 -0.4,-0.4h-1.7c-0.2,0 -0.4,0.2 -0.4,0.3l-0.1,1c0,0 -0.1,0 -0.1,0.1l-0.1,0.1 -1,-0.4c-0.1,0 -0.1,0 -0.2,0 -0.1,0 -0.3,0.1 -0.4,0.2l-0.9,1.5c-0.1,0.2 -0.1,0.4 0.1,0.5l0.8,0.6v0.2l-0.8,0.6c-0.2,0.1 -0.2,0.3 -0.1,0.5l0.9,1.5c0.1,0.1 0.2,0.2 0.4,0.2 0.1,0 0.1,0 0.2,0l1,-0.4c0.1,0.1 0.1,0.1 0.2,0.1l0.2,1c0,0.2 0.2,0.3 0.4,0.3h1.7c0.2,0 0.4,-0.2 0.4,-0.3l0.2,-1c0,0 0.1,0 0.1,-0.1l0.1,-0.1 1,0.4c0.1,0 0.1,0 0.2,0 0.1,0 0.3,-0.1 0.4,-0.2l0.9,-1.5c0.1,-0.2 0.1,-0.4 -0.1,-0.5zM18,13.5c-0.8,0 -1.5,-0.7 -1.5,-1.5s0.7,-1.5 1.5,-1.5 1.5,0.7 1.5,1.5 -0.7,1.5 -1.5,1.5zM17,17h2v4c0,1.1 -0.9,2 -2,2H7c-1.1,0 -2,-0.9 -2,-2V3c0,-1.1 0.9,-2 2,-2h10c1.1,0 2,0.9 2,2v4h-2V6H7v12h10v-1z" + tools:ignore="VectorPath" /> diff --git a/app/src/main/res/drawable/search_bar_background.xml b/app/src/main/res/drawable/search_bar_background.xml deleted file mode 100644 index 34c25c8..0000000 --- a/app/src/main/res/drawable/search_bar_background.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/search_bar_bg.xml b/app/src/main/res/drawable/search_bar_bg.xml deleted file mode 100644 index 53bd760..0000000 --- a/app/src/main/res/drawable/search_bar_bg.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_crash_handler.xml b/app/src/main/res/layout/activity_crash_handler.xml index 5fe8339..9029d5c 100644 --- a/app/src/main/res/layout/activity_crash_handler.xml +++ b/app/src/main/res/layout/activity_crash_handler.xml @@ -2,8 +2,9 @@ ~ 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. --> - @@ -15,7 +16,6 @@ @@ -112,7 +108,8 @@ android:layout_height="48dp" android:layout_margin="10dp" android:hint="@string/feedback_name" - android:inputType="text" /> + android:inputType="text" + android:autofillHints="name" /> + android:inputType="textEmailAddress" + android:autofillHints="emailAddress" /> + android:inputType="textMultiLine" + android:importantForAutofill="no" /> diff --git a/app/src/main/res/layout/activity_expired.xml b/app/src/main/res/layout/activity_expired.xml index 9b9c3b7..58f2aa0 100644 --- a/app/src/main/res/layout/activity_expired.xml +++ b/app/src/main/res/layout/activity_expired.xml @@ -7,7 +7,6 @@ tools:context=".ExpiredActivity"> diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 71880ca..93e8827 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -11,7 +11,8 @@ app:layout_constraintTop_toTopOf="parent" tools:context=".MainActivity"> - + + diff --git a/app/src/main/res/layout/activity_update.xml b/app/src/main/res/layout/activity_update.xml index c8dfc7e..90bb347 100644 --- a/app/src/main/res/layout/activity_update.xml +++ b/app/src/main/res/layout/activity_update.xml @@ -22,7 +22,6 @@ diff --git a/app/src/main/res/layout/module_entry.xml b/app/src/main/res/layout/module_entry.xml index 2188d18..116add6 100644 --- a/app/src/main/res/layout/module_entry.xml +++ b/app/src/main/res/layout/module_entry.xml @@ -195,7 +195,6 @@ app:chipIcon="@drawable/ic_baseline_error_24" /> + xmlns:app="http://schemas.android.com/apk/res-auto"> - - - - - - \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png index 0a3d701..5873856 100644 Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher.png and b/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png index 80e7355..6a46c32 100644 Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher.png and b/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png index df7e8ff..da7ca6b 100644 Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png index c342c75..00d0965 100644 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png index 68f97d1..2ff461d 100644 Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/app/src/main/res/values-ar-rSA/strings.xml b/app/src/main/res/values-ar-rSA/strings.xml index 560d518..e5e55b2 100644 --- a/app/src/main/res/values-ar-rSA/strings.xml +++ b/app/src/main/res/values-ar-rSA/strings.xml @@ -19,7 +19,6 @@ المنتقي عيا يلقط ملفك. شف الأمر ذا منتهي و ممكن يسبب مشاكل عشان كذا حنا مزبنينه عنك. فا انت بكيفك اذا تبا تشغله شغله! عرض الخط على شكل أسطر واجد بدال ماتحط كل الخطوط على نفس السطر يوم تثبت إضافة. - اللغة ذي ماهي مكتملة اذا ودك رح للموقع و ترجمها. دقايق… الريبو عن طريق النت التطبيق مقفل @@ -60,10 +59,8 @@ منع تطفية الجهاز بطريقة غلط تشغيل Monet معلومة - التصاريح إظهار الإضافات الي ماهي مدعومة فيه تحديث ل ابو شنب اذا تبا تحدثه! - ريبو الأمان الشكل حذف ملفات الإضافة ؟ @@ -127,7 +124,6 @@ التطبيق لازم يطفي عشان تفعل الخيار ذا إعادة تشغيل التطبيق بيعاد تشغيله لأجل نوقف النسخة التجريبية - ماقدرنا ناخذ معلومات الكود من Androidacy. حاول بعدين. ماقدرنا ناخذ معلومات الكود من Androidacy. حاول بعدين. حظرو تحديث Androidacy بسبب Captcha تغير كود API. طف التطبيق لحفظ التغييرات. diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 78529b3..72c1a50 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -72,7 +72,6 @@ منع إعادة التشغيل تفعيل Monet إظهار التراخيص - التراخيص ‌عرض الإضافات الغير مدعومة هناك إصدار جديد من Magisk للتثبيت! الأمان @@ -90,7 +89,6 @@ الإصدار الأدنى المطلوب من Android الإصدار الأقصى من Android منع عمليات إعادة التشغيل الغير متوقعة - ريبوز خلفية المصدر (سورس كود) تعذر على منتقي الملفات الحالي الوصول إلى الملف. @@ -126,7 +124,6 @@ إعادة تشغيل التطبيق لتطبيق التغييرات؟ يحتاج التطبيق إلى إعادة التشغيل لتطبيق هذا الإعداد إعادة التشغيل - تعذر استرداد التوكن من Androidacy. يرجى إعادة المحاولة لاحقا. تم حظر تحديث Androidacy بواسطة Captcha تم تغيير مفتاح API. أعد تشغيل التطبيق لتطبيق التغييرات. السماح بالإشعارات؟ @@ -148,7 +145,6 @@ مسح بيانات التطبيق؟ أنت على وشك مسح بيانات التطبيق. يرجى تأكيد هذا الإجراء. قد يزيد من استخدام البطارية - بعض الترجمات للغة الحالية ليست محدثة ، يرجى التفكير في المساهمة في ترجمات التطبيق على GitHub إذا قمت بتعطيل هذا ، فلن يحصل المطور على تقارير الأخطاء تلقائياً، وقد يؤدي ذلك إلى صعوبة استكشاف الأخطاء وإصلاحها استخدم مفتاح API مخصص ل Androidacy. مفيد للمشتركين المميزين ، لإزالة الإعلانات والمزيد. أنت تقوم بإعداد التطبيق لاستخدام نقطة نهاية غير إنتاجية ل Androidacy. قد يؤدي هذا إلى عدم استقرار التطبيق والفشل في تحميل الريبو عبر الإنترنت. لا تبلغ عن الأخطاء إذا كان هذا المفتاح مفعل. سيتم إعادة تشغيل التطبيق لإعادة تحميل الريبو. @@ -208,7 +204,6 @@ آلية تنزيل التحديثات الاختبارية إعادة تعيين مفاتيح API الترقية إلى الإصدار المميز - إرسال وإعادة تشغيل الرجاء مساعدتنا من خلال إخبارنا بما كنت تحاول القيام به عندما حدث هذا. الأسم (اختياري) البريد الإلكتروني (اختياري) @@ -229,7 +224,6 @@ التحديثات تحديث التطبيق يرجى الانتظار بينما نتحقق من وجود تحديثات ل AMM وتثبيتها. قد يستغرق هذا بضع دقائق - الرجاء الانتظار… يمكن تحديث الإضافات التالية: من الإصدار %1$s إلى الإصدار %2$s جاري التحقق من وجود تحديثات… @@ -270,9 +264,7 @@ يجب تقديم الريبوز عبر HTTPS ، ويجب أن تتبع المواصفات الموضحة في الوثائق. يقوم AMM بالتحقق من وجود تحديثات في الخلفية. عرض إشعار أثناء التحقق من وجود تحديثات حتى لا يتم قتلها بواسطة النظام - يا ساحر ، هاري! استمر في النقر للقبول في هوجورتس! - الإضافات ليس لديك متصفح مثبت. الرجاء تثبيت واحد للمتابعة. عبر الإنترنت آمن @@ -336,7 +328,6 @@ فشل إنشاء ذاكرة تخزين مؤقتة (كيتش) لقاعدة الإضافة الجهاز غير متوافق مع التمويه (Blur) إعادة التشغيل - إعادة التشغيل بشكل طبيعي إعادة التشغيل إلى الركفري إعادة التشغيل إلى البووتلاودر إعادة التشغيل إلى وضع EDL @@ -347,10 +338,6 @@ اندرويداسي مدير الإضافات AMM بحث - نشاط منتهي - القائمة الرئيسية - لوحة المعلومات - الإشعارات هذا الإصدار منتهي! الإصدار الذي تستخدمه منتهي وليس قابل للتشغيل بعد الآن. الرجاء التحديث إلى آخر اصدار مستقر. تنزيل الأحدث diff --git a/app/src/main/res/values-bs/strings.xml b/app/src/main/res/values-bs/strings.xml index 0ba348b..210a608 100644 --- a/app/src/main/res/values-bs/strings.xml +++ b/app/src/main/res/values-bs/strings.xml @@ -38,7 +38,6 @@ Sprječava neočekivana ponovno pokretanje Omogući Monet Prikaži licence - Licence Prikazati nekompatibilne module Postoji nova verzija Magiska za instaliranje!!! Sigurnost @@ -63,7 +62,6 @@ Neki moduli ne deklarišu svoje metapodatke ispravno, što uzrokuje vizualne probleme i/ili ukazuje na loš kvalitet modula. \nUključite ovo na vlastitu odgovornost! Upravljajte repozitorijem - Repozitoriji DNS preko HTTPS Prelamanje teksta Zamagljeno @@ -90,7 +88,6 @@ \nUključite ovo na vlastitu odgovornost! Može riješiti probleme sa povezivanjem u nekim slučajevima. (Ne odnosi se na WebView.) Pronađeno %1$d ažuriranja modula - Neki prijevodi za trenutni jezik nisu ažurirani, razmislite o doprinosu prijevoda aplikacije na GitHubu Upravo ćete obrisati podatke aplikacije. Molimo potvrdite ovu radnju. Omogućili ste ili onemogućili repozitorij. Osvježite listu modula ili ponovo pokrenite aplikaciju. Preveo Jigsaw | Muhamed M @@ -182,7 +179,6 @@ Nadogradi na premium Nadogradnja na premium će ukloniti oglase, captcha i preuzimanja za Androidacy Repository i podržati Androidacy i autore modula. Aplikacija se mora ponovo pokrenuti da primijeni ovu postavku - Nije moguće preuzeti token iz Androidacy-a. Molimo pokušajte ponovo kasnije. API ključ je promijenjen. Ponovo pokrenite aplikaciju da primijenite izmjene. Potrebna nam je dozvola za obavještenja da vas obavijestimo o ažuriranjima aplikacije i modula. Ako ne date ovu dozvolu, automatska provjera ažuriranja će se izgasiti. Ovoj verziji nedostaju klijentski ključevi za Androidacy Repo. Molimo preuzmite GitHub izdanje ako želite imati koristi od funkcija kao što su recenzije modula, automatske sigurnosne provjere i još mnogo toga. @@ -214,7 +210,6 @@ \n%1$s Ups, naišli smo na prepreku! Recite nam više detalja o tome što ste radili kada se ovo dogodilo. Što više to bolje! - Predaj i ponovno pokreni Molimo vas da pomognete tako što kažete što ste pokušavali učiniti kada se ovo dogodilo. Izvješćivanje o greškama je onemogućeno. Omogućite ga za slanje povratnih informacija. Ime (neobavezno) @@ -250,7 +245,6 @@ Lista modula koji se neće provjeravati za ažuriranja Moduli koji se neće automatski provjeravati za ažuriranja Ažuriraj aplikaciju - Molimo pričekajte… URL koji ste unijeli za repositorij nije važeći Repositoriji moraju biti posluženi preko HTTPS, i moraju pratiti specifikaciju označenu u dokumentaciji. Molimo pričekajte dok provjerimo i instaliramo ažuriranja za Fox-ov MMU. Ovo možda potraje par minuta diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index c325863..abfcaac 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -35,11 +35,9 @@ Omezený režim brání správci provádět akce s moduly Info Zobrazit licence - Licence Zobrazit nekompatibilní moduly Zobrazit moduly, které nejsou podle jejich metadat kompatibilní s vaším zařízením Magisk je zastaralý! - Úložiště Smazat soubory modulu? Ponechat soubory Smazat soubory @@ -105,7 +103,6 @@ Zakážete-li tohle, vývojář nebude dostávat automatické zprávy o chybách, což může ztížit odstraňování problémů Zabránit neočekávaným rebootům Použít testovací endpoint místo endpointu vydání (Restartuje aplikaci) - Některé překlady pro aktuální jazyk můžou být starší, zvažte prosím přispění k překladům aplikací na GitHubu Odkaz zkopírován Testovací režim Androidacy Nalezeno %1$d aktualizací modulů @@ -128,7 +125,6 @@ Neptejte se znovu Tenhle repozitář je momentálně zakázán Nelze oveřit Androidacy token. Prosím zkuste to znovu později. - Nelze načíst Androidacy token. Prosím zkuste to znovu později. Aktualizaci Androidacy blokuje Captcha Klíč Androidacy nelze ověřit. Skontrolujte jej a zkuste opět. Klíč API je platný. @@ -204,7 +200,6 @@ Protokoly se nedají uložit Sdílet protokoly AMM Pokračujte v klikání, aby vás přijali do Bradavic! - Moduly ERROR: Chybná data při spuštění Zdá se, že spouštíte debug sestavení. Debug sestavení musíte aktualizovat ručně a aktualizace v aplikaci nejsou podporováný CHYBA: Byla zadána neplatná akce. Nebude se pokračovat. @@ -226,7 +221,6 @@ Přechodem na prémiovou verzi odstraníte reklamy, CAPTCHA a stahování pro úložiště Androidacy a podpoříte Androidacy a autory modulů. Uh-oh, narazili jsme na zádrhel! Řekněte nám více podrobností o tom, co jste dělali, když se to stalo. Čím více tím lépe! - Odeslat a restartovat Pomozte nám prosím tím, že nám řekněte, co jste se snažili udělat, když se to stalo. Hlášení o pádu je zakázáno. Chcete-li odeslat zpětnou vazbu, povolte ji. Název (volitelné) @@ -285,7 +279,6 @@ Je dostupná aktualizace aplikace! Je dostupná aktualizace AMM. Klikněte zde pro aktualizaci. Kontroly aktualizací - Čekejte prosím… Kontrola aktualizací… Vážně chceš nainstalovat modul \"%1$s\" ze ZIP souboru \"%2$s\"\? \n @@ -294,7 +287,6 @@ Počkejte prosím, než zkontrolujeme a nainstalujeme aktualizace AMM. Může to trvat pár minut Při stahování informací o aktualizaci došlo k chybě. Tento modul obsahuje metadata, která jsou buď neplatná, nebo jsou považována za označení modulu nízké kvality. Doporučuje se odinstalace. - Jsi čaroděj, Harry! Nemáte nainstalován prohlížeč. Pro pokračování nejaký nainstalujte. Pro kontrolu aktualizací vyžadovat WiFi K provádění kontrol aktualizací využívat WiFi nebo jiné neměřené připojení diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index aae2743..e4f05ae 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -47,9 +47,7 @@ Aktiver Monet Info Vis licenser - Licenser Vis moduler, der sandsynligvis ikke fungerer på din enhed baseret på deres metadata - Depoter Sikkerhed Udseende Slet modul filerne\? @@ -104,7 +102,6 @@ Appen skal genstarte for at anvende denne indstilling Genstart Appen genstartes for at deaktivere iscenesættelsesslutpunktet - Kunne ikke hente token fra Androidacy. Prøv igen senere. Kunne ikke validere token til Androidacy. Prøv igen senere. Androidacy-opdatering blokeret af Captcha API-nøgle er blevet ændret. Genstart appen for at anvende ændringer. @@ -134,7 +131,6 @@ \nSlå dette til på eget ansvar! Fjern Depot Dette lager kan vise nogle ikke-påtrængende reklamer for at dække server- og udviklingsomkostninger. - Nogle oversættelser til det aktuelle sprog er ikke opdaterede. Overvej venligst at bidrage til app-oversættelserne på GitHub Brug en tilpasset API-nøgle til Androidacy. Nyttigt for premium-abonnenter, til fjernelse annoncer og mere. Du indstiller appen til at bruge et ikke-produktionsslutpunkt til Androidacy. Dette kan resultere i app-ustabilitet og manglende indlæsning af online-depoten. Rapporter IKKE fejl, hvis du har denne funktion slået til. Appen genstartes for at genindlæse repos. \ No newline at end of file diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index b41bf04..45c935b 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -22,7 +22,6 @@ Sperrmodus Sperrmodus verhindert, dass der Manager Aktionen an Modulen ausführt Lizenzen anzeigen - Lizenzen Inkompatible Module anzeigen Module anzeigen, die aufgrund ihrer Metadaten nicht mit Ihrem Gerät kompatibel sind Magisk ist veraltet! @@ -93,7 +92,6 @@ Min. Android Max. Android Info - Repos Thema Modul-ID: Modul mit niedriger Qualität @@ -106,7 +104,6 @@ Automatische Suche nach Modulaktualisierungen Könnte Batterie-Nutzung erhöhen Test-Benachrichtigung - Einige Übersetzungen für die aktuelle Sprache sind nicht aktuell, bitte überlege, auf GitHub beizutragen Übersetzt von nift4 Automatisch Entwickler über Bugs informieren Konnte API-Schlüssel nicht überprüfen. Bitte auf Fehler überprüfen. @@ -126,7 +123,6 @@ Dieses Modul braucht eine installierte Boot-Ramdisk Eigenen API-Schlüssel für Androidacy verwenden. Nützlich für Androidacy-Kunden, um Werbung zu entfernen. Androidacy Betamodus wird aktiviert. Dies könnte Fehler verursachen. Bitte keine Fehlerberichte einreichen, wenn aktiviert. Die App wird neu gestartet. - Konnte Token nicht von Androidacy laden. Bitte versuche es später noch einmal. Konnte Token für Androidacy nicht validieren. Bitte versuche es später noch einmal. Androidacy-Update von CAPTCHA blockiert Link kopiert @@ -218,7 +214,6 @@ Upgrade auf Premium Teile Logs Diese App ist ein inoffizieller AMM-Build. - Absenden und neu starten Bitte hilf uns aus, indem du uns erzählst, was du machen wolltest, bevor dies passiert ist. Fehler-Upload deaktiviert. Aktivieren, um Feedback hochzuladen. Name (optional) @@ -260,5 +255,4 @@ Bitte warten, während AMM-Updates installiert werden. Dies kann ein paar Minuten dauern Androidacy Modul-Manager AMM - Bitte warten… \ No newline at end of file diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 119f0bc..4ef7cbc 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -58,11 +58,9 @@ Ενεργοποίηση Monet Πληροφορίες Εμφάνιση αδειών - Άδειες Εμφάνιση ασυμβίβαστων module Εμφάνιση module που είναι απίθανο να εγκατασταθούν στη συσκευή σας με βάση τα μεταδεδομένα τους Υπάρχει μια νέα έκδοση του Magisk για εγκατάσταση! - Αποθετήρια Ασφάλεια Εμφάνιση Διαγραφή των αρχείων module; @@ -114,8 +112,6 @@ Ειδοποίηση δοκιμής false - 1 - Ορισμένες μεταφράσεις για την τρέχουσα γλώσσα δεν είναι ενημερωμένες, παρακαλούμε να συνεισφέρετε στις μεταφράσεις εφαρμογών στο GitHub Μεταφράστηκε από INvxrteD, Tha_14 Αναφορά σφαλμάτων @@ -168,7 +164,6 @@ Δεν ήταν δυνατή η αποθήκευση των logs Κοινοποίηση των logs του AMM Αυτή η εφαρμογή είναι ανεπίσημη κατασκευή του AMM. - Το token δεν ανακτήθηκε από το Androidacy. Παρακαλούμε προσπαθήστε ξανά αργότερα. Το token δεν επικυρώθηκε από το Androidacy. Παρακαλούμε προσπαθήστε ξανά αργότερα. Ο εκσυγχρονισμός του Androidacy, μπλοκαρίστηκε από το Captcha Αυτοματοποίηση αναφοράς σφαλμάτων και ποιότητας εκτέλεσης στους προγραμματιστές @@ -178,7 +173,6 @@ Παρακαλώ περιμένετε Επιτυχής επαναφορά του κλειδιού API Η εφαρμογή θα επανεκκινηθεί για να απενεργοποιηθεί το endpoint σταδιοποίησης - Modules Δεν έχεις κανέναν φυλλομετρητή εγκατεστημένο. Παρακαλούμε εγκατέστησε έναν για να συνεχίσεις. Καθαρισμός δεδομένων της εφαρμογής Θα θέλατε να καθαρίσετε όλα τα δεδομένα που συνοδεύουν την εφαρμογή; @@ -216,7 +210,6 @@ Αναβαθμίζοντας σε premium θα αφαιρεθούν, οι διαφημίσεις, οι επαληθεύσεις ταυτότητας, και οι λήψεις για το αποθετήριο Androidacy, ενώ θα υποστηρίξετε τους δημιουργούς του Androidacy και των modules. Ωχ όχι, βρεθήκαμε σε εμπόδιο! Δώστε μας περισσότερες λεπτομέρειες για το τι ακριβώς κάνατε όταν συνέβη αυτό. Όσο πιο πολλές τόσο το καλύτερο! - Υποβολή και επανεκκίνηση Παρακαλείσθε να μας βοηθήσετε αναφέροντας τι προσπαθούσατε να κάνετε όταν συνέβη αυτό. Όνομα (προαιρετικό) Email (προαιρετικό) @@ -247,7 +240,6 @@ Χρειαζόμαστε την άδεια για ειδοποιήσεις, ώστε να σε ειδοποιούμε για κάθε δυνατό εκσυγχρονισμό της εφαρμογής και των modules, δεν θα λειτουργήσει ο αυτόματος έλεγχος για αναβαθμίσεις. Αυτοματοποιημένος έλεγχος εκσυγχρονισμού Modules αποκλεισμένα από αυτόματο έλεγχο αναβάθμισης - Παρακαλώ περιμένετε… Το URL που εισήγαγες για το αποθετήριο δεν είναι έγκυρο Τα αποθετήρια πρέπει να εξυπηρετούν μέσω HTTPS, και πρέπει να ακολουθούν τις προδιαγραφές που περιγράφονται στην τεκμηρίωση. Τα ακόλουθα modules μπορούν να ενημερωθούν: @@ -325,7 +317,6 @@ Προέκυψε σφάλμα λαμβάνοντας τις πληροφορίες ενημέρωσης. Δοκιμή μηχανισμού λήψης ενημερώσεων Απαίτηση wi-fi ή δικτύου χωρίς μετρήσεις για έλεγχο ενημερώσεων. Προτείνεται να είναι σε λειτουργία αν έχετε περιορισμένα δεδομένα κινητής τηλεφωνίας. - Είσαι μάγος, Χάρι! Συνέχισε να πατάς, ώστε να γίνεις δεκτός στο Hogwarts! Η γλώσσα %s δεν έχει μεταφραστεί. Μπορείτε να μας βοηθήσετε στην μετάφρασή της; Επιτρέψτε μας να παρακολουθούμε τη χρήση και τις εγκαταστάσεις εφαρμογών. Πλήρως συμβατό με το GDPR και χρησιμοποιεί το Matomo, που φιλοξενείται από το Androidacy. diff --git a/app/src/main/res/values-es-rMX/strings.xml b/app/src/main/res/values-es-rMX/strings.xml index 08cfe61..dc5cb67 100644 --- a/app/src/main/res/values-es-rMX/strings.xml +++ b/app/src/main/res/values-es-rMX/strings.xml @@ -60,11 +60,9 @@ Habilitar Monet Info Mostrar licencias - Licencias Mostrar módulos incompatibles Muestra los módulos que son incompatibles con su dispositivo basándose en sus metadatos ¡Magisk está desactualizado! - Repositorios Seguridad Apariencia ¿Desea borrar los archivos del módulo\? @@ -115,8 +113,6 @@ false - 1 - Algunas traducciones del lenguaje seleccionado no están actualizadas, por favor considera contribuir con las traducciones de la aplicación en GitHub Traducido por Leshu7w7, y por Sebastián Informa automáticamente de errores y rendimiento a los desarrolladores @@ -194,9 +190,7 @@ Noticias y actualizaciones Regresa Excluir módulos - Por favor espere… Seguro - Módulos Monet no es compatible con temas transparentes. Comprobación automática de actualizaciones Esta aplicación esta desactualizada. @@ -233,7 +227,6 @@ Ha activado o desactivado un repositorio. Por favor actualice la lista de módulos o reinicie la aplicación. Buscar actualizaciones de aplicaciones Ocurrió un error al descargar la información de actualización. - Enviar y reiniciar No especificó comentarios adicionales. ¡Stacktrace copiado al portapapeles! Premium activo @@ -279,9 +272,7 @@ %1$s v%2$s (%3$d) | %4$s Compilación La clave API ha sido cambiada. Reinicie la aplicación para aplicar los cambios. Necesitamos el permiso de notificaciones para notificarle sobre actualizaciones de aplicaciones y módulos. Si no concede este permiso, no se ejecutarán las comprobaciones de las actualizaciones automáticas. - No se pudo recuperar el token de Androidacy. Por favor, inténtelo de nuevo más tarde. No se pudo validar el token para Androidacy. Por favor, inténtelo de nuevo más tarde. - ¡Eres un mago, Harry! ¡Sigue pulsando para ser admitido en Hogwarts! Presenta reseñas de usuarios, escaneos automáticos de virus, actualizaciones rápidas, una amplia selección y está respaldado por Androidacy. Mucho más laxa que la original. Tiene muchos módulos a costa de cierta seguridad. @@ -357,16 +348,11 @@ El dispositivo no es compatible con el desenfoque Buscar Reiniciar - Reiniciar normalmente Reiniciar a la recuperación Reiniciar al gestor de arranque Reiniciar al modo EDL El reinicio está desactivado en la configuración de la aplicación Error al comunicarse con la API: %d - Actividad expirada - Home - Panel de control - Notificaciones ¡Esta compilación ha expirado! La compilación que estás utilizando ha expirado y ya no se ejecutará. Actualiza a la última versión estable. Descargar lo último diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index e171568..1221239 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -52,11 +52,9 @@ Activar Monet Información Mostrar licencias - Licencias Mostrar módulos incompatibles Mostrar los módulos que probablemente no funcionen en su dispositivo por función de sus meta datos ¡Hay una nueva versión de Magisk para instalar! - Repositorios Seguridad Apariencia Dejar @@ -106,7 +104,6 @@ La aplicación debe reiniciarse para aplicar esta configuración Reiniciar La aplicación se reiniciará para desactivar el punto final de prueba - No se ha podido recuperar el token de Androidacy. Por favor, inténtelo de nuevo más tarde. Actualización de Androidacy bloqueada por Captcha Requiere Android 12+ ¿Borrar los archivos del módulo\? @@ -118,7 +115,6 @@ Durante las pruebas causó problemas a la herramienta de diagnóstico de errores de instalación del módulo, por lo que esta opción se oculta tras el modo de desarrollador. \n¡Active esta opción bajo su propio riesgo! Modo de prueba de Androidacy - Algunas traducciones para el idioma actual no están actualizadas, por favor considere contribuir a las traducciones de la aplicación en GitHub. Español 100% Si desactiva esto, el desarrollador no recibirá informes automáticos de errores, lo que podría dificultar la resolución de problemas La clave API se ha restablecido correctamente Está configurando la aplicación para que utilice un punto final que no es de producción para Androidacy. Esto puede dar lugar a la inestabilidad de la aplicación y a la imposibilidad de cargar el repositorio en línea. NO informe de errores si tiene este interruptor activado. La aplicación se reiniciará para recargar los repos. @@ -215,7 +211,6 @@ Ajustes Habilitar informe de errores Danos más detalles acerca de lo que estabas haciendo cuando esto ocurrió. ¡Cuánto más, mejor! - Enviar y reiniciar Por favor, ayúdanos diciéndonos lo que estabas intentando hacer cuando esto ocurrió. El envío de errores está desactivado. Actívalo para enviar datos. Nombre (Opcional) @@ -241,10 +236,8 @@ Parece que estás ejecutando una versión de depuración. Las versiones de depuración deben de ser actualizadas manualmente, y no se pueden actualizar en la app Módulos que excluir de comprobaciones de actualizaciones automáticas Actualizar aplicación - Por favor espere… Por favor espere mientras comprobamos e instalamos actualizaciones a AMM. Esto puede tardar algunos minutos Compromiso %1$s @ %2$s - Módulos ERROR: Acción inválida especificada. Imposible continuar. Comprobando actualizaciones… Todo actualizado! @@ -327,7 +320,6 @@ Ha ocurrido un error leyendo las preferencias compartidas. Por favor reincia la aplicación. Se necesita wi-fi o una red sin medición para comprobar actualizaciones. Se recomienda dejar activado si tienes datos móviles ilimitados. Notifica cuando hay una actualización disponible - Eres un mago, Harry! Sigue tocando para ser admitido en Hogwarts! No tienes un navegador instalado. Por favor instalar uno para continuar. El seguimiento de pila se puede encontrar a continuación. Sin embargo, recomendamos mucho que utilices el formulario de comentarios que se encuentra a continuación para enviar tus comentarios. De esta manera, en lugar de copiar manualmente el seguimiento de pila, se enviará automáticamente. Además, de esta manera se desofuscará y se informarán automáticamente detalles adicionales. diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index bf4f1cc..e519165 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -35,11 +35,9 @@ Lukustusrežiim väldib halduris moodulite haldamist Info Kuva litsentsid - Litsentsid Kuva ühildumatud moodulid Kuva moodulid, mis ei ühildu metaandmete alusel sinu seadmega Magisk on aegunud! - Hoidlad Kustuta mooduli failid? Säilita failid Kustuta failid diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index 75bd849..9044183 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -34,9 +34,7 @@ مانع از راه اندازی مجدد فعال کردن سیاهی درباره - مجوزها نمایش ماژول‌هایی که بعید است بر اساس فراداده‌هایشان در دستگاه شما کار کنند - مخزن ها امنیت ظاهر فایل های ماژول حذف شود؟ diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 5ef6600..cd6f3c8 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -63,11 +63,9 @@ Activer Monet Infos Afficher les licenses - Licences Afficher les modules incompatibles Afficher les modules qui sont incompatibles avec votre périphérique basé sur leurs métadonnées Il y a une nouvelle version de Magisk à installer ! - Dépôts Sécurité Apparance Supprimer les fichiers du modules \? @@ -129,9 +127,6 @@ false - 1 - Certaines traductions pour la langue actuelle ne sont - pas à jour, merci de considérer une contribution aux traductions sur Github Traduit par xerta555 Soumettre automatiquement les bugs et performances aux développeurs @@ -151,7 +146,6 @@ L\’application nécessite un redémarrage pour appliquer les réglages Redémarrer L\’application sera redémarrée pour dépasser le point de passage de mise à disposition. - La clé n\’a pas pu être retrouvée sur Androidacy. Merci de retenter ultérieurement. La clé n\’a pas pu être validée chez Androidacy. Merci de retenter ultérieurement. Mise à jour d\’Androidacy bloquée par Captcha La clé d\’API à été changée. Redémarrer l\’application pour appliquer les changements. @@ -244,7 +238,6 @@ Cette application n\’est pas une fabrication officielle AMM. Uh-oh, on a un problème! Donnez nous plus de détails à propos de ce qui s\’est passé quand c\’est arrivé. Plus on est foue, plus on rit! - Envoyer et redémarrer Merci de nous aider en nous disant qu\’est ce que vous avez essayé de faire quand c\’est arrivé. Le rapport de plantage est désactivé. Activez le pour envoyer le rapport. Nom (optionel) @@ -270,7 +263,6 @@ Modules à exclure des vérifications de MàJ automatiques MàJ l\’application Merci de patienter pendant que nous vérifions et installons les MàJ pour AMM. Celà peut prendre quelques minutes - Merci de patienter… ERREURE: Donnée invalides reçues au lancement Il semblerait que vous soyez en train d\’utiliser une fabrication de débuggage. Les fabrications de débuggage doivent être MàJ manuellement, et les MàJ incorporées ne sont pas supportées ERREURE: Action spécifiée invalide. Refus de continuer. @@ -308,9 +300,7 @@ ÊTre notifié lorsce qu\’une MàJ de l\’application est trouvée MàJ de l\’application disponible! Une MàJ est disponible pour AMM. Appuyer ici pour MàJ. - Vous êtes un magicien, Harry! Continuez à toquer pour être admis à Poudlard ! - Modules Vous n\’avez pas de navigateur installé. Merci d\’en installer un pour continuer. Vérification de MàJ Requière le wifi pour les vérifications de MàJ diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index d96ee87..94dfd6e 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -41,9 +41,7 @@ मोनेट सक्षम करें जानकारी लाइसेंस दिखाएँ - लाइसेंसेज मैजिस्क का एक नया संस्करण इंस्टॉल करने के लिए उपलब्ध है! - रिपोज़ सुरक्षा फॉक्स का मैजिस्क मॉड्यूल प्रबंधक न तो रूट तक पहुंच सका, न मैजिस्क तक पहुंच सका diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 09d795d..1aad523 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -19,7 +19,6 @@ Fox\'s Magisk Module Manager Nem található root vagy Magisk hozzáférés Nem sikerült letölteni a fájlt - Licencek Elérhető egy újabb Magisk verzió! Nem sikerült törölni a modulfájlokat Magisk beépített modul @@ -27,7 +26,6 @@ Alacsony minőségű modulok mutatása Vannak modulok, amelyek metaadata nem megfelelő, amely vizuális hibákhoz vezet és/vagy a modul gyenge minőségét okozza. \nCsak saját felelősségedre kapcsold be! - Néhány fordítás a jelenlegi nyelvnél nem naprakész. Fontold meg a fordításban való közreműködést GitHub-on Ha letiltod, akkor a fejlesztő nem kapja meg a hibajelzéseket, ami megnehezíti a hibák javítását Engedélyezed az értesítéseket\? Hozzáférés szükséges az értesítésekhez a frissítési értesítések megjelenítéséhez. Ha nem adsz engedélyt, akkor a frissítések keresése nem fog működni a háttérben. @@ -70,7 +68,6 @@ Zárolt üzemmódban az alkalmazás nem tud műveletet végrehajtani a modulokkal Az alkalmazás zárolt üzemmódban van Inkompatibilis modulok megjelenítése - Repok Biztonság Kinézet Törlöd a modulfájlokat\? @@ -178,7 +175,6 @@ Egyedi Androidacy API kulcs használata. Hasznos a prémium előfizetőknek például a reklámos elrejtéséhez. Az alkalmazást úgy állítja be, hogy egy nem-produktív végpontot használjon az Androidacy számára. Ez az alkalmazás instabilitásához és az online repo betöltésének sikertelenségéhez vezethet. Ne jelentsd a hibákat, ha bekapcsolod ez a funkciót. Az alkalmazás újra fog indulni a repók újratöltéséhez. Az alkalmazás újra fog indulni a staging végpont letiltásához - Nem sikerült a token beszerzése az Androidacy-tól. Kérlek próbáld később. Nem sikerült a token validálása az Androidacy-hoz. Kérlek, próbáld újra. Az Androidacy frissítést a Captcha blokkolta Nem sikerült érvényesíteni az API-kulcsot. Kérjük, ellenőrizd és próbálja újra. diff --git a/app/src/main/res/values-id/strings.xml b/app/src/main/res/values-id/strings.xml index 569a7b1..ef8bc6a 100644 --- a/app/src/main/res/values-id/strings.xml +++ b/app/src/main/res/values-id/strings.xml @@ -60,11 +60,9 @@ Nyalakan Monet Info Tampilkan lisensi - Lisensi Tampilkan modul tidak kompatibel Tampilkan modul yang mungkin tidak cocok dengan perangkat Anda berdasarkan metadata developer Versi baru Magisk dapat dipasang! - Repo Keamanan Penampilan Hapus berkas modul ini\? @@ -117,9 +115,6 @@ false - 1 - Beberapa translasi untuk bahasa ini sekarang - kurang diperbarui, mohon pertimbangkan untuk melakukan kontribusi ke translasi aplikasi di GitHub Diterjemahkan dengan WebLate Secara otomatis melaporkan bug dan kinerja kepada pengembang @@ -139,7 +134,6 @@ Aplikasi butuh diluncurkan ulang untuk menerapkan setelan Luncurkan ulang Aplikasi akan diluncurkan ulang untuk mematikan endpoint staging - Tidak dapat mendapatkan token dari Androidacy. Mohon dicoba lagi nanti. Tidak dapat melakukan validasi terhadap token dari Androidacy. Mohon dicoba lagi nanti. Pembaruan Androidacy terblokir oleh Captcha Kunci API telah diganti. Luncurkan ulang aplikasi untuk menerapkan perubahan. @@ -233,7 +227,6 @@ Aplikasi ini adalah build AMM yang tidak resmi. Uh-oh, kita terkena sebuah halangan! Beritahu kita detail lebih lanjut dalam apa yang sedang Anda lakukan. Semakin banyak, semakin bagus! - Kirim dan luncurkan ulang Tolong bantu kami dengan memberitahu apa yang sedang Anda lakukan saat ini terjadi. Laporan kesalahan dimatikan. Aktifkan untuk mengirim masukan. Nama (opsional) @@ -259,7 +252,6 @@ Modul-modul dikecualikan dari cek pembaruan otomatis Perbarui aplikasi Harap menunggu sementara kami mengcek pembaruan dan memasang pembaruan AMM. Ini mungkin akan membutuhkan beberapa menit - Mohon menunggu… KESALAHAN: Data tidak valid diterima saat meluncur Anda sepertinya menjalankan sebuah build debug. Build debug harus diperbarui secara manual, dan tidak mendukung pembaruan dalam aplikasi KESALAHAN: Tindakan yang ditentukan tidak valid. Menolak dan tidak akan melanjutkan. @@ -297,9 +289,7 @@ Beritahu jika ada pembaruan aplikasi Ada pembaruan aplikasi! Ada sebuah pembaruan untuk AMM. Ketuk disini untuk memperbarui. - Kamu adalah penyihir, Harry! Ketuk terus untuk masuk ke dalam Hogwarts! - Modul Anda tidak punya browser yang terpasang di perangkat Anda. Mohon memasang satu sebelum melanjutkan. Periksa pembaruan Membutuhkan Wi-Fi untuk memeriksa pembaruan @@ -349,13 +339,9 @@ Tingkatkan Manajer Modul Androidacy AMM - Notifikasi Unduh versi terbaru Versi Manager telah kedaluwarsa! Versi yang Anda gunakan telah kedaluwarsa dan tidak dapat digunakan lagi. Mohon untuk segera perbarui ke versi stabil terbaru. - Beranda - Pedoman - Aktivitas telah Kedaluwarsa Sebagian besar modul harus dicopot pemasangannya, kemudian dipasang kembali dengan bersih. Karena alasan ini, AMM tidak mendukung pemasangan ulang modul saat modul tersebut terpasang pada perangkat. Log tersimpan Gagal membuka catatan modul. Mungkin log tahu alasannya. @@ -369,7 +355,6 @@ AMM versi debug %1$s dibuat dari %2$s dengan sisa waktu %3$d hari %s tersedia di repo online. Kami sangat merekomendasikan Anda untuk memasang ulang modul secara bersih karena sebagian besar modul tidak menangani pemasangan ulang dengan baik, tetapi Anda masih dapat memasang secara langsung dengan risiko ditanggung Anda. Anda akan memulai ulang ke mode EDL, mode khusus yang ditujukan untuk OEM untuk mem-flash dan memperbaiki masalah tingkat rendah. Kecuali jika Anda yakin ingin melakukan hal ini dan memiliki alat yang diperlukan untuk keluar dari mode ini atau menggunakannya, kami sangat menyarankan Anda untuk menggunakan opsi mulai ulang lainnya. - Mulai ulang sistem Tidak dapat mengirim masukan - tidak ada ID event dari Sentry. Event terakhir mungkin tidak terkirim. Versi ini telah kedaluwarsa. Mohon perbarui ke versi terbaru. EULA dan ketentuan diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 3a77797..d791012 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -59,11 +59,9 @@ Abilita Monet Informazioni Mostra licenze - Licenze Mostra moduli incompatibili Mostra i moduli che in base ai metadati sono incompatibili con il tuo dispositivo Nuova versione di Magisk da installare! - Repository Sicurezza Aspetto Rimuovere i dati del modulo? @@ -112,8 +110,6 @@ false - 1 - Alcune traduzioni per la lingua corrente non sono aggiornate, ti preghiamo di considerare di contribuire alle traduzioni dell\'app su GitHub Traduzione di CRANKV2 Segnala automaticamente problemi e prestazioni agli sviluppatori @@ -129,7 +125,6 @@ Stai impostando l\'app in modo che utilizzi un endpoint non di produzione per Androidacy. Ciò potrebbe comportare l\'instabilità dell\'app e il mancato caricamento del repository online. NON segnalare bug se hai attivato questo interruttore. L\'app verrà riavviata per ricaricare i repository. La chiave API è stata modificata. Riavvia l\'app per applicare le modifiche. Abbiamo bisogno dell\'autorizzazione per le notifiche per informarti sugli aggiornamenti di app e moduli. Se non concedi questa autorizzazione, i controlli automatici degli aggiornamenti non verranno eseguiti. - Impossibile recuperare il token da Androidacy. Per favore riprova più tardi. Impossibile convalidare il token per Androidacy. Per favore riprova più tardi. Aggiornamento Androidacy bloccato da Captcha Collegamento copiato @@ -210,7 +205,6 @@ Impossibile caricare il file zip Commit %1$s @ %2$s Nessun file fornito mentre si prova ad aprire il file zip. - Perfavore aspetta… Collaboratori Fox2Code è il creatore originale dell\'app. Senza di lui, questo non sarebbe mai stato possibile. Creato da Fox2Code @@ -223,7 +217,6 @@ Reimposta le chiavi API Passa a premium Abbiamo avuto un problema! - Invia e riavvia Perfavore aiutaci dicendoci cosa stavi facendo quando è accaduto. La segnalazione degli arresti anomali è disattivata. Abilitala per inviarci dei feedback. Nome (opzionale) @@ -273,9 +266,7 @@ Moduli da escludere dal controllo automatica degli aggiornamenti Si prega di attendere mentre controlliamo e installiamo gli aggiornamenti di AMM. L\'operazione potrebbe richiedere alcuni minuti Cercando aggiornamenti… - Sei un mago, Harry! Continua a premere per essere ammesso ad Hogwarts! - Moduli Non hai un browser installato. Installane uno per continuare. L\'URL della repo non è corretto Le repository devono essere su protocollo HTTPS, e devono seguire le specifiche della documentazione. diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index ad16bfe..37835aa 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -21,10 +21,8 @@ ロックダウンモードはモジュール処理の実行を禁止します 情報 ライセンスを表示 - ライセンス 互換性のないモジュールを表示 メタデータを基に、このデバイスと互換性がないモジュールを表示します - リポジトリ モジュールファイルを削除しますか\? 保持 削除 @@ -145,7 +143,6 @@ フルバージョンをダウンロード 一部のリポジトリのアップデートに失敗しました これを無効にすると、開発者にバグ報告がされず、問題の解決が難しくなるかもしれません - Androidacy からトークンを受け取れませんでした。後ほど再度お試しください。 Androidacy に使用するトークンを検証できませんでした。後ほど再度お試しください。 Captcha によって Androidacy のアップデートがブロックされています リンクをコピーしました @@ -155,7 +152,6 @@ 自動でモジュールのアップデートを確認 バッテリーの減りが早くなる可能性があります 通知をテスト - 現在の言語の翻訳の一部は最新ではありません。GitHub からアプリの翻訳にご協力ください 翻訳: Fox2Code (Suu, Re*Index.) 自動でバグとパフォーマンスを開発者に送信する Androidacy API キー @@ -206,7 +202,6 @@ API キーをリセット プレミアムにアップグレード プレミアムにアップグレードすると、Androidacy リポジトリでの広告とCaptchaの削除、モジュール作者のサポートなどができます。 - 送信して再起動 名前(オプション) メールアドレス(オプション) 追加のフィードバック情報が入力されていません。 @@ -246,7 +241,6 @@ 自動アップデートチェックから除外するモジュール アプリをアップデート AMM のアップデートをインストールしています。数分かかることがあります - お待ちください… エラー: 起動中に無効なデータを受け取りました デバッグ用のビルドで実行しています。アプリが自動で更新されないため、手動で更新してください エラー: 無効なアクションが指定されました。このアクションを無視して続行します。 @@ -284,9 +278,7 @@ アプリのアップデートが利用可能な場合に通知します アプリのアップデートが利用可能です! AMM のアップデートが利用可能です。ここをタップしてアップデートします。 - モジュール ブラウザーがインストールされていません。続行するにはインストールしてください。 - あなたはハリーみたいな魔法使いだよ! ホグワーツに入学したいならタップを続けてね! アップデートチェック アップデートを確認するには Wi-Fi または容量無制限のネットワークに接続してください @@ -323,10 +315,6 @@ LGPL-3.0 (https://www.gnu.org/licenses/lgpl-3.0.en.html) と EULA (https://www.androidacy.com/foxmmm-eula/) ライセンスに同意することになります。第三者からの条件も含め、このアプリの開発者はアプリ使用時に発生した問題に関する一切の責任を負いません。また、それに関わる保証も提供しません。 完了ボタンを有効化するには、下にスクロールして EULA とライセンスに同意する必要があります。 EDL モードは OEM が低レベルの問題を修正するための特別な機能です。EDL モードを解除したり、必要なツールをお持ちでない限りは他の再起動オプションを使用する事を強く推奨します。 - ExpiredActivity - ホーム - ダッシュボード - 通知 このビルドは期限切れです! 使用中のビルドは有効期限が切れており、実行はできません。最新の安定版ビルドに更新してください。 最新のダウンロード @@ -358,7 +346,6 @@ バックグラウンドでの確認の頻度 バックグラウンドでアップデートを確認する頻度です。値を低く設定し過ぎるとバッテリーの消耗が激しくなる可能性があります。 再起動 - 通常の再起動 リカバリーで再起動 ブートローダーで再起動 EDL モードで再起動 diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index bfa335e..e17a5af 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -6,7 +6,6 @@ 재시작 방지 Monet 활성화 라이센스 보기 - 라이센스 설치할 수 있는 새로운 버전의 Magisk가 있습니다! 보안 삭제 @@ -58,7 +57,6 @@ 저장소 관리 배터리 사용량을 늘릴 수 있습니다 잠금 모드 - 현재 언어의 몇몇 변역이 최신이 아닙니다. GitHub에서 변역에 기여해주세요 잠금 모드는 관리자가 모듈 작업을 수행하지 못하도록 막습니다 예지치 않은 재시작 방지 정보 @@ -66,7 +64,6 @@ 호환되지 않는 모듈 표시하기 경고! 메타데이터 상 기기에서 작동하지 않을 수 있는 모듈 표시 - 레포 외양 Androidacy 비 상용 엔드포인트를 사용하도록 앱을 설정하고 있습니다. 이로 인해 앱이 불안정해지고 온라인 저장소를 로드하지 못할 수 있습니다. 이 스위치가 켜져 있으면 버그를 보고하지 마십시오. 저장소를 다시 로드하기 위해 앱이 다시 시작됩니다. 변경사항을 적용하기 위해 앱을 다시 시작하겠습니까\? @@ -121,7 +118,6 @@ 지원 기부 안드로이드 12 이상 필요 - Androidacy에서 토큰을 가져올 수 없습니다. 나중에 다시 시도해 주세요. Androidacy 토큰을 검증할 수 없습니다. 나중에 다시 시도해 주세요. 입력한 API 키가 지금 사용중인 것과 동일합니다. 알림을 허용하시겠습니까\? @@ -225,7 +221,6 @@ 프리미엄으로 업그레이드하면 Androidacy 저장소에 대한 광고, 보안 문자 및 다운로드가 제거되고 Androidacy 및 모듈 제작자가 지원됩니다. 어-오, 뭔가 이상해 졌어요! 이 일이 발생했을 때에 대해 자세히 알려주십시오. 자세할수록 더 편리해질 것입니다! - 제출 및 다시 시작 스택트레이스를 클립보드에 복사했습니다! 스택트레이스: \n%1$s @@ -238,7 +233,6 @@ 업데이트에서 제외될 모듈 목록 앱 업데이트 AMM에 대한 업데이트를 확인하고 설치하는 동안 잠시 기다려 주십시오. 이 작업은 몇 분 정도 걸릴 수 있습니다 - 잠시 가다려주세요… 에러: 실행중 옳지 않은 정보를 받았습니다 디버그 빌드를 실행 중인 것 같습니다. 디버그 빌드는 수동으로 업데이트해야 하며 인앱 업데이트를 지원하지 않습니다 업데이트 발견 diff --git a/app/src/main/res/values-land/dimens.xml b/app/src/main/res/values-land/dimens.xml index c4b30cc..856413a 100644 --- a/app/src/main/res/values-land/dimens.xml +++ b/app/src/main/res/values-land/dimens.xml @@ -2,4 +2,4 @@ ~ 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 + \ No newline at end of file diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index 0d38ef4..4918cea 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -36,11 +36,9 @@ Nedlåst modus forhendrer behandleren fra å utføre handlinger på moduler Info Vis lisenser - Lisenser Vis inkompatible moduler Vis moduler som antagelig ikke virker basert på deres metadata Magisk er utdatert! - Pakkebrønner Slett modulfilene? Behold Slett @@ -57,7 +55,7 @@ Din nåværende filvelger kunne ikke innvilge tilgang til filen. Fjerninstallering Filvelgeren din returnerte et uventet svar. - Bruk «magisk --install-module»-kommandoen + Bruk «magisk —install-module»-kommandoen Under testing forårsaket diagnoseverktøyet for modulinstallasjoner problemer, så dette alternativet er skjult bak utviklingsmoduset. Bruk det på egen risiko! @@ -122,7 +120,6 @@ Krasj programmet i testøyemed Start programmet på ny for å ta i bruk endringer\? Kan bruke mer batteri - Noen oversettelser er ikke oppdatert. Bidra på Weblate fra https://translate.nift4.org Rapporter feil og ytelse til utviklerne API-nøkkel tilbakestilt Programmet må startes på ny for å bruke denne innstillingen @@ -136,7 +133,6 @@ Denne modulen krever at ramdisk er isntallert Denne pakkebrønnen kan vise reklame for å dekke tjener- og utviklingskostnader. Kunne ikke bekrefte symbol for Androidacy. Prøv igjen senere. - Kunne ikke hente symbol fra Androidacy. Prøv igjen senere. Oppgradering til ny versjon av Androidacy blokkert av CAPTCHA Lenke kopiert \ No newline at end of file diff --git a/app/src/main/res/values-ne/strings.xml b/app/src/main/res/values-ne/strings.xml index 836f7dd..68666df 100644 --- a/app/src/main/res/values-ne/strings.xml +++ b/app/src/main/res/values-ne/strings.xml @@ -26,7 +26,6 @@ राख्ने मेटाउने हुलिया - अनुमतिपत्रहरु न्युनतम म्याजिस्क %s न्युनतम एन्ड्रोइड अधिकतम एन्ड्रोइड @@ -51,7 +50,6 @@ यो एप पुरानो भएको छ । कृपया यो एपलाई नयां संस्करणमा अध्यावधिक गर्नुहोस । %s स्थापित गर्ने\? - कृपया पर्खनुहोस् … प्रतिकृया सफलतापूर्वक बुझाईयो । हामी छिटै पुनरावृति गर्नेछौं कृपया पर्खनुहोस् चेतावनि! diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index e6e21a6..4b5195a 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -47,10 +47,8 @@ Activeer Monet Info Toon licenties - Licenties Toon modules die volgens de metadata mogelijk niet werken op je toestel Er is een nieuwe versie van Magisk beschikbaar! - Pakketbeheerders Beveiliging Uiterlijk Modulebestanden verwijderen\? @@ -149,11 +147,9 @@ \nSchakel dit uit op eigen risico! Deze pakketbeheerder kan een aantal niet-intrusieve reclameboodschappen weergeven om de server- en ontwikkelingskosten te dekken. Beschikt over beoordelingen, automatische virusscans en meer. Automatische updatecontrole van modules - Sommige vertalingen voor de huidige taal zijn niet up-to-date, overweeg om bij te dragen aan de app-vertalingen op GitHub Als je dit uitschakelt, krijgt de ontwikkelaar geen automatische bugrapporten en dit kan het oplossen van problemen bemoeilijken Valideren Je stelt de app in om een niet-productie-eindpunt voor Androidacy te gebruiken. Dit kan leiden tot instabiliteit van de app en het niet laden van de online pakketbeheerder. Meld GEEN bugs als u deze schakelaar hebt ingeschakeld. De app wordt opnieuw gestart om pakketbeheerders opnieuw te laden. - Kan token niet ophalen van Androidacy. Probeer het later opnieuw. API-sleutel is gewijzigd. Start de app opnieuw om wijzigingen toe te passen. We hebben de toestemming voor meldingen nodig om je op de hoogte te stellen van app- en module-updates. Als je deze machtiging niet verleent, worden er geen automatische controles van updates uitgevoerd. Transparante thema\'s kunnen enkele inconsistenties hebben en werken mogelijk niet op alle ROM\'s. Bovendien worden Monet en vervaging uitgeschakeld. Je kan dit op elk gewenst moment wijzigen. @@ -171,7 +167,6 @@ Modules uitgesloten van automatische updatecontroles App bijwerken Even geduld terwijl we controleren op updates voor AMM en deze installeren. Dit kan enkele minuten duren - Even geduld… Verwijder app data App data verwijderen\? Je staat op het punt de app-gegevens te wissen. Bevestig deze actie. @@ -189,9 +184,7 @@ Kan logboeken niet opslaan AMM logs delen Deze app is geen officiële AMM build. - Je bent een tovenaar, Harry! Blijf tikken om toegelaten te worden tot Zweinstein! - Modules Je hebt geen browser geïnstalleerd. Installeer er een om door te gaan. Thema Systeem @@ -207,7 +200,6 @@ Upgraden naar premium verwijdert advertenties, captcha\'s en downloads voor de Androidacy Repository en ondersteunt Androidacy en de auteurs van de module. Oh-oh, er zit een addertje onder het gras! Geef ons meer details over wat je deed toen dit gebeurde. Hoe meer, hoe beter! - Verzenden en opnieuw opstarten Help ons alsjeblieft door ons te vertellen wat je probeerde te doen toen dit gebeurde. Crashrapportage is uitgeschakeld. Schakel deze in om feedback te verzenden. Naam (optioneel) diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 535aca8..32103f8 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -56,11 +56,9 @@ Silnik motywu Monet Informacje Pokaż licencje - Licencje Pokaż niekompatybilne moduły Wyświetl moduły niezgodne z tym urządzeniem na podstawie ich metadanych Pojawiła się nowa wersja Magiska do zainstalowania! - Repozytoria Zabezpieczenia Wygląd Usunąć pliki modułu? @@ -109,8 +107,6 @@ false - 1 - Niektóre tłumaczenia dla bieżącego języka nie są aktualne, prosimy o rozważenie wniesienia wkładu do tłumaczeń aplikacji na GitHubie Tłumaczenie: Daviteusz Raportowanie błędów @@ -130,7 +126,6 @@ Aby wyłączyć punkt końcowy staging, aplikacja zostanie ponownie uruchomiona Aby zastosować to ustawienie, aplikacja zostanie ponownie uruchomiona Uruchom ponownie - Nie można pobrać tokena z Androidacy. Proszę spróbować ponownie później. Nie można zweryfikować tokena dla Androidacy. Proszę spróbować ponownie później. Aktualizacja Androidacy została zablokowana przez Captcha Łącze zostało skopiowane @@ -223,7 +218,6 @@ Stworzone przez Fox2Code Zapisz logi do pamięci wewnętrznej i udostępnij Nie można zapisać logów - Prześlij i restartuj Pomóż nam, informując o wykonywanych czynnościach, gdy to się stało. Raportowanie błędów jest wyłączone. Włącz, aby przesłać informacje zwrotne. Imię (opcjonalnie) @@ -246,7 +240,6 @@ Ignorowane moduły ze sprawdzania aktualizacji Zaktualizuj aplikację Proszę poczekać, aż sprawdzimy i zainstalujemy aktualizacje dla AMM. Może to potrwać kilka minut - Proszę czekać… To całkowicie wyczyści dane aplikacji, lecz moduły pozostaną nietknięte. BŁĄD: Nieprawidłowe dane otrzymane przy uruchomieniu Wygląda na to, że używasz wersji debugowanej. Kompilacje debugowe muszą być aktualizowane ręcznie i nie obsługują aktualizacji w aplikacji @@ -290,9 +283,7 @@ Aktualizacje aplikacji Dostępna nowa wersja aplikacji! Dostępna jest nowa wersja AMM. Kliknij, aby zaktualizować. - Moduły Nie masz zainstalowanej przeglądarki. Zainstaluj ją, aby kontynuować. - Jesteś czarodziejem, Harry! Stukaj dalej, aby zostać przyjętym do Hogwartu! Wymagaj sieci WiFi Pozwól na analizę aplikacji @@ -351,19 +342,14 @@ Urządzenie nie obsługuje blur Restartuj Szukaj - Restartuj system Restartuj do recovery Restartuj do trybu EDL Restart jest wyłączony w ustawieniach aplikacji Błąd podczas komunikacji z API: %d - Główna - Pulpit - Powiadomienia Ta wersja wygasła! Pobierz najnowszą Pomyślnie zapisano logi Za chwilę nastąpi restart do trybu EDL, specjalnego trybu przeznaczonego dla producentów OEM do flashowania i naprawiania problemów niskiego poziomu. O ile nie jesteś pewien, że chcesz to zrobić i nie masz niezbędnych narzędzi, aby wyjść z tego trybu lub go użyć, zdecydowanie zachęcamy do korzystania z innych opcji restartu. - ExpiredActivity Używana wersja wygasła i nie będzie już działać. Prosimy o aktualizację do najnowszej stabilnej wersji. Prześlij opinię Wykryto potencjalne przechwycenie SSL. diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index a02343a..b5c53d6 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -58,11 +58,9 @@ Ativar tema Monet Informações Exibir licenças - Licenças Exibir módulos incompatíveis Exibe os módulos incompatíveis com seu dispositivo com base em seus metadados Há uma nova versão do Magisk disponível! - Repositórios Segurança Aparência Apagar os arquivos de módulos\? @@ -108,8 +106,6 @@ false - 1 - Algumas traduções para seu idioma atual não estão atualizadas. Por favor, considere contribuir para as traduções do aplicativo no GitHub Traduzido por HardcodedCat, mi007d e DanGLES3 O acesso root foi recusado pelo aplicativo do Magisk @@ -158,7 +154,6 @@ Baixar versão completa Alguns repositórios falharam ao atualizar Se desativar isso, o desenvolvedor não irá receber relatórios de falhas automaticamente, e isso pode tornar a resolução mais difícil - Não foi possível obter o token do Androidacy. Por favor, tente novamente mais tarde. Não foi possível validar token do Androidacy. Por favor, tente novamente mais tarde. Chave de API do Androidacy Utilizar uma chave de API customizada para o Androidacy. Útil para usuários premium, remover anúncios e mais. @@ -206,14 +201,11 @@ Um grande salve a Androidacy por sua integração e contribuições para o aplicativo. Modulos a serem excluídos das buscas automáticas por atualizações Atualizar aplicativo - Por favor aguarde… Criado por Fox2Code Salvar registros no armazenamento e compartilhar Não foi possível salvar os registros Compartilhar registros do AMM - Tu é um mago, Harry! Continue pressionando para ser admitido em Hogwarts! - Módulos E claro, obrigado a todos os nossos contribuidores, seja em traduções, código, ou apenas sendo divertidos! Nós amamos todos vocês. Os seguintes repositórios falharam ao atualizar: \n @@ -224,7 +216,6 @@ Contribuidores Fox2Code é o desenvolvedor original do aplicativo. Sem ele, isso nunca seria possível. Este aplicativo é uma compilação não oficial do AMM. - Enviar e reinicializar Por favor, ajude-nos dizendo o quê você estava tentando fazer quando isto aconteceu. O Relatório de falhas está desabilitado. Habilite-o para enviar o feedback. Nome (opcional) @@ -345,10 +336,6 @@ Androidacy Premium oferece downloads mais rápidos, uma experiência sem anúncios e muito mais! Atualizar O registro de falhas pode ser encontrado abaixo. No entanto, nós recomendados fortemente que utilize o formulário de feedback abaixo ao invés disso. Desta forma, ao invesde manualmente copiar o registro de falhas, nos enviará automaticamente. Desta forma também, tudo estará desofuscado e detalhes adicionais serão relatados automaticamente. - Atividade Expirada - Tela Inicial - Painel - Notificações Essa versão expirou! A versão que você está usando expirou e não pode mais ser usada. Por favor atualize para a última versão estável. Baixar a última versão @@ -371,7 +358,6 @@ Essa versão expirou. Por favor atualize para a última versão. EULA e termos Reiniciar - Reiniciar normalmente Reiniciar ao recovery Reiniciar ao bootloader Reiniciar ao modo EDL diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index 4448a93..7c3428c 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -2,4 +2,4 @@ ~ 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 + \ No newline at end of file diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 795c89f..bc8ca2e 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -22,12 +22,10 @@ Ativar tema Monet Informações Exibir licenças - Licenças Exibir módulos incompatíveis Exibe os módulos incompatíveis com seu dispositivo com base em seus metadados Previnir reinicialização Tema - Repositórios Segurança Aparência Sistema @@ -104,7 +102,6 @@ O aplicativo precisar reiniciar para aplicar essa configuração Reiniciar O aplicativo será reinicializado para desativar o servidor de testes - Não foi possível obter o token do Androidacy. Por favor, tente novamente mais tarde. Atualização do Androidacy bloqueado por Captcha A Chave de API foi alterada. Reinicie o aplicativo para aplicar as mudanças. Permitir notificações\? @@ -171,7 +168,6 @@ Compartilhar registros do AMM Este aplicativo é uma compilação não oficial do AMM. Ah não, algo deu errado! - Enviar e reinicializar Por favor, ajude-nos dizendo o quê você estava tentando fazer quando isto aconteceu. O Relatório de falhas está desabilitado. Habilite-o para enviar o feedback. Nome (opcional) @@ -196,7 +192,6 @@ Atualizações Modulos a serem excluídos das buscas automáticas por atualizações Atualizar aplicativo - Por favor aguarde… ERRO: Ação inválida especificada. Recusando a continuar. Atualização disponível Buscando por atualizações… @@ -226,8 +221,6 @@ Atualizações do aplicativo Notifica quando uma atualização do aplicativo está disponível Atualização do aplicativo disponível! - Tu é um mago, Harry! - Módulos Você não possui um navegador instalado. Por favor instale um para continuar. Busca por atualizações Exigir wifi ou uma conexão ilimitada para buscar por atualizações @@ -304,7 +297,6 @@ O idioma %s não foi traduzido. Gostaria de ajudar a traduzi-lo\? Um erro ocorreu ao carregar as preferências compartilhadas. Por favor, limpe os dados do aplicativo. Adiciona um efeito de desfoque atrás de alguns diálogos e elementos. Perceba que o desfoque pode funcionar incorretamente em alguns dispositivos e pode não funcionar para todos. - Algumas traduções para seu idioma atual não estão atualizadas. Por favor, considere contribuir para as traduções do aplicativo no GitHub Você está configurando o aplicativo para usar um servidor de testes do Androidacy. Isso pode resultar em instabilidade no aplicativo e falha ao carregar o repositório online. NÃO reporte falhas se você tiver esta opção habilitada. O aplicativo será reinicializado para recarregar os repositórios. Fox2Code é o desenvolvedor original do aplicativo. Sem ele, isso nunca seria possível. Uma reinicialização é necessária para ativar o modo showcase. diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 63df5b3..bf85aa8 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -57,11 +57,9 @@ Activează Monet Informații Afișează licențe - Licențe Arată modulele incompatibile Arată module incompatibile cu dispozitivul tău pe baza metadatelor lor Există o nouă versiune Magisk de instalat! - Depozite Securitate Aspect Ștergi fișierele modulului? @@ -114,8 +112,6 @@ Notificare test - Unele traduceri pentru limba curentă - nu sunt actualizate, vă rugăm să luați în considerare contribuția la traducerea aplicației pe GitHub Tradus de ygorigor Raportează automat dezvoltatorilor erorile și performanțele @@ -136,7 +132,6 @@ Repornire Aplicația va fi repornită pentru a dezactiva finalizarea etapelor Link copiat - Nu s-a putut prelua token-ul de la Androidacy. Vă rugăm să încercați din nou mai târziu. Nu s-a putut valida token-ul pentru Androidacy. Vă rugăm să încercați din nou mai târziu. Actualizare Androidacy blocată de Captcha În această versiune lipsesc cheile client pentru Androidacy Repo. Descărcați versiunea GitHub dacă doriți să beneficiați de funcții precum recenzii de module, verificări automate de securitate și multe altele. diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index f06367a..100de41 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -53,11 +53,9 @@ Цвета из Monet Информация Показать лицензии - Лицензии Несовместимые модули Показывать модули, несовместимые с вашим устройством (исходя из метаданных) Установите новую версию Magisk! - Репозитории Безопасность Внешний вид Удалить загрузочные файлы? @@ -96,7 +94,6 @@ Свой URL Ссылка скопирована Может увеличить расход батареи - Некоторые переводы для текущего языка не обновлены. Пожалуйста, внесите свой вклад, улучшив их на GitHub Если вы отключите эту функцию, разработчик не будет получать автоматические сообщения об ошибках, что может затруднить поиск и устранение неисправностей Ключ API действителен. Вы настраиваете приложение на использование непроизводственной конечной точки для Androidacy. Это может привести к нестабильности приложения и невозможности загрузить онлайн-репо. НЕ сообщайте об ошибках, если у вас включён этот переключатель. Приложение будет перезапущено для перезагрузки репозиториев. @@ -111,7 +108,6 @@ Найдены обновления модулей: %1$d Использовать подмену конечной точки Androidacy вместо релизной конечной точки. (Требуется перезапуск приложения) Ключ API Androidacy - Не удалось получить токен из Androidacy. Пожалуйста, повторите попытку позже. Не удалось проверить токен для Androidacy. Пожалуйста, повторите попытку позже. Обновление Androidacy заблокировано капчей Автоматическая проверка обновлений модулей @@ -222,7 +218,6 @@ Похоже, отчёты о сбоях отключены. Пожалуйста, включите их, чтобы отправить отзыв. О-о, мы попали в ловушку!= Расскажите нам подробнее о том, что вы делали, прежде чем это произошло. Чем больше – тем лучше! - Отправить и перезапустить Отчёты о сбоях отключены. Включите их, чтобы отправить отзыв. Имя (необязательно) Электронная почта (необязательно) @@ -242,7 +237,6 @@ Ключ API имеет неверный формат Модули, которые следует исключить из автоматической проверки обновлений Обновиться - Подождите… Подождите, пока мы проверим и установим обновления для AMM. Это может занять несколько минут Список модулей для исключения из проверки обновлений Исключить модули @@ -284,8 +278,6 @@ Уведомляет, когда доступно обновление приложения Доступно обновление приложения! Доступно обновление для AMM. Нажмите здесь, чтобы обновить. - Модули - Ты волшебник, Гарри! Продолжайте нажимать, чтобы поступить в Хогвартс! У вас не установлен браузер. Пожалуйста, установите его, чтобы продолжить. Проверка обновлений @@ -346,14 +338,9 @@ Перезагрузка в рекавери Перезагрузка отключена в настройках приложения Поиск - Обычная перезагрузка Ошибка при обмене данными с API: %d Перезагрузка в загрузчик Перезагрузка в режим EDL - Просроченная активность - Главная - Доска - Уведомления Эта сборка устарела! Скачать последнюю Журнал успешно сохранён diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 0c71ea9..e868011 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -35,11 +35,9 @@ Obmedzený režim bráni správcovi vykonávať akcie s modulmi Info Zobraziť licencie - Licencie Zobraziť nekompatibilné moduly Zobraziť moduly, ktoré nie sú podľa ich metadát kompatibilné s vaším zariadením Magisk je zastaralý! - Úložisko Zmazať súbory modulu? Ponechať súbory Zmazat soubory @@ -128,7 +126,6 @@ Niektoré repozitáre sa nepodarilo aktualizovať Zabezpečenie Vývojárský režim vypnutý - Androidacy token sa nedá načítať. Prosím skúste to neskôr. Androidacy token sa nedá overiť. Prosím skúste to neskôr. Ak toto zakážete, vývojár nedostane automatické správy o chybách, čo môže sťažiť odstraňovanie problémov Aktualizáciu Androidacy blokuje Captcha @@ -139,7 +136,6 @@ Kontrola aktualizácií modulov v pozadí Môže zvýšiť spotrebu batérie Skúška upozornení - Niektoré preklady pre aktuálny jazyk môžu býť staršie, zvážte prosím príspevok na preklady aplikácií na GitHube Translated by PhSnake Automaticky hlásiť chyby a výkon vývojárom API kľúč Androidacy diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 6bc7e0b..6d3d522 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -66,7 +66,6 @@ Bryt text till fler rader istället för att visa allt på samma rad när moduler installeras. Detta förråd kan komma att visa icke-påträngande annonser för att täcka server- och utvecklingskostnader. Erbjuder betyg, viruskontroller, mm. Använd Androidacys provmiljö istället för produktion. (Orsakar omstart av appen) - Vissa översättningar för nuvarande språk är inte uppdaterade, överväg gärna att bidra till översättningar på GitHub En ny version av appen finns att tillgå Ingen beskrivning hittades. Hämta modul @@ -85,11 +84,9 @@ Kräver Android 12+ Starta om Språk - Licenser Visa inkompatibla moduler Visa moduler som troligen inte fungerar på din enhet baserat på deras metadata Den ny version av Magisk går att installera! - Förråd Säkerhet Utseende Radera modulens filer\? @@ -127,7 +124,6 @@ Appen måste startas om för att verkställa den här inställningen Omstart Appen startas om för att inaktivera icensättningsslutpunkten - Kunde inte erhålla token från Androidycy. Försök igen senare. Kunde inte validera token för Androidycy. Försök igen senare. Androidacyuppdatering blockerades av Captcha Api-nyckeln har ändrats. Starta om appen för att verkställa ändringarna. diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 507232b..f24e7cb 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -61,11 +61,9 @@ Monet\'i etkinleştir Bilgi Lisansları göster - Lisanslar Desteklenmeyen modülleri göster Metaveri\'ye bağlı olarak cihazınızla uyumlu olmayan modülleri gösterir Magisk\'in yüklenecek yeni bir sürümü var! - Depolar Güvenlik Görünüm Modül dosyalarını sil? @@ -119,8 +117,6 @@ false - 1 - Mevcut dil için bazı çeviriler güncel değil, lütfen GitHub\'daki uygulama çevirilerine katkıda bulunmayı düşünün tarafından çevrildi Geliştiricilere performans ve hataları otomatik olarak bildir @@ -140,7 +136,6 @@ Bu ayarı uygulamak için uygulamanın yeniden başlatılması gerekli Yeniden başlat Uygulama, endpoint\'i devre dışı bırakmak için yeniden başlatılacaktır - Androidacy\'den jeton alınamadı. Lütfen sonra tekrar deneyin. Androidacy için jeton doğrulanamadı. Lütfen sonra tekrar deneyin. Link kopyalandı API anahtarı değiştirildi. Değişiklikleri uygulamak için uygulamayı yeniden başlatın. @@ -233,13 +228,11 @@ Günlükler kaydedilemedi AMM günlüklerini paylaş Bu uygulama resmi olmayan AMM yapımıdır. - Lütfen bekleyin… Güncelleme kontrollerinden hariç tutulacak modüllerin listesi Otomatik güncelleme kontrollerinden hariç tutulacak modüller Uygulamayı güncelle AMM güncellemelerini kontrol edip yüklerken lütfen bekleyin. Bu işlem birkaç dakika sürebilir Uh-oh, bir engele takıldık! - Gönder ve yeniden başlat Lütfen bu olay olduğunda ne yapmaya çalıştığınızı anlatarak bize yardımcı olun. İsim (isteğe bağlı) E-posta (isteğe bağlı) diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 4fd3f7a..9fc9dd4 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -42,10 +42,8 @@ Увімкнути Monet Інформація Показати ліцензії - Ліцензії Показати несумісні модулі Потрібно встановити нову версію Magisk! - Репозиторії Безпека Зовнішній вигляд Видалити файли модуля\? @@ -93,7 +91,6 @@ Перезапустити додаток, щоб застосувати зміни\? Додаток необхідно перезавантажити, щоб застосувати цю опцію Перезавантажити - Не вдалося отримати маркер із Androidacy. Будь-ласка спробуйте пізніше. Оновлення Androidacy заблоковано Captcha Fox\'s Magisk Менеджер Модулів Відмовлено у root-доступі через додаток Magisk @@ -117,7 +114,6 @@ Показувати текст у кількох рядках замість розміщення всього тексту в одному рядку під час встановлення модуля. Це сховище може відображати деяку ненав’язливу рекламу для покриття витрат на сервер і розробку. Включає огляди, автоматичне сканування на віруси тощо. Використовуйте проміжну кінцеву точку Androidacy замість кінцевої точки випуску. (Буде перезапущено додаток) - Деякі переклади для поточної мови не є актуальними, будь ласка, спробуйте зробити внесок у переклади програми на GitHub Переклад: Uatel Автоматично повідомляти про помилки та продуктивність розробникам Якщо вимкнути це, розробник не отримуватиме автоматичні звіти про помилки, і це може ускладнити усунення несправностей @@ -216,7 +212,6 @@ Цей додаток є неофіційною збіркою AMM. Ой, ми потрапили в халепу!= Розкажіть нам більше про те, що ви робили, коли це сталося. Чим більше, тим веселіше! - Надішліть і перезапустіть Звіти про збої відключено. Увімкніть їх, щоб надіслати відгук. Ім\'я (необов\'язково) Електронна скринька (необов\'язково) @@ -239,7 +234,6 @@ Ключ API має невірний формат Список модулів, які потрібно виключити з перевірки оновлень Оновити додаток - Будь ласка, зачекайте… Модулі, які потрібно виключити з автоматичних перевірок оновлень Будь ласка, зачекайте поки ми перевіримо та встановимо оновлення для AMM. Це може зайняти декілька хвилин Виключити модулі @@ -282,8 +276,6 @@ Повідомляє, коли доступне оновлення додатку Доступне оновлення додатку! Продовжуйте натискати, щоб вас зарахували до Гоґвортсу! - Модулі - Ти чарівник, Гаррі! У вас не відсутній браузер. Щоб продовжити, встановіть його. Перевірка оновлень Вимагати Wi-Fi для перевірки оновлень @@ -343,7 +335,6 @@ Перезавантаження вимкнено в налаштуваннях додатку Перезавантаження Пошук - Звичайне перезавантаження Перезавантаження в завантажувач Перезавантаження в режим EDL Помилка під час обміну даними з API: %d diff --git a/app/src/main/res/values-v23/colors.xml b/app/src/main/res/values-v23/colors.xml deleted file mode 100644 index e59ca95..0000000 --- a/app/src/main/res/values-v23/colors.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - @color/transparent - \ No newline at end of file diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index dc1770d..7e79d94 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -54,11 +54,9 @@ Kích hoạt Monet Thông tin Hiển thị giấy phép - Giấy phép Hiển thị các mô-đun không tương thích Hiển thị các mô-đun dường như sẽ không tương thích với thiết bị của bạn dựa trên siêu dữ liệu của chúng Có một phiên bản Magisk mới hơn để cài đặt! - Kho Bảo mật Giao diện Xóa các tệp mô-đun? @@ -124,7 +122,6 @@ Tải phiên bản đầy đủ Một số repo không cập nhật được Kiểm tra cập nhật tự động - Không thể truy xuất token từ Androidacy. Vui lòng thử lại sau. Không thể xác thực token cho Androidacy. Vui lòng thử lại sau. Cập nhật Androidacy bị chặn bởi Captcha Đã sao chép đường dẫn liên kết @@ -168,7 +165,6 @@ Kho lưu trữ Magisk Alt Bạn đã bật hoặc tắt một kho lưu trữ. Vui lòng làm mới danh sách mô-đun hoặc khởi động lại ứng dụng. Kho lưu trữ này có thể hiển thị một số quảng cáo không xâm nhập để trang trải chi phí phát triển và máy chủ. Đánh giá tính năng, quét vi-rút tự động, v.v. - Một số bản dịch cho ngôn ngữ hiện tại không cập nhật, vui lòng xem xét đóng góp cho bản dịch ứng dụng trên GitHub Không thể xác thực khóa API. Vui lòng kiểm tra và thử lại. Bạn đang đặt ứng dụng sử dụng điểm cuối non-production cho Androidacy. Điều này có thể dẫn đến sự mất ổn định của ứng dụng và không tải được kho lưu trữ trực tuyến. KHÔNG báo cáo lỗi nếu bạn bật công tắc này. Ứng dụng sẽ được khởi động lại để tải lại kho lưu trữ. Chúng tôi cần quyền thông báo để thông báo cho bạn về các bản cập nhật mô-đun và ứng dụng. Nếu bạn không cấp quyền này, Kiểm tra cập nhật tự động sẽ không chạy. @@ -189,7 +185,6 @@ Mô-đun an toàn đã xác nhận Các mô-đun để loại trừ khỏi kiểm tra cập nhật tự động Cập nhật ứng dụng - Vui lòng chờ… Kết thúc Người đóng góp Fox2Code là tác giả ban đầu của ứng dụng. Nếu không có anh ấy, điều này sẽ không bao giờ có thể xảy ra. @@ -204,9 +199,7 @@ Tối AMOLED đen Sáng (trong suốt) - Bạn là một phù thủy, Harry! Tiếp tục ấn để được nhận vào Hogwarts! - Mô-đun Bạn chưa cài đặt trình duyệt. Vui lòng cài đặt một cái để tiếp tục. Các kho lưu trữ sau không cập nhật được: \n @@ -216,7 +209,6 @@ Nâng cấp lên premium sẽ xóa quảng cáo, hình ảnh xác thực và tải xuống cho Kho lưu trữ Androidacy, đồng thời hỗ trợ Androidacy và các tác giả mô-đun. Uh-oh, chúng tôi gặp khó khăn! Hãy cho chúng tôi biết thêm chi tiết về những gì bạn đã làm khi điều này xảy ra. Càng nhiều càng tốt! - Gửi và khởi động lại Vui lòng giúp chúng tôi bằng cách cho chúng tôi biết bạn đang cố gắng làm gì khi điều này xảy ra. Báo cáo sự cố bị vô hiệu hóa. Kích hoạt tính năng này để gửi phản hồi. Tên (không bắt buộc) diff --git a/app/src/main/res/values-w1240dp/dimens.xml b/app/src/main/res/values-w1240dp/dimens.xml index c4b30cc..856413a 100644 --- a/app/src/main/res/values-w1240dp/dimens.xml +++ b/app/src/main/res/values-w1240dp/dimens.xml @@ -2,4 +2,4 @@ ~ 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 + \ No newline at end of file diff --git a/app/src/main/res/values-w600dp/dimens.xml b/app/src/main/res/values-w600dp/dimens.xml index c4b30cc..856413a 100644 --- a/app/src/main/res/values-w600dp/dimens.xml +++ b/app/src/main/res/values-w600dp/dimens.xml @@ -2,4 +2,4 @@ ~ 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 + \ No newline at end of file diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index e12a559..b222133 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -55,11 +55,9 @@ 啟用莫奈取色 訊息 顯示開放原始碼許可 - 開放原始碼許可 顯示不相容的模組 開啟後將顯示與您的裝置不相容的模組 您的 Magisk 需要更新! - 倉庫 安全 外觀 刪除已下載的模組安裝檔? @@ -109,8 +107,6 @@ false - 1 - 如果您使用的當前語言沒有及時更新,請考慮在 GitHub 上的為翻譯做出貢獻 由 OrStudio.tw(@crcky5322), ProtoAES256 提供美妙的翻譯 @@ -121,7 +117,6 @@ 該應用需要重新啟動才能應用此設置 重新啓動 應用程式將重新啟動以禁用暫存端點 - 無法從 Androidacy 檢索令牌。 請稍後再試。 無法驗證 Androidacy 的令牌。 請稍後再試。 Androidacy 更新被驗證碼阻止 API 密鑰已更改。 重新啟動應用程式讓更動生效。 @@ -212,7 +207,6 @@ 這個模組已被倉庫認證為安全的,表示它通過某種程度的質量以及安全檢查,也通過了病毒檢測。 要從自動更新檢查除開的模組 更新應用程式 - 請稍等… 比原版的規範寬鬆。有大量的模組,不過安全性較低。 錯誤回報以及效能分析回傳。所有提交的報告將會嚴格保證匿名且私密。 貢獻者 @@ -221,9 +215,7 @@ 無法儲存日誌 分享 AMM 日誌 此應用為非官方的 AMM 發行。 - 哈利,你是個巫師! 繼續點擊來加入霍格華茲! - 模組 沒有發現瀏覽器的存在。請安裝一個來繼續操作。 以下倉庫無法完成更新: \n @@ -239,7 +231,6 @@ 選擇主題 喔不,我們碰到問題了! 告訴我們發生了什麼事,以及當下你在做什麼。越詳細越好! - 發送後重啟 請告訴我們當時問題發生時你想要做什麼。 錯誤回報已被禁止。請允許後再發送回報。 名字(非必要) diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index a30ad8e..a047a18 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -59,11 +59,9 @@ 启用 Monet 信息 显示开放源代码许可 - 开放源代码许可 显示不兼容的模块 根据元数据显示与您的设备不兼容的模块 Magisk 有新版本! - 仓库 安全 外观 删除这个模块? @@ -113,8 +111,6 @@ false - 1 - 当前语言的一些翻译不是最新的, 请考虑在 GitHub 上为应用程序的翻译做出贡献 简体中文由 Z-Siqi & ycx 翻译 自动向开发人员报告错误和性能 @@ -134,7 +130,6 @@ 应用需要重启以启用这个设置 重新启动 应用程序将重新启动以禁用临时分支 - 无法从 Androidacy 中检索令牌,请稍后再试。 无法验证 Androidacy 令牌,请稍后再试。 验证码阻止了 Androidacy 更新 API 密钥已更改,请重启应用以让更改生效。 @@ -233,15 +228,11 @@ 下载更新 从自动更新检查中排除的模块 更新应用 - 请稍等… - 你是个巫师, Harry! 继续点击以进入霍格沃茨! - 模块 名字 (可选) 邮件 (可选) Uh-oh, 我们遇到障碍了! 向我们提供有关发生这种情况时您正在做什么的更多详细信息。 多多益善! - 提交并重启 请告诉我们发生这种情况时您正在尝试做什么,以帮助我们解决问题。 崩溃图标 复制文本 @@ -347,7 +338,6 @@ 该版本已过期。请更新至最新的版本。 EULA和条款 重启 - 重启正常 重启至 recovery 重启至 bootloader 重启至 EDL 模式 @@ -363,7 +353,6 @@ 升级 堆栈跟踪可以在下面找到。 但是,我们strongly建议您使用下面的反馈表来提交反馈。 这样,它就不会手动复制堆栈跟踪,而是自动将其发送给我们。 它还可以通过这种方式进行反混淆,并自动报告其他详细信息。 您即将重启进入EDL模式,这是一个专为OEM制造商设定,用于刷机和修复底层问题的高级模式。除非您确定想要这样做,并具备能够退出此模式或使用该模式所需的工具,否则我们强烈建议您使用其他重启选项。 - 通知 此版本已过期! 您正在使用的版本已过期,将无法继续运行。请更新至最新的稳定版本。 下载最新版本 diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index e685d3e..c88827d 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -3,15 +3,12 @@ --> - #EF6C00 - #FFA726 - #FF9800 #70000000 #70FFFFFF #00000000 #FF000000 #FFFFFFFF - @color/black_transparent + @color/transparent @color/white_transparent #FF9B08 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b27bad6..fc81eaa 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -66,11 +66,9 @@ Enable Monet Info Show licenses - Licences Show incompatible modules Show modules unlikely to work on your device based on their metadata There is a new version of Magisk to install! - Repos Security Appearance Delete the module files? @@ -132,9 +130,6 @@ false - 1 - Some translations for the current language are - not up-to-date, please consider contributing to the app translations on GitHub Translated by Fox2Code (Put your name here) Automatically report bugs and performance to the developers @@ -154,7 +149,6 @@ The app needs to restart to apply this setting Restart App will be restarted to disable staging endpoint - Could not retrieve token from Androidacy. Please try again later. Could not validate token for Androidacy. Please try again later. Androidacy update blocked by Captcha API key has been changed. Restart the app to apply changes. @@ -246,7 +240,6 @@ This app is an unofficial AMM build. Uh-oh, we hit a snag! Give us more details about what you were doing when this happened. The more, the merrier! - Submit and restart Please help us out by telling us what you were trying to do when this happened. Crash reporting is disabled. Enable it to submit feedback. Name (optional) @@ -272,7 +265,6 @@ Modules to exclude from automatic update checks Update app Please wait while we check for and install updates to AMM. This may take a few minutes - Please wait… ERROR: Invalid data received on launch You appear to be running a debug build. Debug builds must be updated manually, and do not support in-app updates ERROR: Invalid action specified. Refusing to continue. @@ -310,9 +302,7 @@ Notifies when an app update is available App update available! An update is available for AMM. Tap here to update. - Yer a wizard, Harry! Keep tapping to be admitted into Hogwarts! - Modules You do not have a browser installed. Please install one to continue. Update checks Require wifi for update checks @@ -368,17 +358,12 @@ Device is not compatible with blur Reboot Search - Reboot normally Reboot to recovery Reboot to bootloader Reboot to EDL mode Reboot is disabled in app settings Error while communicating with API: %d You are about to reboot to EDL mode, a special mode intended for OEMs to flash and fix low level problems. Unless you are sure you want to do this and have the necessary tools to get out of this mode or use it, we strongly encourage you to use the other reboot options. - ExpiredActivity - Home - Dashboard - Notifications This build has expired! The build you are using is expired and will no longer run. Please update to the latest stable build. Download latest @@ -412,4 +397,5 @@ 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. + Support: %s