moved methods out of singletones

This commit is contained in:
X1nto 2021-01-16 21:00:38 +04:00
parent 834dad0946
commit f47dd376b2
45 changed files with 325 additions and 391 deletions

View File

@ -92,21 +92,21 @@ class AppListAdapter(
init { init {
if (prefs.getBoolean("enable_vanced", true)) { if (prefs.getBoolean("enable_vanced", true)) {
dataModels.add(viewModel.vanced.value) dataModels.add(viewModel.vancedModel.value)
rootDataModels.add(viewModel.vancedRoot.value) rootDataModels.add(viewModel.vancedRootModel.value)
apps.add(context.getString(R.string.vanced)) apps.add(context.getString(R.string.vanced))
itemCount++ itemCount++
} }
if (prefs.getBoolean("enable_music", true)) { if (prefs.getBoolean("enable_music", true)) {
dataModels.add(viewModel.music.value) dataModels.add(viewModel.musicModel.value)
rootDataModels.add(viewModel.musicRoot.value) rootDataModels.add(viewModel.musicRootModel.value)
apps.add(context.getString(R.string.music)) apps.add(context.getString(R.string.music))
itemCount++ itemCount++
} }
if (!isRoot) { if (!isRoot) {
dataModels.add(viewModel.microg.value) dataModels.add(viewModel.microgModel.value)
apps.add(context.getString(R.string.microg)) apps.add(context.getString(R.string.microg))
itemCount++ itemCount++
} }

View File

@ -9,7 +9,7 @@ import com.crowdin.platform.CrowdinConfig
import com.crowdin.platform.data.model.AuthConfig import com.crowdin.platform.data.model.AuthConfig
import com.crowdin.platform.data.remote.NetworkType import com.crowdin.platform.data.remote.NetworkType
import com.vanced.manager.BuildConfig.* import com.vanced.manager.BuildConfig.*
import com.vanced.manager.utils.InternetTools.loadJson import com.vanced.manager.utils.loadJson
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.SupervisorJob

View File

@ -4,10 +4,10 @@ import android.content.Context
import com.vanced.manager.R import com.vanced.manager.R
import com.vanced.manager.utils.DownloadHelper.download import com.vanced.manager.utils.DownloadHelper.download
import com.vanced.manager.utils.DownloadHelper.downloadProgress import com.vanced.manager.utils.DownloadHelper.downloadProgress
import com.vanced.manager.utils.Extensions.getDefaultPrefs
import com.vanced.manager.utils.Extensions.getInstallUrl
import com.vanced.manager.utils.InternetTools.microg
import com.vanced.manager.utils.PackageHelper.install import com.vanced.manager.utils.PackageHelper.install
import com.vanced.manager.utils.getDefaultPrefs
import com.vanced.manager.utils.getInstallUrl
import com.vanced.manager.utils.microg
object MicrogDownloader { object MicrogDownloader {

View File

@ -3,16 +3,11 @@ package com.vanced.manager.core.downloader
import android.content.Context import android.content.Context
import androidx.preference.PreferenceManager.getDefaultSharedPreferences import androidx.preference.PreferenceManager.getDefaultSharedPreferences
import com.vanced.manager.R import com.vanced.manager.R
import com.vanced.manager.utils.*
import com.vanced.manager.utils.AppUtils.musicRootPkg import com.vanced.manager.utils.AppUtils.musicRootPkg
import com.vanced.manager.utils.AppUtils.validateTheme import com.vanced.manager.utils.AppUtils.validateTheme
import com.vanced.manager.utils.DeviceUtils.getArch
import com.vanced.manager.utils.DownloadHelper.download import com.vanced.manager.utils.DownloadHelper.download
import com.vanced.manager.utils.DownloadHelper.downloadProgress import com.vanced.manager.utils.DownloadHelper.downloadProgress
import com.vanced.manager.utils.Extensions.getInstallUrl
import com.vanced.manager.utils.Extensions.getLatestAppVersion
import com.vanced.manager.utils.InternetTools.getFileNameFromUrl
import com.vanced.manager.utils.InternetTools.music
import com.vanced.manager.utils.InternetTools.musicVersions
import com.vanced.manager.utils.PackageHelper.downloadStockCheck import com.vanced.manager.utils.PackageHelper.downloadStockCheck
import com.vanced.manager.utils.PackageHelper.install import com.vanced.manager.utils.PackageHelper.install
import com.vanced.manager.utils.PackageHelper.installMusicRoot import com.vanced.manager.utils.PackageHelper.installMusicRoot

View File

@ -6,17 +6,11 @@ import androidx.preference.PreferenceManager.getDefaultSharedPreferences
import com.google.firebase.analytics.FirebaseAnalytics import com.google.firebase.analytics.FirebaseAnalytics
import com.google.firebase.analytics.ktx.logEvent import com.google.firebase.analytics.ktx.logEvent
import com.vanced.manager.R import com.vanced.manager.R
import com.vanced.manager.utils.*
import com.vanced.manager.utils.AppUtils.validateTheme import com.vanced.manager.utils.AppUtils.validateTheme
import com.vanced.manager.utils.AppUtils.vancedRootPkg import com.vanced.manager.utils.AppUtils.vancedRootPkg
import com.vanced.manager.utils.DeviceUtils.getArch
import com.vanced.manager.utils.DownloadHelper.download import com.vanced.manager.utils.DownloadHelper.download
import com.vanced.manager.utils.DownloadHelper.downloadProgress import com.vanced.manager.utils.DownloadHelper.downloadProgress
import com.vanced.manager.utils.Extensions.getInstallUrl
import com.vanced.manager.utils.Extensions.getLatestAppVersion
import com.vanced.manager.utils.InternetTools.getFileNameFromUrl
import com.vanced.manager.utils.InternetTools.vanced
import com.vanced.manager.utils.InternetTools.vancedVersions
import com.vanced.manager.utils.LanguageHelper.getDefaultVancedLanguages
import com.vanced.manager.utils.PackageHelper.downloadStockCheck import com.vanced.manager.utils.PackageHelper.downloadStockCheck
import com.vanced.manager.utils.PackageHelper.installVanced import com.vanced.manager.utils.PackageHelper.installVanced
import com.vanced.manager.utils.PackageHelper.installVancedRoot import com.vanced.manager.utils.PackageHelper.installVancedRoot

View File

@ -7,8 +7,8 @@ import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData import androidx.lifecycle.MutableLiveData
import com.beust.klaxon.JsonObject import com.beust.klaxon.JsonObject
import com.vanced.manager.R import com.vanced.manager.R
import com.vanced.manager.utils.Extensions.lifecycleOwner
import com.vanced.manager.utils.PackageHelper.isPackageInstalled import com.vanced.manager.utils.PackageHelper.isPackageInstalled
import com.vanced.manager.utils.lifecycleOwner
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch

View File

@ -1,7 +1,6 @@
package com.vanced.manager.model package com.vanced.manager.model
import androidx.lifecycle.MutableLiveData import androidx.lifecycle.MutableLiveData
import com.github.kittinunf.fuel.core.requests.CancellableRequest
import okhttp3.ResponseBody import okhttp3.ResponseBody
import retrofit2.Call import retrofit2.Call

View File

@ -25,13 +25,7 @@ import com.vanced.manager.ui.dialogs.ManagerUpdateDialog
import com.vanced.manager.ui.dialogs.URLChangeDialog import com.vanced.manager.ui.dialogs.URLChangeDialog
import com.vanced.manager.ui.fragments.HomeFragmentDirections import com.vanced.manager.ui.fragments.HomeFragmentDirections
import com.vanced.manager.ui.fragments.SettingsFragmentDirections import com.vanced.manager.ui.fragments.SettingsFragmentDirections
import com.vanced.manager.utils.Extensions.show import com.vanced.manager.utils.*
import com.vanced.manager.utils.InternetTools.manager
import com.vanced.manager.utils.LanguageContextWrapper
import com.vanced.manager.utils.LanguageHelper.authCrowdin
import com.vanced.manager.utils.LanguageHelper.onActivityResult
import com.vanced.manager.utils.PackageHelper
import com.vanced.manager.utils.ThemeHelper.setFinalTheme
class MainActivity : AppCompatActivity() { class MainActivity : AppCompatActivity() {

View File

@ -6,10 +6,10 @@ import androidx.core.content.res.ResourcesCompat
import androidx.core.graphics.ColorUtils import androidx.core.graphics.ColorUtils
import com.google.android.material.button.MaterialButton import com.google.android.material.button.MaterialButton
import com.vanced.manager.R import com.vanced.manager.R
import com.vanced.manager.utils.Extensions.getDefaultPrefs import com.vanced.manager.utils.accentColor
import com.vanced.manager.utils.Extensions.lifecycleOwner import com.vanced.manager.utils.defAccentColor
import com.vanced.manager.utils.ThemeHelper.accentColor import com.vanced.manager.utils.getDefaultPrefs
import com.vanced.manager.utils.ThemeHelper.defAccentColor import com.vanced.manager.utils.lifecycleOwner
class ThemedMaterialButton @JvmOverloads constructor( class ThemedMaterialButton @JvmOverloads constructor(
context: Context, context: Context,

View File

@ -5,10 +5,8 @@ import android.content.res.ColorStateList
import android.util.AttributeSet import android.util.AttributeSet
import com.google.android.material.checkbox.MaterialCheckBox import com.google.android.material.checkbox.MaterialCheckBox
import com.vanced.manager.R import com.vanced.manager.R
import com.vanced.manager.utils.Extensions.getDefaultPrefs import com.vanced.manager.utils.defAccentColor
import com.vanced.manager.utils.Extensions.lifecycleOwner import com.vanced.manager.utils.getDefaultPrefs
import com.vanced.manager.utils.ThemeHelper.accentColor
import com.vanced.manager.utils.ThemeHelper.defAccentColor
class ThemedMaterialCheckbox @JvmOverloads constructor( class ThemedMaterialCheckbox @JvmOverloads constructor(
context: Context, context: Context,

View File

@ -5,10 +5,8 @@ import android.content.res.ColorStateList
import android.util.AttributeSet import android.util.AttributeSet
import com.google.android.material.radiobutton.MaterialRadioButton import com.google.android.material.radiobutton.MaterialRadioButton
import com.vanced.manager.R import com.vanced.manager.R
import com.vanced.manager.utils.Extensions.getDefaultPrefs import com.vanced.manager.utils.defAccentColor
import com.vanced.manager.utils.Extensions.lifecycleOwner import com.vanced.manager.utils.getDefaultPrefs
import com.vanced.manager.utils.ThemeHelper.accentColor
import com.vanced.manager.utils.ThemeHelper.defAccentColor
class ThemedMaterialRadioButton @JvmOverloads constructor( class ThemedMaterialRadioButton @JvmOverloads constructor(
context: Context, context: Context,

View File

@ -4,8 +4,8 @@ import android.content.Context
import android.content.res.ColorStateList import android.content.res.ColorStateList
import android.util.AttributeSet import android.util.AttributeSet
import com.google.android.material.slider.Slider import com.google.android.material.slider.Slider
import com.vanced.manager.utils.Extensions.getDefaultPrefs import com.vanced.manager.utils.defAccentColor
import com.vanced.manager.utils.ThemeHelper import com.vanced.manager.utils.getDefaultPrefs
class ThemedMaterialSlider@JvmOverloads constructor( class ThemedMaterialSlider@JvmOverloads constructor(
context: Context, context: Context,
@ -14,7 +14,7 @@ class ThemedMaterialSlider@JvmOverloads constructor(
) : Slider(context, attributeSet, defStyleAttr) { ) : Slider(context, attributeSet, defStyleAttr) {
init { init {
thumbStrokeColor = ColorStateList.valueOf(context.getDefaultPrefs().getInt("manager_accent_color", ThemeHelper.defAccentColor)) thumbStrokeColor = ColorStateList.valueOf(context.getDefaultPrefs().getInt("manager_accent_color", defAccentColor))
} }
} }

View File

@ -5,10 +5,10 @@ import android.content.res.ColorStateList
import android.util.AttributeSet import android.util.AttributeSet
import androidx.core.graphics.ColorUtils import androidx.core.graphics.ColorUtils
import com.google.android.material.button.MaterialButton import com.google.android.material.button.MaterialButton
import com.vanced.manager.utils.Extensions.getDefaultPrefs import com.vanced.manager.utils.accentColor
import com.vanced.manager.utils.Extensions.lifecycleOwner import com.vanced.manager.utils.defAccentColor
import com.vanced.manager.utils.ThemeHelper.accentColor import com.vanced.manager.utils.getDefaultPrefs
import com.vanced.manager.utils.ThemeHelper.defAccentColor import com.vanced.manager.utils.lifecycleOwner
class ThemedOutlinedMaterialButton @JvmOverloads constructor( class ThemedOutlinedMaterialButton @JvmOverloads constructor(

View File

@ -4,8 +4,8 @@ import android.content.Context
import android.util.AttributeSet import android.util.AttributeSet
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
import com.vanced.manager.R import com.vanced.manager.R
import com.vanced.manager.utils.Extensions.getDefaultPrefs import com.vanced.manager.utils.defAccentColor
import com.vanced.manager.utils.ThemeHelper.defAccentColor import com.vanced.manager.utils.getDefaultPrefs
class ThemedSwipeRefreshlayout @JvmOverloads constructor( class ThemedSwipeRefreshlayout @JvmOverloads constructor(
context: Context, context: Context,

View File

@ -8,10 +8,10 @@ import androidx.appcompat.widget.SwitchCompat
import androidx.core.graphics.ColorUtils import androidx.core.graphics.ColorUtils
import androidx.core.graphics.drawable.DrawableCompat import androidx.core.graphics.drawable.DrawableCompat
import com.vanced.manager.R import com.vanced.manager.R
import com.vanced.manager.utils.Extensions.getDefaultPrefs import com.vanced.manager.utils.accentColor
import com.vanced.manager.utils.Extensions.lifecycleOwner import com.vanced.manager.utils.defAccentColor
import com.vanced.manager.utils.ThemeHelper.accentColor import com.vanced.manager.utils.getDefaultPrefs
import com.vanced.manager.utils.ThemeHelper.defAccentColor import com.vanced.manager.utils.lifecycleOwner
class ThemedSwitchCompat @JvmOverloads constructor( class ThemedSwitchCompat @JvmOverloads constructor(
context: Context, context: Context,

View File

@ -3,10 +3,10 @@ package com.vanced.manager.ui.core
import android.content.Context import android.content.Context
import android.util.AttributeSet import android.util.AttributeSet
import androidx.appcompat.widget.AppCompatTextView import androidx.appcompat.widget.AppCompatTextView
import com.vanced.manager.utils.Extensions.getDefaultPrefs import com.vanced.manager.utils.accentColor
import com.vanced.manager.utils.Extensions.lifecycleOwner import com.vanced.manager.utils.defAccentColor
import com.vanced.manager.utils.ThemeHelper.accentColor import com.vanced.manager.utils.getDefaultPrefs
import com.vanced.manager.utils.ThemeHelper.defAccentColor import com.vanced.manager.utils.lifecycleOwner
class ThemedTextView @JvmOverloads constructor( class ThemedTextView @JvmOverloads constructor(
context: Context, context: Context,

View File

@ -18,7 +18,7 @@ import com.vanced.manager.core.downloader.VancedDownloader.downloadVanced
import com.vanced.manager.core.ui.base.BindingDialogFragment import com.vanced.manager.core.ui.base.BindingDialogFragment
import com.vanced.manager.databinding.DialogAppDownloadBinding import com.vanced.manager.databinding.DialogAppDownloadBinding
import com.vanced.manager.utils.DownloadHelper.downloadProgress import com.vanced.manager.utils.DownloadHelper.downloadProgress
import com.vanced.manager.utils.Extensions.applyAccent import com.vanced.manager.utils.applyAccent
class AppDownloadDialog : BindingDialogFragment<DialogAppDownloadBinding>() { class AppDownloadDialog : BindingDialogFragment<DialogAppDownloadBinding>() {

View File

@ -11,8 +11,8 @@ import com.vanced.manager.core.ui.base.BindingBottomSheetDialogFragment
import com.vanced.manager.core.ui.ext.showDialog import com.vanced.manager.core.ui.ext.showDialog
import com.vanced.manager.databinding.DialogBottomRadioButtonBinding import com.vanced.manager.databinding.DialogBottomRadioButtonBinding
import com.vanced.manager.ui.core.ThemedMaterialRadioButton import com.vanced.manager.ui.core.ThemedMaterialRadioButton
import com.vanced.manager.utils.Extensions.getCheckedButtonTag import com.vanced.manager.utils.getCheckedButtonTag
import com.vanced.manager.utils.Extensions.getDefaultPrefs import com.vanced.manager.utils.getDefaultPrefs
class AppVersionSelectorDialog : BindingBottomSheetDialogFragment<DialogBottomRadioButtonBinding>() { class AppVersionSelectorDialog : BindingBottomSheetDialogFragment<DialogBottomRadioButtonBinding>() {

View File

@ -5,9 +5,9 @@ import androidx.core.content.edit
import androidx.preference.PreferenceManager import androidx.preference.PreferenceManager
import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.vanced.manager.R import com.vanced.manager.R
import com.vanced.manager.utils.Extensions.applyAccent import com.vanced.manager.utils.applyAccent
import com.vanced.manager.utils.InternetTools.openUrl import com.vanced.manager.utils.isMiui
import com.vanced.manager.utils.MiuiHelper import com.vanced.manager.utils.openUrl
object DialogContainer { object DialogContainer {
@ -19,12 +19,12 @@ object DialogContainer {
dialog.dismiss() dialog.dismiss()
} }
setOnDismissListener { setOnDismissListener {
if (MiuiHelper.isMiui()) { if (isMiui()) {
applyAccentMiuiDialog(context) applyAccentMiuiDialog(context)
} }
} }
setOnCancelListener { setOnCancelListener {
if (MiuiHelper.isMiui()) { if (isMiui()) {
applyAccentMiuiDialog(context) applyAccentMiuiDialog(context)
} }
} }

View File

@ -16,10 +16,10 @@ import com.madrapps.pikolo.listeners.OnColorSelectionListener
import com.vanced.manager.R import com.vanced.manager.R
import com.vanced.manager.core.ui.base.BindingDialogFragment import com.vanced.manager.core.ui.base.BindingDialogFragment
import com.vanced.manager.databinding.DialogManagerAccentColorBinding import com.vanced.manager.databinding.DialogManagerAccentColorBinding
import com.vanced.manager.utils.Extensions.toHex import com.vanced.manager.utils.accentColor
import com.vanced.manager.utils.ThemeHelper.accentColor import com.vanced.manager.utils.defAccentColor
import com.vanced.manager.utils.ThemeHelper.defAccentColor import com.vanced.manager.utils.mutableAccentColor
import com.vanced.manager.utils.ThemeHelper.mutableAccentColor import com.vanced.manager.utils.toHex
class ManagerAccentColorDialog : BindingDialogFragment<DialogManagerAccentColorBinding>() { class ManagerAccentColorDialog : BindingDialogFragment<DialogManagerAccentColorBinding>() {

View File

@ -11,8 +11,8 @@ import com.vanced.manager.BuildConfig.MANAGER_LANGUAGES
import com.vanced.manager.core.ui.base.BindingBottomSheetDialogFragment import com.vanced.manager.core.ui.base.BindingBottomSheetDialogFragment
import com.vanced.manager.databinding.DialogManagerLanguageBinding import com.vanced.manager.databinding.DialogManagerLanguageBinding
import com.vanced.manager.ui.core.ThemedMaterialRadioButton import com.vanced.manager.ui.core.ThemedMaterialRadioButton
import com.vanced.manager.utils.Extensions.getCheckedButtonTag import com.vanced.manager.utils.getCheckedButtonTag
import com.vanced.manager.utils.LanguageHelper.getLanguageFormat import com.vanced.manager.utils.getLanguageFormat
class ManagerLanguageDialog : BindingBottomSheetDialogFragment<DialogManagerLanguageBinding>() { class ManagerLanguageDialog : BindingBottomSheetDialogFragment<DialogManagerLanguageBinding>() {

View File

@ -8,7 +8,7 @@ import androidx.preference.PreferenceManager.getDefaultSharedPreferences
import com.google.android.material.radiobutton.MaterialRadioButton import com.google.android.material.radiobutton.MaterialRadioButton
import com.vanced.manager.core.ui.base.BindingBottomSheetDialogFragment import com.vanced.manager.core.ui.base.BindingBottomSheetDialogFragment
import com.vanced.manager.databinding.DialogManagerThemeBinding import com.vanced.manager.databinding.DialogManagerThemeBinding
import com.vanced.manager.utils.Extensions.getCheckedButtonTag import com.vanced.manager.utils.getCheckedButtonTag
class ManagerThemeDialog : BindingBottomSheetDialogFragment<DialogManagerThemeBinding>() { class ManagerThemeDialog : BindingBottomSheetDialogFragment<DialogManagerThemeBinding>() {

View File

@ -17,8 +17,8 @@ import com.vanced.manager.core.ui.base.BindingDialogFragment
import com.vanced.manager.databinding.DialogManagerUpdateBinding import com.vanced.manager.databinding.DialogManagerUpdateBinding
import com.vanced.manager.utils.DownloadHelper.downloadManager import com.vanced.manager.utils.DownloadHelper.downloadManager
import com.vanced.manager.utils.DownloadHelper.downloadProgress import com.vanced.manager.utils.DownloadHelper.downloadProgress
import com.vanced.manager.utils.Extensions.applyAccent import com.vanced.manager.utils.applyAccent
import com.vanced.manager.utils.InternetTools.manager import com.vanced.manager.utils.manager
class ManagerUpdateDialog : BindingDialogFragment<DialogManagerUpdateBinding>() { class ManagerUpdateDialog : BindingDialogFragment<DialogManagerUpdateBinding>() {

View File

@ -9,7 +9,7 @@ import com.google.android.material.radiobutton.MaterialRadioButton
import com.topjohnwu.superuser.Shell import com.topjohnwu.superuser.Shell
import com.vanced.manager.core.ui.base.BindingBottomSheetDialogFragment import com.vanced.manager.core.ui.base.BindingBottomSheetDialogFragment
import com.vanced.manager.databinding.DialogManagerVariantBinding import com.vanced.manager.databinding.DialogManagerVariantBinding
import com.vanced.manager.utils.Extensions.getCheckedButtonTag import com.vanced.manager.utils.getCheckedButtonTag
class ManagerVariantDialog : BindingBottomSheetDialogFragment<DialogManagerVariantBinding>() { class ManagerVariantDialog : BindingBottomSheetDialogFragment<DialogManagerVariantBinding>() {

View File

@ -7,9 +7,9 @@ import com.vanced.manager.R
import com.vanced.manager.core.ui.base.BindingBottomSheetDialogFragment import com.vanced.manager.core.ui.base.BindingBottomSheetDialogFragment
import com.vanced.manager.core.ui.ext.showDialog import com.vanced.manager.core.ui.ext.showDialog
import com.vanced.manager.databinding.DialogMusicPreferencesBinding import com.vanced.manager.databinding.DialogMusicPreferencesBinding
import com.vanced.manager.utils.Extensions.convertToAppVersions import com.vanced.manager.utils.convertToAppVersions
import com.vanced.manager.utils.Extensions.getDefaultPrefs import com.vanced.manager.utils.getDefaultPrefs
import com.vanced.manager.utils.InternetTools.musicVersions import com.vanced.manager.utils.musicVersions
class MusicPreferencesDialog : BindingBottomSheetDialogFragment<DialogMusicPreferencesBinding>() { class MusicPreferencesDialog : BindingBottomSheetDialogFragment<DialogMusicPreferencesBinding>() {

View File

@ -8,12 +8,12 @@ import androidx.core.content.edit
import com.vanced.manager.R import com.vanced.manager.R
import com.vanced.manager.core.ui.base.BindingDialogFragment import com.vanced.manager.core.ui.base.BindingDialogFragment
import com.vanced.manager.databinding.DialogServicedTimerBinding import com.vanced.manager.databinding.DialogServicedTimerBinding
import com.vanced.manager.utils.Extensions.getDefaultPrefs
import com.vanced.manager.utils.Extensions.writeServiceDScript
import com.vanced.manager.utils.PackageHelper import com.vanced.manager.utils.PackageHelper
import com.vanced.manager.utils.PackageHelper.getPackageDir import com.vanced.manager.utils.PackageHelper.getPackageDir
import com.vanced.manager.utils.PackageHelper.getPkgNameRoot import com.vanced.manager.utils.PackageHelper.getPkgNameRoot
import com.vanced.manager.utils.PackageHelper.scriptExists import com.vanced.manager.utils.PackageHelper.scriptExists
import com.vanced.manager.utils.getDefaultPrefs
import com.vanced.manager.utils.writeServiceDScript
import java.io.IOException import java.io.IOException
import java.util.* import java.util.*

View File

@ -11,8 +11,8 @@ import androidx.lifecycle.lifecycleScope
import androidx.preference.PreferenceManager.getDefaultSharedPreferences import androidx.preference.PreferenceManager.getDefaultSharedPreferences
import com.vanced.manager.core.ui.base.BindingDialogFragment import com.vanced.manager.core.ui.base.BindingDialogFragment
import com.vanced.manager.databinding.DialogCustomUrlBinding import com.vanced.manager.databinding.DialogCustomUrlBinding
import com.vanced.manager.utils.InternetTools.baseUrl import com.vanced.manager.utils.baseUrl
import com.vanced.manager.utils.InternetTools.loadJson import com.vanced.manager.utils.loadJson
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
class URLChangeDialog : BindingDialogFragment<DialogCustomUrlBinding>() { class URLChangeDialog : BindingDialogFragment<DialogCustomUrlBinding>() {

View File

@ -17,8 +17,8 @@ import com.vanced.manager.core.ui.base.BindingBottomSheetDialogFragment
import com.vanced.manager.core.ui.ext.showDialog import com.vanced.manager.core.ui.ext.showDialog
import com.vanced.manager.databinding.DialogVancedLanguageSelectionBinding import com.vanced.manager.databinding.DialogVancedLanguageSelectionBinding
import com.vanced.manager.ui.core.ThemedMaterialCheckbox import com.vanced.manager.ui.core.ThemedMaterialCheckbox
import com.vanced.manager.utils.InternetTools.vanced import com.vanced.manager.utils.getDefaultVancedLanguages
import com.vanced.manager.utils.LanguageHelper.getDefaultVancedLanguages import com.vanced.manager.utils.vanced
import java.util.* import java.util.*
class VancedLanguageSelectionDialog : BindingBottomSheetDialogFragment<DialogVancedLanguageSelectionBinding>() { class VancedLanguageSelectionDialog : BindingBottomSheetDialogFragment<DialogVancedLanguageSelectionBinding>() {

View File

@ -9,11 +9,7 @@ import com.vanced.manager.R
import com.vanced.manager.core.ui.base.BindingBottomSheetDialogFragment import com.vanced.manager.core.ui.base.BindingBottomSheetDialogFragment
import com.vanced.manager.core.ui.ext.showDialog import com.vanced.manager.core.ui.ext.showDialog
import com.vanced.manager.databinding.DialogVancedPreferencesBinding import com.vanced.manager.databinding.DialogVancedPreferencesBinding
import com.vanced.manager.utils.Extensions.convertToAppTheme import com.vanced.manager.utils.*
import com.vanced.manager.utils.Extensions.convertToAppVersions
import com.vanced.manager.utils.Extensions.getDefaultPrefs
import com.vanced.manager.utils.InternetTools.vancedVersions
import com.vanced.manager.utils.LanguageHelper.getDefaultVancedLanguages
import java.util.* import java.util.*
class VancedPreferencesDialog : BindingBottomSheetDialogFragment<DialogVancedPreferencesBinding>() { class VancedPreferencesDialog : BindingBottomSheetDialogFragment<DialogVancedPreferencesBinding>() {

View File

@ -11,9 +11,9 @@ import com.vanced.manager.core.ui.base.BindingBottomSheetDialogFragment
import com.vanced.manager.core.ui.ext.showDialog import com.vanced.manager.core.ui.ext.showDialog
import com.vanced.manager.databinding.DialogBottomRadioButtonBinding import com.vanced.manager.databinding.DialogBottomRadioButtonBinding
import com.vanced.manager.ui.core.ThemedMaterialRadioButton import com.vanced.manager.ui.core.ThemedMaterialRadioButton
import com.vanced.manager.utils.Extensions.convertToAppTheme import com.vanced.manager.utils.convertToAppTheme
import com.vanced.manager.utils.Extensions.getCheckedButtonTag import com.vanced.manager.utils.getCheckedButtonTag
import com.vanced.manager.utils.InternetTools.vanced import com.vanced.manager.utils.vanced
class VancedThemeSelectorDialog : BindingBottomSheetDialogFragment<DialogBottomRadioButtonBinding>() { class VancedThemeSelectorDialog : BindingBottomSheetDialogFragment<DialogBottomRadioButtonBinding>() {

View File

@ -16,7 +16,7 @@ import com.vanced.manager.core.ui.ext.showDialog
import com.vanced.manager.databinding.FragmentAboutBinding import com.vanced.manager.databinding.FragmentAboutBinding
import com.vanced.manager.ui.dialogs.AppInfoDialog import com.vanced.manager.ui.dialogs.AppInfoDialog
import com.vanced.manager.ui.viewmodels.AboutViewModel import com.vanced.manager.ui.viewmodels.AboutViewModel
import com.vanced.manager.utils.InternetTools.manager import com.vanced.manager.utils.manager
class AboutFragment : BindingFragment<FragmentAboutBinding>() { class AboutFragment : BindingFragment<FragmentAboutBinding>() {

View File

@ -18,7 +18,7 @@ import com.vanced.manager.databinding.FragmentDevSettingsBinding
import com.vanced.manager.ui.WelcomeActivity import com.vanced.manager.ui.WelcomeActivity
import com.vanced.manager.ui.dialogs.ManagerUpdateDialog import com.vanced.manager.ui.dialogs.ManagerUpdateDialog
import com.vanced.manager.ui.dialogs.URLChangeDialog import com.vanced.manager.ui.dialogs.URLChangeDialog
import com.vanced.manager.utils.LanguageHelper.authCrowdin import com.vanced.manager.utils.authCrowdin
class DevSettingsFragment : BindingFragment<FragmentDevSettingsBinding>() { class DevSettingsFragment : BindingFragment<FragmentDevSettingsBinding>() {

View File

@ -28,7 +28,7 @@ import com.vanced.manager.databinding.FragmentHomeBinding
import com.vanced.manager.ui.dialogs.DialogContainer.installAlertBuilder import com.vanced.manager.ui.dialogs.DialogContainer.installAlertBuilder
import com.vanced.manager.ui.viewmodels.HomeViewModel import com.vanced.manager.ui.viewmodels.HomeViewModel
import com.vanced.manager.ui.viewmodels.HomeViewModelFactory import com.vanced.manager.ui.viewmodels.HomeViewModelFactory
import com.vanced.manager.utils.InternetTools.isFetching import com.vanced.manager.utils.isFetching
open class HomeFragment : BindingFragment<FragmentHomeBinding>() { open class HomeFragment : BindingFragment<FragmentHomeBinding>() {

View File

@ -18,10 +18,10 @@ import com.vanced.manager.core.ui.base.BindingFragment
import com.vanced.manager.core.ui.ext.showDialog import com.vanced.manager.core.ui.ext.showDialog
import com.vanced.manager.databinding.FragmentSettingsBinding import com.vanced.manager.databinding.FragmentSettingsBinding
import com.vanced.manager.ui.dialogs.* import com.vanced.manager.ui.dialogs.*
import com.vanced.manager.utils.Extensions.toHex import com.vanced.manager.utils.accentColor
import com.vanced.manager.utils.LanguageHelper.getLanguageFormat import com.vanced.manager.utils.defAccentColor
import com.vanced.manager.utils.ThemeHelper.accentColor import com.vanced.manager.utils.getLanguageFormat
import com.vanced.manager.utils.ThemeHelper.defAccentColor import com.vanced.manager.utils.toHex
import java.io.File import java.io.File
class SettingsFragment : BindingFragment<FragmentSettingsBinding>() { class SettingsFragment : BindingFragment<FragmentSettingsBinding>() {

View File

@ -3,12 +3,12 @@ package com.vanced.manager.ui.viewmodels
import android.app.Application import android.app.Application
import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.AndroidViewModel
import com.vanced.manager.R import com.vanced.manager.R
import com.vanced.manager.utils.InternetTools import com.vanced.manager.utils.openUrl
class AboutViewModel(application: Application): AndroidViewModel(application) { class AboutViewModel(application: Application): AndroidViewModel(application) {
fun openUrl(url: String) { fun openUrl(url: String) {
InternetTools.openUrl(url, R.color.GitHub, getApplication()) openUrl(url, R.color.GitHub, getApplication())
} }
} }

View File

@ -26,15 +26,13 @@ import com.vanced.manager.ui.dialogs.AppDownloadDialog
import com.vanced.manager.ui.dialogs.InstallationFilesDetectedDialog import com.vanced.manager.ui.dialogs.InstallationFilesDetectedDialog
import com.vanced.manager.ui.dialogs.MusicPreferencesDialog import com.vanced.manager.ui.dialogs.MusicPreferencesDialog
import com.vanced.manager.ui.dialogs.VancedPreferencesDialog import com.vanced.manager.ui.dialogs.VancedPreferencesDialog
import com.vanced.manager.utils.*
import com.vanced.manager.utils.AppUtils.managerPkg import com.vanced.manager.utils.AppUtils.managerPkg
import com.vanced.manager.utils.AppUtils.microgPkg import com.vanced.manager.utils.AppUtils.microgPkg
import com.vanced.manager.utils.AppUtils.musicPkg import com.vanced.manager.utils.AppUtils.musicPkg
import com.vanced.manager.utils.AppUtils.musicRootPkg import com.vanced.manager.utils.AppUtils.musicRootPkg
import com.vanced.manager.utils.AppUtils.vancedPkg import com.vanced.manager.utils.AppUtils.vancedPkg
import com.vanced.manager.utils.AppUtils.vancedRootPkg import com.vanced.manager.utils.AppUtils.vancedRootPkg
import com.vanced.manager.utils.Extensions.show
import com.vanced.manager.utils.InternetTools
import com.vanced.manager.utils.InternetTools.loadJson
import com.vanced.manager.utils.PackageHelper.apkExist import com.vanced.manager.utils.PackageHelper.apkExist
import com.vanced.manager.utils.PackageHelper.musicApkExists import com.vanced.manager.utils.PackageHelper.musicApkExists
import com.vanced.manager.utils.PackageHelper.uninstallApk import com.vanced.manager.utils.PackageHelper.uninstallApk
@ -46,12 +44,12 @@ open class HomeViewModel(private val activity: FragmentActivity): ViewModel() {
private val prefs = getDefaultSharedPreferences(activity) private val prefs = getDefaultSharedPreferences(activity)
val vanced = MutableLiveData<DataModel>() val vancedModel = MutableLiveData<DataModel>()
val vancedRoot = MutableLiveData<RootDataModel>() val vancedRootModel = MutableLiveData<RootDataModel>()
val microg = MutableLiveData<DataModel>() val microgModel = MutableLiveData<DataModel>()
val music = MutableLiveData<DataModel>() val musicModel = MutableLiveData<DataModel>()
val musicRoot = MutableLiveData<RootDataModel>() val musicRootModel = MutableLiveData<RootDataModel>()
val manager = MutableLiveData<DataModel>() val managerModel = MutableLiveData<DataModel>()
fun fetchData() { fun fetchData() {
viewModelScope.launch { viewModelScope.launch {
@ -73,7 +71,7 @@ open class HomeViewModel(private val activity: FragmentActivity): ViewModel() {
else -> R.color.Vanced else -> R.color.Vanced
} }
InternetTools.openUrl(url, color, activity) openUrl(url, color, activity)
} }
fun launchApp(app: String, isRoot: Boolean) { fun launchApp(app: String, isRoot: Boolean) {
@ -93,7 +91,7 @@ open class HomeViewModel(private val activity: FragmentActivity): ViewModel() {
fun openInstallDialog(view: View, app: String) { fun openInstallDialog(view: View, app: String) {
val variant = prefs.getString("vanced_variant", "nonroot") val variant = prefs.getString("vanced_variant", "nonroot")
if (variant == "nonroot" && app != activity.getString(R.string.microg) && !microg.value?.isAppInstalled?.value!!) { if (variant == "nonroot" && app != activity.getString(R.string.microg) && !microgModel.value?.isAppInstalled?.value!!) {
microgToast.show() microgToast.show()
return return
} }
@ -157,11 +155,11 @@ open class HomeViewModel(private val activity: FragmentActivity): ViewModel() {
} }
init { init {
vanced.value = DataModel(InternetTools.vanced, activity, vancedPkg, activity.getString(R.string.vanced), AppCompatResources.getDrawable(activity, R.drawable.ic_vanced)) vancedModel.value = DataModel(vanced, activity, vancedPkg, activity.getString(R.string.vanced), AppCompatResources.getDrawable(activity, R.drawable.ic_vanced))
vancedRoot.value = RootDataModel(InternetTools.vanced, activity, vancedRootPkg, activity.getString(R.string.vanced), AppCompatResources.getDrawable(activity, R.drawable.ic_vanced), "vanced") vancedRootModel.value = RootDataModel(vanced, activity, vancedRootPkg, activity.getString(R.string.vanced), AppCompatResources.getDrawable(activity, R.drawable.ic_vanced), "vanced")
music.value = DataModel(InternetTools.music, activity, musicPkg, activity.getString(R.string.music), AppCompatResources.getDrawable(activity, R.drawable.ic_music)) musicModel.value = DataModel(music, activity, musicPkg, activity.getString(R.string.music), AppCompatResources.getDrawable(activity, R.drawable.ic_music))
musicRoot.value = RootDataModel(InternetTools.music, activity, musicRootPkg, activity.getString(R.string.music), AppCompatResources.getDrawable(activity, R.drawable.ic_music), "music") musicRootModel.value = RootDataModel(music, activity, musicRootPkg, activity.getString(R.string.music), AppCompatResources.getDrawable(activity, R.drawable.ic_music), "music")
microg.value = DataModel(InternetTools.microg, activity, microgPkg, activity.getString(R.string.microg), AppCompatResources.getDrawable(activity, R.drawable.ic_microg)) microgModel.value = DataModel(microg, activity, microgPkg, activity.getString(R.string.microg), AppCompatResources.getDrawable(activity, R.drawable.ic_microg))
manager.value = DataModel(InternetTools.manager, activity, managerPkg, activity.getString(R.string.app_name), AppCompatResources.getDrawable(activity, R.mipmap.ic_launcher)) managerModel.value = DataModel(manager, activity, managerPkg, activity.getString(R.string.app_name), AppCompatResources.getDrawable(activity, R.mipmap.ic_launcher))
} }
} }

View File

@ -9,7 +9,6 @@ import com.vanced.manager.R
import com.vanced.manager.ui.dialogs.AppDownloadDialog import com.vanced.manager.ui.dialogs.AppDownloadDialog
import com.vanced.manager.ui.fragments.HomeFragment import com.vanced.manager.ui.fragments.HomeFragment
import com.vanced.manager.utils.DownloadHelper.downloadProgress import com.vanced.manager.utils.DownloadHelper.downloadProgress
import com.vanced.manager.utils.InternetTools.getSha256
import kotlinx.coroutines.* import kotlinx.coroutines.*
import java.io.File import java.io.File
import java.io.IOException import java.io.IOException
@ -92,7 +91,7 @@ object AppUtils: CoroutineScope by CoroutineScope(Dispatchers.IO) {
context: Context, context: Context,
): Boolean { ): Boolean {
val themeF = File(downloadPath, "$apk.apk") val themeF = File(downloadPath, "$apk.apk")
return runBlocking { InternetTools.checkSHA256(getSha256(hashUrl, apk, context), themeF) } return runBlocking { checkSHA256(getSha256(hashUrl, apk, context), themeF) }
} }
private fun getErrorMessage(status: String, context: Context): String { private fun getErrorMessage(status: String, context: Context): String {
@ -111,7 +110,7 @@ object AppUtils: CoroutineScope by CoroutineScope(Dispatchers.IO) {
status.contains("Files_Missing_VA") -> context.getString(R.string.files_missing_va) status.contains("Files_Missing_VA") -> context.getString(R.string.files_missing_va)
status.contains("Path_Missing") -> context.getString(R.string.path_missing) status.contains("Path_Missing") -> context.getString(R.string.path_missing)
else -> else ->
if (MiuiHelper.isMiui()) if (isMiui())
context.getString(R.string.installation_miui) context.getString(R.string.installation_miui)
else else
context.getString(R.string.installation_failed) context.getString(R.string.installation_failed)
@ -127,7 +126,7 @@ object AppUtils: CoroutineScope by CoroutineScope(Dispatchers.IO) {
PackageInstaller.STATUS_FAILURE_INVALID -> context.getString(R.string.installation_invalid) PackageInstaller.STATUS_FAILURE_INVALID -> context.getString(R.string.installation_invalid)
PackageInstaller.STATUS_FAILURE_STORAGE -> context.getString(R.string.installation_storage) PackageInstaller.STATUS_FAILURE_STORAGE -> context.getString(R.string.installation_storage)
else -> else ->
if (MiuiHelper.isMiui()) if (isMiui())
context.getString(R.string.installation_miui) context.getString(R.string.installation_miui)
else else
context.getString(R.string.installation_failed) context.getString(R.string.installation_failed)

View File

@ -2,12 +2,8 @@ package com.vanced.manager.utils
import android.os.Build import android.os.Build
object DeviceUtils { fun getArch(): String = when {
Build.SUPPORTED_ABIS.contains("x86") -> "x86"
fun getArch(): String = when { Build.SUPPORTED_ABIS.contains("arm64-v8a") -> "arm64_v8a"
Build.SUPPORTED_ABIS.contains("x86") -> "x86" else -> "armeabi_v7a"
Build.SUPPORTED_ABIS.contains("arm64-v8a") -> "arm64_v8a"
else -> "armeabi_v7a"
}
} }

View File

@ -17,88 +17,81 @@ import com.google.android.material.radiobutton.MaterialRadioButton
import com.topjohnwu.superuser.io.SuFile import com.topjohnwu.superuser.io.SuFile
import com.topjohnwu.superuser.io.SuFileOutputStream import com.topjohnwu.superuser.io.SuFileOutputStream
import com.vanced.manager.R import com.vanced.manager.R
import com.vanced.manager.utils.InternetTools.baseUrl
import com.vanced.manager.utils.ThemeHelper.accentColor
import com.vanced.manager.utils.ThemeHelper.defAccentColor
import java.util.* import java.util.*
object Extensions { fun RadioGroup.getCheckedButtonTag(): String? {
return findViewById<MaterialRadioButton>(checkedRadioButtonId)?.tag?.toString()
}
fun RadioGroup.getCheckedButtonTag(): String? { fun DialogFragment.show(activity: FragmentActivity) {
return findViewById<MaterialRadioButton>(checkedRadioButtonId)?.tag?.toString() try {
show(activity.supportFragmentManager, "")
} catch (e: Exception) {
Log.d("VMUI", e.stackTraceToString())
} }
fun DialogFragment.show(activity: FragmentActivity) { }
try {
show(activity.supportFragmentManager, "")
} catch (e: Exception) {
Log.d("VMUI", e.stackTraceToString())
}
fun Context.getDefaultPrefs(): SharedPreferences = getDefaultSharedPreferences(this)
//Not sure how much this can affect performance
//but if anyone can improve this even slightly,
//feel free to open a PR
fun List<String>.convertToAppVersions(): List<String> {
val versionsModel = arrayListOf("latest")
for (i in reversed().indices) {
versionsModel.add(this[i])
} }
return versionsModel
}
fun Context.getDefaultPrefs(): SharedPreferences = getDefaultSharedPreferences(this) fun String.convertToAppTheme(context: Context): String {
return context.getString(R.string.light_plus_other, this.capitalize(Locale.ROOT))
}
//Not sure how much this can affect performance fun String.getLatestAppVersion(versions: List<String>): String {
//but if anyone can improve this even slightly, return if (this == "latest") versions.reversed()[0] else this
//feel free to open a PR }
fun List<String>.convertToAppVersions(): List<String> {
val versionsModel = arrayListOf("latest") fun SharedPreferences.getInstallUrl() = getString("install_url", baseUrl)
for (i in reversed().indices) {
versionsModel.add(this[i]) fun Context.lifecycleOwner(): LifecycleOwner? {
} var curContext = this
return versionsModel var maxDepth = 20
while (maxDepth-- > 0 && curContext !is LifecycleOwner) {
curContext = (curContext as ContextWrapper).baseContext
} }
return if (curContext is LifecycleOwner) {
fun String.convertToAppTheme(context: Context): String { curContext
return context.getString(R.string.light_plus_other, this.capitalize(Locale.ROOT)) } else {
null
} }
}
fun String.getLatestAppVersion(versions: List<String>): String { fun Int.toHex(): String = java.lang.String.format("#%06X", 0xFFFFFF and this)
return if (this == "latest") versions.reversed()[0] else this
//Material team decided to keep their LinearProgressIndicator final
//At least extension methods exist
fun LinearProgressIndicator.applyAccent() {
with(accentColor.value ?: context.getDefaultPrefs().getInt("manager_accent_color", defAccentColor)) {
setIndicatorColor(this)
trackColor = ColorUtils.setAlphaComponent(this, 70)
} }
}
fun SharedPreferences.getInstallUrl() = getString("install_url", baseUrl) fun MaterialAlertDialogBuilder.applyAccent() {
with(accentColor.value ?: context.getDefaultPrefs().getInt("manager_accent_color", defAccentColor)) {
fun Context.lifecycleOwner(): LifecycleOwner? { show().apply {
var curContext = this getButton(DialogInterface.BUTTON_POSITIVE).setTextColor(this@with)
var maxDepth = 20 getButton(DialogInterface.BUTTON_NEGATIVE).setTextColor(this@with)
while (maxDepth-- > 0 && curContext !is LifecycleOwner) { getButton(DialogInterface.BUTTON_NEUTRAL).setTextColor(this@with)
curContext = (curContext as ContextWrapper).baseContext
}
return if (curContext is LifecycleOwner) {
curContext
} else {
null
} }
} }
}
fun Int.toHex(): String = java.lang.String.format("#%06X", 0xFFFFFF and this) fun Context.writeServiceDScript(apkFPath: String, path: String, app: String) {
val shellFileZ = SuFile.open("/data/adb/service.d/$app.sh")
//Material team decided to keep their LinearProgressIndicator final shellFileZ.createNewFile()
//At least extension methods exist val code = """#!/system/bin/sh${"\n"}while [ "`getprop sys.boot_completed | tr -d '\r' `" != "1" ]; do sleep ${getDefaultPrefs().getInt("serviced_sleep_timer", 1)}; done${"\n"}chcon u:object_r:apk_data_file:s0 $apkFPath${"\n"}mount -o bind $apkFPath $path"""
fun LinearProgressIndicator.applyAccent() { SuFileOutputStream(shellFileZ).use { out -> out.write(code.toByteArray())}
with(accentColor.value ?: context.getDefaultPrefs().getInt("manager_accent_color", defAccentColor)) { }
setIndicatorColor(this)
trackColor = ColorUtils.setAlphaComponent(this, 70)
}
}
fun MaterialAlertDialogBuilder.applyAccent() {
with(accentColor.value ?: context.getDefaultPrefs().getInt("manager_accent_color", defAccentColor)) {
show().apply {
getButton(DialogInterface.BUTTON_POSITIVE).setTextColor(this@with)
getButton(DialogInterface.BUTTON_NEGATIVE).setTextColor(this@with)
getButton(DialogInterface.BUTTON_NEUTRAL).setTextColor(this@with)
}
}
}
fun Context.writeServiceDScript(apkFPath: String, path: String, app: String) {
val shellFileZ = SuFile.open("/data/adb/service.d/$app.sh")
shellFileZ.createNewFile()
val code = """#!/system/bin/sh${"\n"}while [ "`getprop sys.boot_completed | tr -d '\r' `" != "1" ]; do sleep ${getDefaultPrefs().getInt("serviced_sleep_timer", 1)}; done${"\n"}chcon u:object_r:apk_data_file:s0 $apkFPath${"\n"}mount -o bind $apkFPath $path"""
SuFileOutputStream(shellFileZ).use { out -> out.write(code.toByteArray())}
}
}

View File

@ -14,101 +14,95 @@ import androidx.preference.PreferenceManager.getDefaultSharedPreferences
import com.beust.klaxon.JsonArray import com.beust.klaxon.JsonArray
import com.beust.klaxon.JsonObject import com.beust.klaxon.JsonObject
import com.vanced.manager.R import com.vanced.manager.R
import com.vanced.manager.library.network.okhttp.interceptors.LOG_INTERCEPTOR
import com.vanced.manager.utils.AppUtils.generateChecksum import com.vanced.manager.utils.AppUtils.generateChecksum
import com.vanced.manager.utils.Extensions.getDefaultPrefs
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import java.io.File import java.io.File
import java.util.* import java.util.*
object InternetTools { private const val TAG = "VMNetTools"
private const val TAG = "VMNetTools" val vanced = MutableLiveData<JsonObject?>()
val music = MutableLiveData<JsonObject?>()
val microg = MutableLiveData<JsonObject?>()
val manager = MutableLiveData<JsonObject?>()
val vanced = MutableLiveData<JsonObject?>() val vancedVersions = MutableLiveData<JsonArray<String>>()
val music = MutableLiveData<JsonObject?>() val musicVersions = MutableLiveData<JsonArray<String>>()
val microg = MutableLiveData<JsonObject?>()
val manager = MutableLiveData<JsonObject?>()
val vancedVersions = MutableLiveData<JsonArray<String>>() val isFetching = MutableLiveData<Boolean>()
val musicVersions = MutableLiveData<JsonArray<String>>()
val isFetching = MutableLiveData<Boolean>() //var braveTiers = MutableLiveData<JsonObject?>()
//var braveTiers = MutableLiveData<JsonObject?>() fun openUrl(url: String, color: Int, context: Context) {
try {
val customTabPrefs = getDefaultSharedPreferences(context).getBoolean("use_custom_tabs", true)
if (customTabPrefs) {
val builder = CustomTabsIntent.Builder()
val params = CustomTabColorSchemeParams.Builder().setToolbarColor(ContextCompat.getColor(context, color))
builder.setDefaultColorSchemeParams(params.build())
val customTabsIntent = builder.build()
customTabsIntent.intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
customTabsIntent.launchUrl(context, url.toUri())
} else
context.startActivity(Intent(Intent.ACTION_VIEW, url.toUri()).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK))
fun openUrl(url: String, color: Int, context: Context) { } catch (e: ActivityNotFoundException) {
try { Toast.makeText(context, R.string.error, Toast.LENGTH_SHORT).show()
val customTabPrefs = getDefaultSharedPreferences(context).getBoolean("use_custom_tabs", true)
if (customTabPrefs) {
val builder = CustomTabsIntent.Builder()
val params = CustomTabColorSchemeParams.Builder().setToolbarColor(ContextCompat.getColor(context, color))
builder.setDefaultColorSchemeParams(params.build())
val customTabsIntent = builder.build()
customTabsIntent.intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
customTabsIntent.launchUrl(context, url.toUri())
} else
context.startActivity(Intent(Intent.ACTION_VIEW, url.toUri()).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK))
} catch (e: ActivityNotFoundException) {
Toast.makeText(context, R.string.error, Toast.LENGTH_SHORT).show()
}
} }
}
fun getFileNameFromUrl(url: String) = url.substring(url.lastIndexOf('/') + 1, url.length) fun getFileNameFromUrl(url: String) = url.substring(url.lastIndexOf('/') + 1, url.length)
suspend fun loadJson(context: Context) = withContext(Dispatchers.IO) { suspend fun loadJson(context: Context) = withContext(Dispatchers.IO) {
isFetching.postValue(true) isFetching.postValue(true)
val installUrl = context.getDefaultPrefs().getString("install_url", baseUrl) val installUrl = context.getDefaultPrefs().getString("install_url", baseUrl)
val calendar = Calendar.getInstance() val calendar = Calendar.getInstance()
val hour = calendar.get(Calendar.HOUR_OF_DAY) val hour = calendar.get(Calendar.HOUR_OF_DAY)
val minute = calendar.get(Calendar.MINUTE) val minute = calendar.get(Calendar.MINUTE)
val second = calendar.get(Calendar.SECOND) val second = calendar.get(Calendar.SECOND)
val fetchTime = "fetchTime=$hour$minute$second" val fetchTime = "fetchTime=$hour$minute$second"
val latest = JsonHelper.getJson("$installUrl/latest.json?$fetchTime") val latest = getJson("$installUrl/latest.json?$fetchTime")
val versions = JsonHelper.getJson("$installUrl/versions.json?$fetchTime") val versions = getJson("$installUrl/versions.json?$fetchTime")
// braveTiers.apply { // braveTiers.apply {
// set(getJson("$installUrl/sponsor.json")) // set(getJson("$installUrl/sponsor.json"))
// notifyChange() // notifyChange()
// } // }
vanced.postValue(latest?.obj("vanced")) vanced.postValue(latest?.obj("vanced"))
vancedVersions.postValue(versions?.array("vanced") ) vancedVersions.postValue(versions?.array("vanced") )
music.postValue(latest?.obj("music")) music.postValue(latest?.obj("music"))
musicVersions.postValue(versions?.array("music")) musicVersions.postValue(versions?.array("music"))
microg.postValue(latest?.obj("microg")) microg.postValue(latest?.obj("microg"))
manager.postValue(latest?.obj("manager")) manager.postValue(latest?.obj("manager"))
isFetching.postValue(false) isFetching.postValue(false)
}
private suspend fun getJsonString(file: String, obj: String, context: Context): String {
val installUrl = context.getDefaultPrefs().getString("install_url", baseUrl)
return try {
getJson("$installUrl/$file")?.string(obj) ?: context.getString(R.string.unavailable)
} catch (e: Exception) {
Log.e(TAG, "Error: ", e)
context.getString(R.string.unavailable)
} }
}
private suspend fun getJsonString(file: String, obj: String, context: Context): String { suspend fun getSha256(hashUrl: String, obj: String, context: Context): String {
val installUrl = context.getDefaultPrefs().getString("install_url", baseUrl) return getJsonString(hashUrl, obj, context)
return try { }
JsonHelper.getJson("$installUrl/$file")?.string(obj) ?: context.getString(R.string.unavailable)
} catch (e: Exception) { fun checkSHA256(sha256: String, updateFile: File): Boolean {
Log.e(TAG, "Error: ", e) return try {
context.getString(R.string.unavailable) val dataBuffer = updateFile.readBytes()
} // Generate the checksum
val sum = generateChecksum(dataBuffer)
sum.equals(sha256, ignoreCase = true)
} catch (e: Exception) {
e.printStackTrace()
false
} }
}
suspend fun getSha256(hashUrl: String, obj: String, context: Context): String { const val baseUrl = "https://vancedapp.com/api/v1"
return getJsonString(hashUrl, obj, context)
}
fun checkSHA256(sha256: String, updateFile: File): Boolean {
return try {
val dataBuffer = updateFile.readBytes()
// Generate the checksum
val sum = generateChecksum(dataBuffer)
sum.equals(sha256, ignoreCase = true)
} catch (e: Exception) {
e.printStackTrace()
false
}
}
const val baseUrl = "https://vancedapp.com/api/v1"
}

View File

@ -7,32 +7,28 @@ import com.beust.klaxon.Parser
import com.github.kittinunf.fuel.coroutines.awaitString import com.github.kittinunf.fuel.coroutines.awaitString
import com.github.kittinunf.fuel.httpGet import com.github.kittinunf.fuel.httpGet
object JsonHelper { private var dataMap: HashMap<String, JsonObject> = HashMap()
private var dataMap: HashMap<String, JsonObject> = HashMap() suspend fun getJson(url: String): JsonObject? {
return try {
suspend fun getJson(url: String): JsonObject? { if (dataMap.containsKey(url)) {
return try { dataMap[url]
if (dataMap.containsKey(url)) { } else {
dataMap[url] dataMap[url] = getSuspendJson(url)
} else { dataMap[url]
dataMap[url] = getSuspendJson(url)
dataMap[url]
}
} catch (e: Exception) {
//This null is NEEDED, do NOT try to "fix" NPE here!!!
null
} }
} catch (e: Exception) {
//This null is NEEDED, do NOT try to "fix" NPE here!!!
null
} }
}
private suspend fun getSuspendJson(url: String): JsonObject = private suspend fun getSuspendJson(url: String): JsonObject =
Parser.default().parse( Parser.default().parse(
StringBuilder(url.httpGet().awaitString()) StringBuilder(url.httpGet().awaitString())
) as JsonObject ) as JsonObject
suspend fun getJsonArray(url: String): JsonArray<String> = suspend fun getJsonArray(url: String): JsonArray<String> =
Klaxon().parseArray<String>( Klaxon().parseArray<String>(
url.httpGet().awaitString() url.httpGet().awaitString()
) as JsonArray<String> ) as JsonArray<String>
}

View File

@ -11,73 +11,68 @@ import android.provider.Settings
import androidx.annotation.RequiresApi import androidx.annotation.RequiresApi
import com.crowdin.platform.Crowdin import com.crowdin.platform.Crowdin
import com.vanced.manager.R import com.vanced.manager.R
import com.vanced.manager.utils.InternetTools.vanced
import java.util.* import java.util.*
object LanguageHelper { fun getLanguageFormat(context: Context, language: String): String {
return when {
fun getLanguageFormat(context: Context, language: String): String { language == "System Default" -> context.getString(R.string.system_default)
return when { language.length > 2 -> {
language == "System Default" -> context.getString(R.string.system_default) val loc = Locale(
language.length > 2 -> { language.substring(0, language.length - 3),
val loc = Locale( language.substring(language.length - 2)
language.substring(0, language.length - 3), )
language.substring(language.length - 2) loc.getDisplayName(loc).capitalize(Locale.ENGLISH)
) }
loc.getDisplayName(loc).capitalize(Locale.ENGLISH) else -> {
} val loc = Locale(language)
else -> { loc.getDisplayName(loc).capitalize(Locale.ENGLISH)
val loc = Locale(language)
loc.getDisplayName(loc).capitalize(Locale.ENGLISH)
}
} }
} }
@Suppress("DEPRECATION") }
fun getDefaultVancedLanguages(): String {
val serverLangs = vanced.value?.array("langs") ?: mutableListOf("")
val sysLocales = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) Resources.getSystem().configuration.locales.toLangTags() else arrayOf(Resources.getSystem().configuration.locale.language)
val finalLangs = mutableListOf<String>()
sysLocales.forEach { sysLocale ->
when {
sysLocale == "en" -> finalLangs.add(sysLocale)
serverLangs.contains(sysLocale) -> finalLangs.add(sysLocale)
}
}
return finalLangs.distinct().sorted().joinToString(", ") @Suppress("DEPRECATION")
fun getDefaultVancedLanguages(): String {
val serverLangs = vanced.value?.array("langs") ?: mutableListOf("")
val sysLocales = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) Resources.getSystem().configuration.locales.toLangTags() else arrayOf(Resources.getSystem().configuration.locale.language)
val finalLangs = mutableListOf<String>()
sysLocales.forEach { sysLocale ->
when {
sysLocale == "en" -> finalLangs.add(sysLocale)
serverLangs.contains(sysLocale) -> finalLangs.add(sysLocale)
}
} }
@RequiresApi(Build.VERSION_CODES.N) return finalLangs.distinct().sorted().joinToString(", ")
fun LocaleList.toLangTags(): Array<String> { }
val langTags: Array<String> = this.toLanguageTags().split(",").toTypedArray()
for (i in 0 until this.size()) {
langTags[i] = langTags[i].substring(0, 2)
}
return langTags
}
fun Activity.authCrowdin() { @RequiresApi(Build.VERSION_CODES.N)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { fun LocaleList.toLangTags(): Array<String> {
if (!Settings.canDrawOverlays(this)) { val langTags: Array<String> = this.toLanguageTags().split(",").toTypedArray()
val intent = Intent( for (i in 0 until this.size()) {
Settings.ACTION_MANAGE_OVERLAY_PERMISSION, langTags[i] = langTags[i].substring(0, 2)
Uri.parse("package:$packageName") }
) return langTags
startActivityForResult(intent, 69) }
return
} fun Activity.authCrowdin() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (!Settings.canDrawOverlays(this)) {
val intent = Intent(
Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
Uri.parse("package:$packageName")
)
startActivityForResult(intent, 69)
return
}
Crowdin.authorize(this)
}
}
fun Activity.onActivityResult(requestCode: Int) {
if (requestCode == 69 && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (Settings.canDrawOverlays(this)) {
Crowdin.authorize(this) Crowdin.authorize(this)
} }
} }
fun Activity.onActivityResult(requestCode: Int) {
if (requestCode == 69 && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (Settings.canDrawOverlays(this)) {
Crowdin.authorize(this)
}
}
}
} }

View File

@ -4,22 +4,19 @@ import java.io.BufferedReader
import java.io.IOException import java.io.IOException
import java.io.InputStreamReader import java.io.InputStreamReader
object MiuiHelper { private const val MIUI_PROP_NAME = "ro.miui.ui.version.name"
private const val MIUI_PROP_NAME = "ro.miui.ui.version.name" fun isMiui(): Boolean = !getSystemProps(MIUI_PROP_NAME).isNullOrEmpty()
fun isMiui(): Boolean = !getSystemProps(MIUI_PROP_NAME).isNullOrEmpty() private fun getSystemProps(propname: String): String? {
var input: BufferedReader? = null
private fun getSystemProps(propname: String): String? { return try {
var input: BufferedReader? = null val process = Runtime.getRuntime().exec("getprop $propname")
return try { input = BufferedReader(InputStreamReader(process.inputStream), 1024)
val process = Runtime.getRuntime().exec("getprop $propname") input.readLine()
input = BufferedReader(InputStreamReader(process.inputStream), 1024) } catch (e: IOException) {
input.readLine() null
} catch (e: IOException) { } finally {
null input?.close()
} finally {
input?.close()
}
} }
} }

View File

@ -18,9 +18,6 @@ import com.vanced.manager.utils.AppUtils.sendCloseDialog
import com.vanced.manager.utils.AppUtils.sendFailure import com.vanced.manager.utils.AppUtils.sendFailure
import com.vanced.manager.utils.AppUtils.sendRefresh import com.vanced.manager.utils.AppUtils.sendRefresh
import com.vanced.manager.utils.AppUtils.vancedRootPkg import com.vanced.manager.utils.AppUtils.vancedRootPkg
import com.vanced.manager.utils.Extensions.writeServiceDScript
import com.vanced.manager.utils.InternetTools.music
import com.vanced.manager.utils.InternetTools.vanced
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch

View File

@ -5,27 +5,22 @@ import android.content.res.Configuration
import androidx.lifecycle.LiveData import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData import androidx.lifecycle.MutableLiveData
import com.vanced.manager.R import com.vanced.manager.R
import com.vanced.manager.utils.Extensions.getDefaultPrefs
object ThemeHelper { const val defAccentColor: Int = -13732865
const val defAccentColor: Int = -13732865 val mutableAccentColor = MutableLiveData<Int>()
val accentColor: LiveData<Int> = mutableAccentColor
val mutableAccentColor = MutableLiveData<Int>() fun Activity.setFinalTheme() {
val accentColor: LiveData<Int> = mutableAccentColor when (getDefaultPrefs().getString("manager_theme", "System Default")) {
"Light" -> setTheme(R.style.LightTheme)
fun Activity.setFinalTheme() { "Dark" -> setTheme(R.style.DarkTheme)
when (getDefaultPrefs().getString("manager_theme", "System Default")) { "System Default" -> {
"Light" -> setTheme(R.style.LightTheme) when (resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK) {
"Dark" -> setTheme(R.style.DarkTheme) Configuration.UI_MODE_NIGHT_YES -> setTheme(R.style.DarkTheme)
"System Default" -> { Configuration.UI_MODE_NIGHT_NO -> setTheme(R.style.LightTheme)
when (resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK) {
Configuration.UI_MODE_NIGHT_YES -> setTheme(R.style.DarkTheme)
Configuration.UI_MODE_NIGHT_NO -> setTheme(R.style.LightTheme)
}
} }
else -> setTheme(R.style.LightTheme)
} }
else -> setTheme(R.style.LightTheme)
} }
} }