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
+
### 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" />
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