VancedManager/app/src/main/java/com/vanced/manager/ui/viewmodels/HomeViewModel.kt

230 lines
8.5 KiB
Kotlin

package com.vanced.manager.ui.viewmodels
import android.annotation.SuppressLint
import android.content.ActivityNotFoundException
import android.content.ComponentName
import android.content.Intent
import android.widget.Toast
import androidx.fragment.app.FragmentActivity
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import androidx.preference.PreferenceManager.getDefaultSharedPreferences
import com.crowdin.platform.Crowdin
import com.vanced.manager.R
import com.vanced.manager.adapter.LinkAdapter.Companion.DISCORD
import com.vanced.manager.adapter.LinkAdapter.Companion.REDDIT
import com.vanced.manager.adapter.LinkAdapter.Companion.TELEGRAM
import com.vanced.manager.adapter.LinkAdapter.Companion.TWITTER
import com.vanced.manager.adapter.SponsorAdapter.Companion.BRAVE
import com.vanced.manager.model.ButtonTag
import com.vanced.manager.model.DataModel
import com.vanced.manager.model.RootDataModel
import com.vanced.manager.ui.dialogs.AppDownloadDialog
import com.vanced.manager.ui.dialogs.InstallationFilesDetectedDialog
import com.vanced.manager.ui.dialogs.MusicPreferencesDialog
import com.vanced.manager.ui.dialogs.VancedPreferencesDialog
import com.vanced.manager.utils.*
import com.vanced.manager.utils.AppUtils.log
import com.vanced.manager.utils.AppUtils.managerPkg
import com.vanced.manager.utils.AppUtils.microgPkg
import com.vanced.manager.utils.AppUtils.musicPkg
import com.vanced.manager.utils.AppUtils.musicRootPkg
import com.vanced.manager.utils.AppUtils.vancedPkg
import com.vanced.manager.utils.AppUtils.vancedRootPkg
import com.vanced.manager.utils.PackageHelper.apkExist
import com.vanced.manager.utils.PackageHelper.musicApkExists
import com.vanced.manager.utils.PackageHelper.uninstallApk
import com.vanced.manager.utils.PackageHelper.uninstallRootApk
import com.vanced.manager.utils.PackageHelper.vancedInstallFilesExist
import kotlinx.coroutines.launch
//TODO fix leak
@SuppressLint("StaticFieldLeak")
class HomeViewModel(private val activity: FragmentActivity) : ViewModel() {
private val prefs = getDefaultSharedPreferences(activity)
private val variant get() = prefs.getString("vanced_variant", "nonroot")
val vancedModel = MutableLiveData<DataModel>()
val vancedRootModel = MutableLiveData<RootDataModel>()
val microgModel = MutableLiveData<DataModel>()
val musicModel = MutableLiveData<DataModel>()
val musicRootModel = MutableLiveData<RootDataModel>()
val managerModel = MutableLiveData<DataModel>()
fun fetchData() {
viewModelScope.launch {
loadJson(activity)
Crowdin.forceUpdate(activity)
}
}
private val microgToast = Toast.makeText(activity, R.string.no_microg, Toast.LENGTH_LONG)
fun openUrl(url: String) {
val color: Int =
when (url) {
DISCORD -> R.color.Discord
TELEGRAM -> R.color.Telegram
TWITTER -> R.color.Twitter
REDDIT -> R.color.Reddit
BRAVE -> R.color.Brave
else -> R.color.Vanced
}
openUrl(url, color, activity)
}
fun launchApp(app: String, isRoot: Boolean) {
val componentName = when (app) {
activity.getString(R.string.vanced) -> if (isRoot) ComponentName(
vancedRootPkg,
"$vancedRootPkg.HomeActivity"
) else ComponentName(vancedPkg, "$vancedRootPkg.HomeActivity")
activity.getString(R.string.music) -> if (isRoot) ComponentName(
musicRootPkg,
"$musicRootPkg.activities.MusicActivity"
) else ComponentName(musicPkg, "$musicRootPkg.activities.MusicActivity")
activity.getString(R.string.microg) -> ComponentName(
microgPkg,
"org.microg.gms.ui.SettingsActivity"
)
else -> throw IllegalArgumentException("Can't open this app")
}
try {
activity.startActivity(Intent().setComponent(componentName))
} catch (e: ActivityNotFoundException) {
log("VMHMV", e.toString())
}
}
fun openInstallDialog(buttonTag: ButtonTag?, app: String) {
if (variant == "nonroot" && app != activity.getString(R.string.microg) && !microgModel.value?.isAppInstalled?.value!!) {
microgToast.show()
return
}
if (buttonTag == ButtonTag.UPDATE) {
when (app) {
activity.getString(R.string.vanced) -> VancedPreferencesDialog().show(activity)
activity.getString(R.string.music) -> MusicPreferencesDialog().show(activity)
else -> AppDownloadDialog.newInstance(app).show(activity)
}
return
}
when (app) {
activity.getString(R.string.vanced) -> {
when (variant) {
"nonroot" -> {
if (vancedInstallFilesExist(activity)) {
InstallationFilesDetectedDialog.newInstance(app).show(activity)
} else {
VancedPreferencesDialog().show(activity)
}
}
"root" -> {
VancedPreferencesDialog().show(activity)
}
}
}
activity.getString(R.string.music) -> {
when (variant) {
"nonroot" -> {
if (musicApkExists(activity)) {
InstallationFilesDetectedDialog.newInstance(app).show(activity)
} else {
MusicPreferencesDialog().show(activity)
}
}
"root" -> {
MusicPreferencesDialog().show(activity)
}
}
}
activity.getString(R.string.microg) -> {
if (apkExist(activity, "microg.apk")) {
InstallationFilesDetectedDialog.newInstance(app).show(activity)
} else {
AppDownloadDialog.newInstance(app).show(activity)
}
}
}
}
fun uninstallPackage(pkg: String) {
if (variant == "root" && uninstallRootApk(pkg)) {
viewModelScope.launch { loadJson(activity) }
} else {
uninstallApk(pkg, activity)
}
}
init {
with(activity) {
if (variant == "root") {
vancedRootModel.value = RootDataModel(
vanced,
this,
this,
vancedRootPkg,
this.getString(R.string.vanced),
activity.getString(R.string.description_vanced),
R.drawable.ic_vanced,
"vanced"
)
musicRootModel.value = RootDataModel(
music,
this,
this,
musicRootPkg,
this.getString(R.string.music),
activity.getString(R.string.description_vanced_music),
R.drawable.ic_music,
"music"
)
} else {
vancedModel.value = DataModel(
vanced,
this,
this,
vancedPkg,
this.getString(R.string.vanced),
activity.getString(R.string.description_vanced),
R.drawable.ic_vanced
)
musicModel.value = DataModel(
music,
this,
this,
musicPkg,
this.getString(R.string.music),
activity.getString(R.string.description_vanced_music),
R.drawable.ic_music
)
microgModel.value = DataModel(
microg,
this,
this,
microgPkg,
this.getString(R.string.microg),
activity.getString(R.string.description_microg),
R.drawable.ic_microg
)
}
managerModel.value = DataModel(
manager,
this,
this,
managerPkg,
this.getString(R.string.app_name),
"Just manager meh",
R.mipmap.ic_launcher
)
}
}
}