diff --git a/app/src/main/java/com/topjohnwu/magisk/KConfig.kt b/app/src/main/java/com/topjohnwu/magisk/KConfig.kt index be3ecde27..b0103b51e 100644 --- a/app/src/main/java/com/topjohnwu/magisk/KConfig.kt +++ b/app/src/main/java/com/topjohnwu/magisk/KConfig.kt @@ -1,36 +1,44 @@ package com.topjohnwu.magisk -import androidx.appcompat.app.AppCompatDelegate +import com.chibatching.kotpref.ContextProvider import com.chibatching.kotpref.KotprefModel -import com.topjohnwu.magisk.KConfig.UpdateChannel.* +import com.topjohnwu.magisk.KConfig.UpdateChannel.STABLE +import com.topjohnwu.magisk.utils.get -object KConfig : KotprefModel() { +object KConfig : KotprefModel(get()) { override val kotprefName: String = "${context.packageName}_preferences" - var darkMode by intPref(default = AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM, key = "darkMode") - var magiskChecksum by stringPref("", "magiskChecksum") - var forceEncrypt by booleanPref(false, "forceEncryption") - var keepVerity by booleanPref(false, "keepVerity") - var bootFormat by stringPref("img", "bootFormat") - var suLogTimeout by longPref(0, "suLogTimeout") - private var internalUpdateChannel by stringPref( - KConfig.UpdateChannel.STABLE.toString(), - "updateChannel" - ) + private var internalUpdateChannel by intPref(STABLE.id, "updateChannel") var useCustomTabs by booleanPref(true, "useCustomTabs") + @JvmStatic + var customUpdateChannel by stringPref("", "custom_channel") + @JvmStatic var updateChannel: UpdateChannel - get() = valueOf(internalUpdateChannel) + get() = UpdateChannel.byId(internalUpdateChannel) set(value) { - internalUpdateChannel = value.toString() + internalUpdateChannel = value.id } - val isStable get() = !(isCanary || isBeta) - val isCanary get() = updateChannel == CANARY || updateChannel == CANARY_DEBUG - val isBeta get() = updateChannel == BETA + internal const val DEFAULT_CHANNEL = "topjohnwu/magisk_files" + enum class UpdateChannel(val id: Int) { - enum class UpdateChannel { - STABLE, BETA, CANARY, CANARY_DEBUG + STABLE(Config.Value.STABLE_CHANNEL), + BETA(Config.Value.BETA_CHANNEL), + CANARY(Config.Value.CANARY_CHANNEL), + CANARY_DEBUG(Config.Value.CANARY_DEBUG_CHANNEL), + CUSTOM(Config.Value.CUSTOM_CHANNEL); + + companion object { + fun byId(id: Int) = when (id) { + Config.Value.STABLE_CHANNEL -> STABLE + Config.Value.BETA_CHANNEL -> BETA + Config.Value.CUSTOM_CHANNEL -> CUSTOM + Config.Value.CANARY_CHANNEL -> CANARY + Config.Value.CANARY_DEBUG_CHANNEL -> CANARY_DEBUG + else -> STABLE + } + } } } \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/data/network/GithubRawApiServices.kt b/app/src/main/java/com/topjohnwu/magisk/data/network/GithubRawApiServices.kt index 0323a81bf..d3219c845 100644 --- a/app/src/main/java/com/topjohnwu/magisk/data/network/GithubRawApiServices.kt +++ b/app/src/main/java/com/topjohnwu/magisk/data/network/GithubRawApiServices.kt @@ -1,6 +1,7 @@ package com.topjohnwu.magisk.data.network import com.topjohnwu.magisk.Constants +import com.topjohnwu.magisk.KConfig import com.topjohnwu.magisk.model.entity.MagiskConfig import io.reactivex.Single import okhttp3.ResponseBody @@ -26,6 +27,9 @@ interface GithubRawApiServices { @GET("$MAGISK_FILES/master/canary_builds/canary.json") fun fetchCanaryDebugConfig(): Single + @GET + fun fetchCustomConfig(@Url url: String): Single + @GET("$MAGISK_FILES/{$REVISION}/snet.apk") @Streaming fun fetchSafetynet(@Path(REVISION) revision: String = Constants.SNET_REVISION): Single @@ -67,7 +71,7 @@ interface GithubRawApiServices { private const val FILE = "file" - private const val MAGISK_FILES = "topjohnwu/magisk_files" + private const val MAGISK_FILES = KConfig.DEFAULT_CHANNEL private const val MAGISK_MASTER = "topjohnwu/Magisk/master" private const val MAGISK_MODULES = "Magisk-Modules-Repo" } diff --git a/app/src/main/java/com/topjohnwu/magisk/data/repository/MagiskRepository.kt b/app/src/main/java/com/topjohnwu/magisk/data/repository/MagiskRepository.kt index aa7dad6fa..e8d8adcf4 100644 --- a/app/src/main/java/com/topjohnwu/magisk/data/repository/MagiskRepository.kt +++ b/app/src/main/java/com/topjohnwu/magisk/data/repository/MagiskRepository.kt @@ -24,12 +24,6 @@ class MagiskRepository( private val packageManager: PackageManager ) { - private val config = apiRaw.fetchConfig() - private val configBeta = apiRaw.fetchBetaConfig() - private val configCanary = apiRaw.fetchCanaryConfig() - private val configCanaryDebug = apiRaw.fetchCanaryDebugConfig() - - fun fetchMagisk() = fetchConfig() .flatMap { apiRaw.fetchFile(it.magisk.link) } .map { it.writeToFile(context, FILE_MAGISK_ZIP) } @@ -52,10 +46,11 @@ class MagiskRepository( fun fetchConfig() = when (KConfig.updateChannel) { - KConfig.UpdateChannel.STABLE -> config - KConfig.UpdateChannel.BETA -> configBeta - KConfig.UpdateChannel.CANARY -> configCanary - KConfig.UpdateChannel.CANARY_DEBUG -> configCanaryDebug + KConfig.UpdateChannel.STABLE -> apiRaw.fetchConfig() + KConfig.UpdateChannel.BETA -> apiRaw.fetchBetaConfig() + KConfig.UpdateChannel.CANARY -> apiRaw.fetchCanaryConfig() + KConfig.UpdateChannel.CANARY_DEBUG -> apiRaw.fetchCanaryDebugConfig() + KConfig.UpdateChannel.CUSTOM -> apiRaw.fetchCustomConfig(KConfig.customUpdateChannel) } diff --git a/app/src/main/java/com/topjohnwu/magisk/di/ApplicationModule.kt b/app/src/main/java/com/topjohnwu/magisk/di/ApplicationModule.kt index 07830c11a..d66f7a337 100644 --- a/app/src/main/java/com/topjohnwu/magisk/di/ApplicationModule.kt +++ b/app/src/main/java/com/topjohnwu/magisk/di/ApplicationModule.kt @@ -2,6 +2,7 @@ package com.topjohnwu.magisk.di import android.content.Context import androidx.preference.PreferenceManager +import com.chibatching.kotpref.ContextProvider import com.skoumal.teanity.rxbus.RxBus import com.topjohnwu.magisk.App import org.koin.dsl.module @@ -15,4 +16,11 @@ val applicationModule = module { factory(Protected) { get().protectedContext } single(SUTimeout) { get(Protected).getSharedPreferences("su_timeout", 0) } single { PreferenceManager.getDefaultSharedPreferences(get(Protected)) } + single { createContextProvider(get(Protected)) as ContextProvider } } + +private fun createContextProvider(context: Context) = object : ContextProvider { + override fun getApplicationContext(): Context { + return context + } +} \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/base/BasePreferenceFragment.kt b/app/src/main/java/com/topjohnwu/magisk/ui/base/BasePreferenceFragment.kt index 2b52355b8..5c4da87fb 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/base/BasePreferenceFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/base/BasePreferenceFragment.kt @@ -12,6 +12,8 @@ import androidx.core.view.isVisible import androidx.preference.* import androidx.recyclerview.widget.RecyclerView import com.topjohnwu.magisk.App +import com.topjohnwu.magisk.Config +import com.topjohnwu.magisk.KConfig import com.topjohnwu.magisk.R import com.topjohnwu.magisk.data.repository.ModuleRepository import com.topjohnwu.magisk.data.repository.SettingRepository @@ -64,4 +66,19 @@ abstract class BasePreferenceFragment : PreferenceFragmentCompat(), else view.setPadding(0, view.paddingTop, view.paddingRight, view.paddingBottom) } + + protected fun setCustomUpdateChannel(userRepo: String) { + KConfig.customUpdateChannel = userRepo + } + + protected fun getChannelCompat(channel: Int): KConfig.UpdateChannel { + return when (channel) { + Config.Value.DEFAULT_CHANNEL -> KConfig.UpdateChannel.STABLE + Config.Value.BETA_CHANNEL -> KConfig.UpdateChannel.BETA + Config.Value.CANARY_CHANNEL -> KConfig.UpdateChannel.CANARY + Config.Value.CANARY_DEBUG_CHANNEL -> KConfig.UpdateChannel.CANARY_DEBUG + Config.Value.CUSTOM_CHANNEL -> KConfig.UpdateChannel.CUSTOM + else -> KConfig.updateChannel + } + } } diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsFragment.java b/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsFragment.java index 08e4e5cfc..4071a8e1d 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsFragment.java +++ b/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsFragment.java @@ -12,6 +12,8 @@ import android.widget.Toast; import com.topjohnwu.magisk.BuildConfig; import com.topjohnwu.magisk.Config; import com.topjohnwu.magisk.Const; +import com.topjohnwu.magisk.KConfig; +import com.topjohnwu.magisk.KConfig.UpdateChannel; import com.topjohnwu.magisk.R; import com.topjohnwu.magisk.ui.base.BasePreferenceFragment; import com.topjohnwu.magisk.utils.DownloadApp; @@ -130,21 +132,23 @@ public final class SettingsFragment extends BasePreferenceFragment { SwitchPreferenceCompat fingerprint = (SwitchPreferenceCompat) findPreference(Config.Key.SU_FINGERPRINT); updateChannel.setOnPreferenceChangeListener((p, o) -> { - int prev = Config.get(Config.Key.UPDATE_CHANNEL); int channel = Integer.parseInt((String) o); - if (channel == Config.Value.CUSTOM_CHANNEL) { + + final UpdateChannel previousUpdateChannel = KConfig.getUpdateChannel(); + final UpdateChannel updateChannel = getChannelCompat(channel); + + KConfig.setUpdateChannel(updateChannel); + + if (updateChannel == UpdateChannel.CUSTOM) { View v = LayoutInflater.from(requireActivity()).inflate(R.layout.custom_channel_dialog, null); EditText url = v.findViewById(R.id.custom_url); - url.setText(getPrefs().getString(Config.Key.CUSTOM_CHANNEL, "")); + url.setText(KConfig.getCustomUpdateChannel()); new AlertDialog.Builder(requireActivity()) .setTitle(R.string.settings_update_custom) .setView(v) - .setPositiveButton(R.string.ok, (d, i) -> - Config.set(Config.Key.CUSTOM_CHANNEL, url.getText().toString())) - .setNegativeButton(R.string.close, (d, i) -> - Config.set(Config.Key.UPDATE_CHANNEL, prev)) - .setOnCancelListener(d -> - Config.set(Config.Key.UPDATE_CHANNEL, prev)) + .setPositiveButton(R.string.ok, (d, i) -> setCustomUpdateChannel(url.getText().toString())) + .setNegativeButton(R.string.close, (d, i) -> KConfig.setUpdateChannel(previousUpdateChannel)) + .setOnCancelListener(d -> KConfig.setUpdateChannel(previousUpdateChannel)) .show(); } return true; diff --git a/app/src/main/res/layout/custom_channel_dialog.xml b/app/src/main/res/layout/custom_channel_dialog.xml index 273902aa2..e32fa1e7f 100644 --- a/app/src/main/res/layout/custom_channel_dialog.xml +++ b/app/src/main/res/layout/custom_channel_dialog.xml @@ -1,25 +1,24 @@ + android:padding="@dimen/margin_generic"> - + android:hint="@string/settings_update_custom_msg" + app:hintEnabled="true"> + + + + - \ No newline at end of file