diff --git a/app/src/main/java/com/vanced/manager/adapter/AppListAdapter.kt b/app/src/main/java/com/vanced/manager/adapter/AppListAdapter.kt index bea70cda..69868ad0 100644 --- a/app/src/main/java/com/vanced/manager/adapter/AppListAdapter.kt +++ b/app/src/main/java/com/vanced/manager/adapter/AppListAdapter.kt @@ -39,7 +39,6 @@ class AppListAdapter( val dataModel = if (isRoot) rootDataModels[position] else dataModels[position] with(binding) { appName.text = dataModel?.appName - appInstallButton.text = dataModel?.buttonTxt?.value dataModel?.buttonTxt?.observe(lifecycleOwner) { appInstallButton.text = it } @@ -60,11 +59,9 @@ class AppListAdapter( appUninstall.isVisible = it appLaunch.isVisible = it } - appRemoteVersion.text = dataModel?.versionName?.value dataModel?.versionName?.observe(lifecycleOwner) { appRemoteVersion.text = it } - appInstalledVersion.text = dataModel?.installedVersionName?.value dataModel?.installedVersionName?.observe(lifecycleOwner) { appInstalledVersion.text = it } diff --git a/app/src/main/java/com/vanced/manager/core/downloader/VancedDownloader.kt b/app/src/main/java/com/vanced/manager/core/downloader/VancedDownloader.kt index 7ffa4761..1082574f 100644 --- a/app/src/main/java/com/vanced/manager/core/downloader/VancedDownloader.kt +++ b/app/src/main/java/com/vanced/manager/core/downloader/VancedDownloader.kt @@ -38,7 +38,7 @@ object VancedDownloader { private var downloadPath: String? = null private var folderName: String? = null - fun downloadVanced(context: Context) { + fun downloadVanced(context: Context, version: String?) { defPrefs = context.defPrefs prefs = context.installPrefs variant = defPrefs.managerVariant @@ -49,7 +49,7 @@ object VancedDownloader { lang = it.split(", ").toMutableList() } theme = prefs.theme - vancedVersion = defPrefs.vancedVersion?.getLatestAppVersion(vancedVersions.value?.value ?: listOf("")) + vancedVersion = version ?: defPrefs.vancedVersion?.getLatestAppVersion(vancedVersions.value?.value ?: listOf("")) themePath = "$baseInstallUrl/apks/v$vancedVersion/$variant/Theme" hashUrl = "apks/v$vancedVersion/$variant/Theme/hash.json" arch = getArch() diff --git a/app/src/main/java/com/vanced/manager/model/DataModel.kt b/app/src/main/java/com/vanced/manager/model/DataModel.kt index 0b91d637..b580d163 100644 --- a/app/src/main/java/com/vanced/manager/model/DataModel.kt +++ b/app/src/main/java/com/vanced/manager/model/DataModel.kt @@ -3,19 +3,17 @@ package com.vanced.manager.model import android.content.Context import android.graphics.drawable.Drawable import android.os.Build +import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import com.beust.klaxon.JsonObject import com.vanced.manager.R import com.vanced.manager.utils.PackageHelper.isPackageInstalled -import com.vanced.manager.utils.lifecycleOwner -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch open class DataModel( private val jsonObject: LiveData, private val context: Context, + lifecycleOwner: LifecycleOwner, val appPkg: String, val appName: String, val appIcon: Drawable?, @@ -30,33 +28,27 @@ open class DataModel( val buttonTxt = MutableLiveData() val changelog = MutableLiveData() - private fun fetch() = CoroutineScope(Dispatchers.IO).launch { + private fun fetch() { val jobj = jsonObject.value - isAppInstalled.postValue(isAppInstalled(appPkg)) - versionCode.postValue(jobj?.int("versionCode") ?: 0) - versionName.postValue(jobj?.string("version")?.removeSuffix("-vanced") ?: context.getString(R.string.unavailable)) - changelog.postValue(jobj?.string("changelog") ?: context.getString(R.string.unavailable)) + isAppInstalled.value = isAppInstalled(appPkg) + versionCode.value = jobj?.int("versionCode") ?: 0 + versionName.value = jobj?.string("version")?.removeSuffix("-vanced") ?: context.getString(R.string.unavailable) + changelog.value = jobj?.string("changelog") ?: context.getString(R.string.unavailable) } init { fetch() - with(context.lifecycleOwner()) { - this?.let { - jsonObject.observe(it) { - fetch() - } + with(lifecycleOwner) { + jsonObject.observe(this) { + fetch() } - this?.let { - isAppInstalled.observe(it) { - installedVersionCode.value = getPkgVersionCode(appPkg) - installedVersionName.value = getPkgVersionName(appPkg) - } + isAppInstalled.observe(this) { + installedVersionCode.value = getPkgVersionCode(appPkg) + installedVersionName.value = getPkgVersionName(appPkg) } - this?.let { - versionCode.observe(it) { versionCode -> - installedVersionCode.observe(it) { installedVersionCode -> - buttonTxt.value = compareInt(installedVersionCode, versionCode) - } + versionCode.observe(this) { versionCode -> + installedVersionCode.observe(this) { installedVersionCode -> + buttonTxt.value = compareInt(installedVersionCode, versionCode) } } } diff --git a/app/src/main/java/com/vanced/manager/model/RootDataModel.kt b/app/src/main/java/com/vanced/manager/model/RootDataModel.kt index bf80ac83..952056d0 100644 --- a/app/src/main/java/com/vanced/manager/model/RootDataModel.kt +++ b/app/src/main/java/com/vanced/manager/model/RootDataModel.kt @@ -2,6 +2,7 @@ package com.vanced.manager.model import android.content.Context import android.graphics.drawable.Drawable +import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.LiveData import com.beust.klaxon.JsonObject import com.vanced.manager.utils.PackageHelper @@ -9,6 +10,7 @@ import com.vanced.manager.utils.PackageHelper class RootDataModel( jsonObject: LiveData, context: Context, + lifecycleOwner: LifecycleOwner, appPkg: String, appName: String, appIcon: Drawable?, @@ -19,7 +21,7 @@ class RootDataModel( //Ironic, isn't it? private val scriptName: String? ): DataModel( - jsonObject, context, appPkg, appName, appIcon + jsonObject, context, lifecycleOwner, appPkg, appName, appIcon ) { override fun isAppInstalled(pkg: String): Boolean { diff --git a/app/src/main/java/com/vanced/manager/ui/dialogs/AppDownloadDialog.kt b/app/src/main/java/com/vanced/manager/ui/dialogs/AppDownloadDialog.kt index 94a7734d..f4f4d0c3 100644 --- a/app/src/main/java/com/vanced/manager/ui/dialogs/AppDownloadDialog.kt +++ b/app/src/main/java/com/vanced/manager/ui/dialogs/AppDownloadDialog.kt @@ -26,14 +26,17 @@ class AppDownloadDialog : BindingDialogFragment() { const val CLOSE_DIALOG = "close_dialog" private const val TAG_APP = "TAG_APP" + private const val TAG_VERSION = "TAG_VERSION" private const val TAG_INSTALLING = "TAG_INSTALLING" fun newInstance( app: String, + version: String? = null, installing: Boolean = false ): AppDownloadDialog = AppDownloadDialog().apply { arguments = Bundle().apply { putString(TAG_APP, app) + putString(TAG_VERSION, version) putBoolean(TAG_INSTALLING, installing) } } @@ -70,7 +73,7 @@ class AppDownloadDialog : BindingDialogFragment() { appDownloadHeader.text = app if (arguments?.getBoolean(TAG_INSTALLING) == false) { when (app) { - getString(R.string.vanced) -> downloadVanced(requireContext()) + getString(R.string.vanced) -> downloadVanced(requireContext(), arguments?.getString(TAG_VERSION)) getString(R.string.music) -> downloadMusic(requireContext()) getString(R.string.microg) -> downloadMicrog(requireContext()) } diff --git a/app/src/main/java/com/vanced/manager/ui/dialogs/ManagerVariantDialog.kt b/app/src/main/java/com/vanced/manager/ui/dialogs/ManagerVariantDialog.kt index 7a4ba815..79dd203e 100644 --- a/app/src/main/java/com/vanced/manager/ui/dialogs/ManagerVariantDialog.kt +++ b/app/src/main/java/com/vanced/manager/ui/dialogs/ManagerVariantDialog.kt @@ -39,13 +39,12 @@ class ManagerVariantDialog : BindingBottomSheetDialogFragment() { @@ -61,6 +59,7 @@ class URLChangeDialog : BindingDialogFragment() { private fun saveUrl(url: String) { lifecycleScope.launch { prefs.installUrl = url + baseInstallUrl = url loadJson(requireActivity()) dismiss() } diff --git a/app/src/main/java/com/vanced/manager/ui/dialogs/VancedPreferencesDialog.kt b/app/src/main/java/com/vanced/manager/ui/dialogs/VancedPreferencesDialog.kt index 5927c0a4..3c53c3c1 100644 --- a/app/src/main/java/com/vanced/manager/ui/dialogs/VancedPreferencesDialog.kt +++ b/app/src/main/java/com/vanced/manager/ui/dialogs/VancedPreferencesDialog.kt @@ -3,11 +3,14 @@ package com.vanced.manager.ui.dialogs import android.os.Bundle import android.view.LayoutInflater import android.view.ViewGroup +import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.vanced.manager.R import com.vanced.manager.core.ui.base.BindingBottomSheetDialogFragment import com.vanced.manager.core.ui.ext.showDialog import com.vanced.manager.databinding.DialogVancedPreferencesBinding import com.vanced.manager.utils.* +import com.vanced.manager.utils.AppUtils.vancedPkg +import com.vanced.manager.utils.PackageHelper.isPackageInstalled import java.util.* class VancedPreferencesDialog : BindingBottomSheetDialogFragment() { @@ -39,7 +42,7 @@ class VancedPreferencesDialog : BindingBottomSheetDialogFragment + downloadVanced("15.43.32") + } + setNeutralButton(R.string.cancel) { _, _ -> + dismiss() + } + create() + }.applyAccent() + return@setOnClickListener + } + + downloadVanced() } } } diff --git a/app/src/main/java/com/vanced/manager/ui/viewmodels/HomeViewModel.kt b/app/src/main/java/com/vanced/manager/ui/viewmodels/HomeViewModel.kt index cd2516b6..0e07a108 100644 --- a/app/src/main/java/com/vanced/manager/ui/viewmodels/HomeViewModel.kt +++ b/app/src/main/java/com/vanced/manager/ui/viewmodels/HomeViewModel.kt @@ -155,14 +155,16 @@ open class HomeViewModel(private val activity: FragmentActivity): ViewModel() { } init { - if (variant == "root") { - vancedRootModel.value = RootDataModel(vanced, activity, vancedRootPkg, activity.getString(R.string.vanced), AppCompatResources.getDrawable(activity, R.drawable.ic_vanced), "vanced") - musicRootModel.value = RootDataModel(music, activity, musicRootPkg, activity.getString(R.string.music), AppCompatResources.getDrawable(activity, R.drawable.ic_music), "music") - } else { - vancedModel.value = DataModel(vanced, activity, vancedPkg, activity.getString(R.string.vanced), AppCompatResources.getDrawable(activity, R.drawable.ic_vanced)) - musicModel.value = DataModel(music, activity, musicPkg, activity.getString(R.string.music), AppCompatResources.getDrawable(activity, R.drawable.ic_music)) - microgModel.value = DataModel(microg, activity, microgPkg, activity.getString(R.string.microg), AppCompatResources.getDrawable(activity, R.drawable.ic_microg)) + with (activity) { + if (variant == "root") { + vancedRootModel.value = RootDataModel(vanced, this, this, vancedRootPkg, this.getString(R.string.vanced), AppCompatResources.getDrawable(this, R.drawable.ic_vanced), "vanced") + musicRootModel.value = RootDataModel(music, this, this, musicRootPkg, this.getString(R.string.music), AppCompatResources.getDrawable(this, R.drawable.ic_music), "music") + } else { + vancedModel.value = DataModel(vanced, this, this, vancedPkg, this.getString(R.string.vanced), AppCompatResources.getDrawable(this, R.drawable.ic_vanced)) + musicModel.value = DataModel(music, this, this, musicPkg, this.getString(R.string.music), AppCompatResources.getDrawable(this, R.drawable.ic_music)) + microgModel.value = DataModel(microg, this, this, microgPkg, this.getString(R.string.microg), AppCompatResources.getDrawable(this, R.drawable.ic_microg)) + } + managerModel.value = DataModel(manager, this, this, managerPkg, this.getString(R.string.app_name), AppCompatResources.getDrawable(this, R.mipmap.ic_launcher)) } - managerModel.value = DataModel(manager, activity, managerPkg, activity.getString(R.string.app_name), AppCompatResources.getDrawable(activity, R.mipmap.ic_launcher)) } } diff --git a/app/src/main/java/com/vanced/manager/utils/Extensions.kt b/app/src/main/java/com/vanced/manager/utils/Extensions.kt index 7e24e824..f3dbafc4 100644 --- a/app/src/main/java/com/vanced/manager/utils/Extensions.kt +++ b/app/src/main/java/com/vanced/manager/utils/Extensions.kt @@ -30,7 +30,7 @@ fun DialogFragment.show(activity: FragmentActivity) { } -fun List.convertToAppVersions(): List = arrayListOf("latest") + reversed() +fun List.convertToAppVersions(): List = listOf("latest") + reversed() fun String.convertToAppTheme(context: Context): String { return context.getString(R.string.light_plus_other, this.capitalize(Locale.ROOT)) diff --git a/app/src/main/java/com/vanced/manager/utils/InternetTools.kt b/app/src/main/java/com/vanced/manager/utils/InternetTools.kt index 8f164811..1e684ffe 100644 --- a/app/src/main/java/com/vanced/manager/utils/InternetTools.kt +++ b/app/src/main/java/com/vanced/manager/utils/InternetTools.kt @@ -13,12 +13,16 @@ import androidx.lifecycle.MutableLiveData import androidx.preference.PreferenceManager.getDefaultSharedPreferences import com.beust.klaxon.JsonArray import com.beust.klaxon.JsonObject -import com.github.kittinunf.fuel.httpGet import com.vanced.manager.R import com.vanced.manager.utils.AppUtils.generateChecksum import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import java.io.File +import java.io.IOException +import java.net.ConnectException +import java.net.HttpURLConnection +import java.net.SocketTimeoutException +import java.net.URL import java.util.* private const val TAG = "VMNetTools" @@ -57,6 +61,8 @@ fun openUrl(url: String, color: Int, context: Context) { fun getFileNameFromUrl(url: String) = url.substring(url.lastIndexOf('/') + 1, url.length) +//TODO: Use a better connection method that doesn't cause inappropriate blocks +@Suppress("BlockingMethodInNonBlockingContext") suspend fun loadJson(context: Context) = withContext(Dispatchers.IO) { isFetching.postValue(true) val installUrl = context.defPrefs.installUrl @@ -64,18 +70,33 @@ suspend fun loadJson(context: Context) = withContext(Dispatchers.IO) { baseInstallUrl = installUrl } - baseInstallUrl.httpGet().response { _, response, _ -> - if (response.statusCode / 100 != 2) { - baseInstallUrl = "https://mirror.codebucket.de/vanced" + try { + val latestbaseUrl = "$baseInstallUrl/latest.json" + val connection = URL(latestbaseUrl).openConnection() as HttpURLConnection + connection.apply { + connectTimeout = 5000 + readTimeout = 5000 + connect() } + if (connection.responseCode != 200) { + Log.d(TAG, latestbaseUrl + ": " + connection.responseCode.toString()) + baseInstallUrl = "https://mirror.codebucket.de/vanced/api/v1" + } + } catch (e: IOException) { + baseInstallUrl = "https://mirror.codebucket.de/vanced/api/v1" + } catch (e: SocketTimeoutException) { + Log.d(TAG, "connection timed out") + baseInstallUrl = "https://mirror.codebucket.de/vanced/api/v1" } + Log.d(TAG, "Fetching using URL: $baseInstallUrl") + val calendar = Calendar.getInstance() val hour = calendar.get(Calendar.HOUR_OF_DAY) val minute = calendar.get(Calendar.MINUTE) val second = calendar.get(Calendar.SECOND) val fetchTime = "fetchTime=$hour$minute$second" - + val latest = getJson("$baseInstallUrl/latest.json?$fetchTime") val versions = getJson("$baseInstallUrl/versions.json?$fetchTime") isMicrogBroken = latest?.boolean("is_microg_broken") ?: false diff --git a/app/src/main/java/com/vanced/manager/utils/PackageHelper.kt b/app/src/main/java/com/vanced/manager/utils/PackageHelper.kt index 8a638697..d647d484 100644 --- a/app/src/main/java/com/vanced/manager/utils/PackageHelper.kt +++ b/app/src/main/java/com/vanced/manager/utils/PackageHelper.kt @@ -32,7 +32,7 @@ object PackageHelper { const val apkInstallPath = "/data/adb" private const val INSTALLER_TAG = "VMInstall" - private val vancedThemes = vanced.value?.array("themes")?.value ?: arrayOf("black", "dark", "pink", "blue") + private val vancedThemes = vanced.value?.array("themes")?.value ?: listOf("black", "dark", "pink", "blue") init { Shell.enableVerboseLogging = BuildConfig.DEBUG diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 25d66ded..eb163f49 100755 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -90,6 +90,8 @@ Vanced has successfully been installed! Open now? Version Vanced Music has successfully been installed! Open now? + Bug in microG + Due to a bug in microG, installing Vanced 16+ first requires you to install v15.43.32, open, login and then manually select and install version 16. Do you want to proceed installing v15.43.32? Please be patient… Open Welcome