diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 28cdfb4c..5970e66b 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -15,8 +15,8 @@ android { applicationId = "com.vanced.manager" minSdkVersion(21) targetSdkVersion(30) - versionCode = 220 - versionName = "2.2.0 (RootedFirebase)" + versionCode = 221 + versionName = "2.2.1 (RootedFirebase)" vectorDrawables.useSupportLibrary = true 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 29f241ad..0f62afb2 100644 --- a/app/src/main/java/com/vanced/manager/adapter/AppListAdapter.kt +++ b/app/src/main/java/com/vanced/manager/adapter/AppListAdapter.kt @@ -76,13 +76,13 @@ class AppListAdapter( override fun onBindViewHolder(holder: ListViewHolder, position: Int) { holder.bind(position) - + val dataModel = if (isRoot) rootDataModels[position] else dataModels[position] holder.appCard.setOnClickListener { tooltip.close() AppInfoDialog.newInstance( appName = apps[position], - appIcon = dataModels[position]?.appIcon, - changelog = dataModels[position]?.changelog?.value + appIcon = dataModel?.appIcon, + changelog = dataModel?.changelog?.value ).show(context.supportFragmentManager, "info") } } @@ -92,15 +92,21 @@ class AppListAdapter( init { if (prefs.getBoolean("enable_vanced", true)) { - dataModels.add(viewModel.vancedModel.value) - rootDataModels.add(viewModel.vancedRootModel.value) + if (isRoot) { + rootDataModels.add(viewModel.vancedRootModel.value) + } else { + dataModels.add(viewModel.vancedModel.value) + } apps.add(context.getString(R.string.vanced)) itemCount++ } if (prefs.getBoolean("enable_music", true)) { - dataModels.add(viewModel.musicModel.value) - rootDataModels.add(viewModel.musicRootModel.value) + if (isRoot) { + rootDataModels.add(viewModel.musicRootModel.value) + } else { + dataModels.add(viewModel.musicModel.value) + } apps.add(context.getString(R.string.music)) itemCount++ } 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 2661e7d4..0defd939 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 @@ -2,6 +2,7 @@ package com.vanced.manager.core.downloader import android.content.Context import android.content.SharedPreferences +import android.util.Log import androidx.preference.PreferenceManager.getDefaultSharedPreferences import com.google.firebase.analytics.FirebaseAnalytics import com.google.firebase.analytics.ktx.logEvent @@ -15,6 +16,7 @@ import com.vanced.manager.utils.PackageHelper.downloadStockCheck import com.vanced.manager.utils.PackageHelper.installVanced import com.vanced.manager.utils.PackageHelper.installVancedRoot import java.io.File +import java.lang.Exception object VancedDownloader { @@ -58,7 +60,13 @@ object VancedDownloader { count = 0 vancedVersionCode = vanced.value?.int("versionCode") ?: 0 - downloadSplits(context) + try { + downloadSplits(context) + } catch (e: Exception) { + Log.d("VMDownloader", e.stackTraceToString()) + downloadProgress.value?.downloadingFile?.postValue(context.getString(R.string.error_downloading, "Vanced")) + } + } private fun downloadSplits(context: Context, type: String = "theme") { 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 0d9b617a..0b91d637 100644 --- a/app/src/main/java/com/vanced/manager/model/DataModel.kt +++ b/app/src/main/java/com/vanced/manager/model/DataModel.kt @@ -16,9 +16,9 @@ import kotlinx.coroutines.launch open class DataModel( private val jsonObject: LiveData, private val context: Context, - open val appPkg: String, - open val appName: String, - open val appIcon: Drawable?, + val appPkg: String, + val appName: String, + val appIcon: Drawable?, ) { private val versionCode = MutableLiveData() @@ -32,11 +32,9 @@ open class DataModel( private fun fetch() = CoroutineScope(Dispatchers.IO).launch { val jobj = jsonObject.value - isAppInstalled.postValue(isPackageInstalled(appPkg, context.packageManager)) + isAppInstalled.postValue(isAppInstalled(appPkg)) versionCode.postValue(jobj?.int("versionCode") ?: 0) - versionName.postValue(jobj?.string("version")?.removeSuffix("-vanced") ?: context.getString( - R.string.unavailable - )) + versionName.postValue(jobj?.string("version")?.removeSuffix("-vanced") ?: context.getString(R.string.unavailable)) changelog.postValue(jobj?.string("changelog") ?: context.getString(R.string.unavailable)) } @@ -50,8 +48,8 @@ open class DataModel( } this?.let { isAppInstalled.observe(it) { - installedVersionCode.postValue(getPkgVersionCode(appPkg)) - installedVersionName.postValue(getPkgVersionName(appPkg)) + installedVersionCode.value = getPkgVersionCode(appPkg) + installedVersionName.value = getPkgVersionName(appPkg) } } this?.let { @@ -64,10 +62,12 @@ open class DataModel( } } - open fun getPkgVersionName(pkg: String): String { + open fun isAppInstalled(pkg: String): Boolean = isPackageInstalled(pkg, context.packageManager) + + private fun getPkgVersionName(pkg: String): String { val pm = context.packageManager return if (isAppInstalled.value == true) { - pm.getPackageInfo(pkg, 0).versionName.removeSuffix("-vanced") + pm?.getPackageInfo(pkg, 0)?.versionName?.removeSuffix("-vanced") ?: context.getString(R.string.unavailable) } else { context.getString(R.string.unavailable) } @@ -75,16 +75,16 @@ open class DataModel( @Suppress("DEPRECATION") private fun getPkgVersionCode(pkg: String): Int { + val pm = context.packageManager return if (isAppInstalled.value == true) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) - context.packageManager.getPackageInfo(pkg, 0).longVersionCode.and(0xFFFFFFFF) - .toInt() + pm?.getPackageInfo(pkg, 0)?.longVersionCode?.and(0xFFFFFFFF)?.toInt() ?: 0 else - context.packageManager.getPackageInfo(pkg, 0).versionCode + pm?.getPackageInfo(pkg, 0)?.versionCode ?: 0 } else 0 } - open fun compareInt(int1: Int?, int2: Int?): String { + private fun compareInt(int1: Int?, int2: Int?): String { if (int2 != null && int1 != null) { return when { int1 == 0 -> context.getString(R.string.install) diff --git a/app/src/main/java/com/vanced/manager/model/ProgressModel.kt b/app/src/main/java/com/vanced/manager/model/ProgressModel.kt index c0014803..208e343c 100644 --- a/app/src/main/java/com/vanced/manager/model/ProgressModel.kt +++ b/app/src/main/java/com/vanced/manager/model/ProgressModel.kt @@ -23,7 +23,7 @@ open class ProgressModel { } init { - installing.value = false + installing.postValue(false) reset() } 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 2466772d..bf80ac83 100644 --- a/app/src/main/java/com/vanced/manager/model/RootDataModel.kt +++ b/app/src/main/java/com/vanced/manager/model/RootDataModel.kt @@ -4,33 +4,30 @@ import android.content.Context import android.graphics.drawable.Drawable import androidx.lifecycle.LiveData import com.beust.klaxon.JsonObject -import com.vanced.manager.R import com.vanced.manager.utils.PackageHelper -open class RootDataModel( +class RootDataModel( jsonObject: LiveData, - private val context: Context, - override val appPkg: String, - override val appName: String, - override val appIcon: Drawable?, - private val scriptName: String + context: Context, + appPkg: String, + appName: String, + appIcon: Drawable?, + //BUG THIS! + //kotlin thinks that this value is null if we use + //private val scriptName: String + //Although it's impossible for it to be null. + //Ironic, isn't it? + private val scriptName: String? ): DataModel( jsonObject, context, appPkg, appName, appIcon ) { - override fun getPkgVersionName(pkg: String): String { - return if (PackageHelper.scriptExists(scriptName)) { - super.getPkgVersionName(pkg) + override fun isAppInstalled(pkg: String): Boolean { + //Adapt to nullable shit + return if (scriptName?.let { PackageHelper.scriptExists(it) } == true) { + super.isAppInstalled(appPkg) } else { - context.getString(R.string.unavailable) - } - } - - override fun compareInt(int1: Int?, int2: Int?): String { - return if (PackageHelper.scriptExists(scriptName)) { - super.compareInt(int1, int2) - } else { - context.getString(R.string.install) + false } } 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 273e9195..cd2516b6 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 @@ -43,6 +43,7 @@ import kotlinx.coroutines.launch open class HomeViewModel(private val activity: FragmentActivity): ViewModel() { private val prefs = getDefaultSharedPreferences(activity) + private val variant get() = prefs.getString("vanced_variant", "nonroot") val vancedModel = MutableLiveData() val vancedRootModel = MutableLiveData() @@ -90,7 +91,6 @@ open class HomeViewModel(private val activity: FragmentActivity): ViewModel() { } fun openInstallDialog(view: View, app: String) { - val variant = prefs.getString("vanced_variant", "nonroot") if (variant == "nonroot" && app != activity.getString(R.string.microg) && !microgModel.value?.isAppInstalled?.value!!) { microgToast.show() return @@ -147,7 +147,7 @@ open class HomeViewModel(private val activity: FragmentActivity): ViewModel() { } fun uninstallPackage(pkg: String) { - if (prefs.getString("vanced_variant", "nonroot") == "root" && uninstallRootApk(pkg)) { + if (variant == "root" && uninstallRootApk(pkg)) { viewModelScope.launch { loadJson(activity) } } else { uninstallApk(pkg, activity) @@ -155,13 +155,14 @@ open class HomeViewModel(private val activity: FragmentActivity): ViewModel() { } init { - if (prefs.getString("vanced_variant", "nonroot") == "root") { + 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)) } - 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)) 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/AppUtils.kt b/app/src/main/java/com/vanced/manager/utils/AppUtils.kt index 2ebbc562..0e1665b3 100644 --- a/app/src/main/java/com/vanced/manager/utils/AppUtils.kt +++ b/app/src/main/java/com/vanced/manager/utils/AppUtils.kt @@ -59,6 +59,16 @@ object AppUtils: CoroutineScope by CoroutineScope(Dispatchers.IO) { } } + fun sendFailure(error: String, context: Context): Job { + return launch { + delay(700) + val intent = Intent(HomeFragment.INSTALL_FAILED) + intent.putExtra("errorMsg", getErrorMessage(error, context)) + intent.putExtra("fullErrorMsg", error) + LocalBroadcastManager.getInstance(context).sendBroadcast(intent) + } + } + @Throws(IOException::class) fun generateChecksum(data: ByteArray): String { try { diff --git a/app/src/main/java/com/vanced/manager/utils/DownloadHelper.kt b/app/src/main/java/com/vanced/manager/utils/DownloadHelper.kt index 10cd58a8..d0de8774 100644 --- a/app/src/main/java/com/vanced/manager/utils/DownloadHelper.kt +++ b/app/src/main/java/com/vanced/manager/utils/DownloadHelper.kt @@ -117,7 +117,7 @@ object DownloadHelper : CoroutineScope by CoroutineScope(Dispatchers.IO) { fun downloadManager(context: Context) { val url = "https://github.com/YTVanced/VancedManager/releases/latest/download/manager.apk" - download(url,"https://github.com/YTVanced/VancedManager", "manager", "manager.apk", context, onDownloadComplete = { + download(url,"https://github.com/YTVanced/VancedManager/", "manager", "manager.apk", context, onDownloadComplete = { val apk = File("${context.getExternalFilesDir("manager")?.path}/manager.apk") val uri = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) 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 7315dc5f..be032d82 100644 --- a/app/src/main/java/com/vanced/manager/utils/PackageHelper.kt +++ b/app/src/main/java/com/vanced/manager/utils/PackageHelper.kt @@ -161,23 +161,28 @@ object PackageHelper { } fun install(path: String, context: Context) { - val callbackIntent = Intent(context, AppInstallerService::class.java) - val pendingIntent = PendingIntent.getService(context, 0, callbackIntent, 0) - val packageInstaller = context.packageManager.packageInstaller - val params = PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL) - val sessionId = packageInstaller.createSession(params) - val session = packageInstaller.openSession(sessionId) - val inputStream: InputStream = FileInputStream(path) - val outputStream = session.openWrite("install", 0, -1) - val buffer = ByteArray(65536) - var c: Int - while (inputStream.read(buffer).also { c = it } != -1) { - outputStream.write(buffer, 0, c) + try { + val callbackIntent = Intent(context, AppInstallerService::class.java) + val pendingIntent = PendingIntent.getService(context, 0, callbackIntent, 0) + val packageInstaller = context.packageManager.packageInstaller + val params = PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL) + val sessionId = packageInstaller.createSession(params) + val session = packageInstaller.openSession(sessionId) + val inputStream: InputStream = FileInputStream(path) + val outputStream = session.openWrite("install", 0, -1) + val buffer = ByteArray(65536) + var c: Int + while (inputStream.read(buffer).also { c = it } != -1) { + outputStream.write(buffer, 0, c) + } + session.fsync(outputStream) + inputStream.close() + outputStream.close() + session.commit(pendingIntent.intentSender) + } catch (e: IOException) { + Log.d(INSTALLER_TAG, e.stackTraceToString()) } - session.fsync(outputStream) - inputStream.close() - outputStream.close() - session.commit(pendingIntent.intentSender) + } private fun installRootMusic(files: ArrayList, context: Context): Boolean { @@ -271,7 +276,7 @@ object PackageHelper { } doCommitSession(sessionId, context) Log.d(INSTALLER_TAG,"Success") - } catch (e: IOException) { + } catch (e: Exception) { e.printStackTrace() } return sessionId @@ -326,19 +331,16 @@ object PackageHelper { private fun doCommitSession(sessionId: Int, context: Context) { var session: PackageInstaller.Session? = null try { - try { - session = context.packageManager.packageInstaller.openSession(sessionId) - val callbackIntent = Intent(context, AppInstallerService::class.java) - val pendingIntent = PendingIntent.getService(context, 0, callbackIntent, 0) - session.commit(pendingIntent.intentSender) - session.close() - Log.d(INSTALLER_TAG, "install request sent") - Log.d(INSTALLER_TAG, "doCommitSession: " + context.packageManager.packageInstaller.mySessions) - Log.d(INSTALLER_TAG, "doCommitSession: after session commit ") - } catch (e: IOException) { - e.printStackTrace() - } - + session = context.packageManager.packageInstaller.openSession(sessionId) + val callbackIntent = Intent(context, AppInstallerService::class.java) + val pendingIntent = PendingIntent.getService(context, 0, callbackIntent, 0) + session.commit(pendingIntent.intentSender) + session.close() + Log.d(INSTALLER_TAG, "install request sent") + Log.d(INSTALLER_TAG, "doCommitSession: " + context.packageManager.packageInstaller.mySessions) + Log.d(INSTALLER_TAG, "doCommitSession: after session commit ") + } catch (e: IOException) { + e.printStackTrace() } finally { session?.close() } diff --git a/app/src/main/res/values-so-rSO/strings.xml b/app/src/main/res/values-so-rSO/strings.xml index 97bc92b5..a0469965 100644 --- a/app/src/main/res/values-so-rSO/strings.xml +++ b/app/src/main/res/values-so-rSO/strings.xml @@ -51,9 +51,9 @@ Isticmaal Daaqadaha Chrome Linkiyadu waxay ku furmi doonaan daaqadaha Chrome-ka ee loogu talagalay Sida aaladu tahay - Failed to save new time value - Root Script Sleep Time - Adjust sleep time value used in /data/adb/service.d/app.sh script, useful for fixing mounting issues + Laguma guulaysan in cadadka wakhtiga la kaydiyo + Qormada Wakhtiga Jiifka ee Root-ka + Habee cadadka wakhtiga jiifka ee loo isticmaalay qormada /data/adb/service.d/app.s, waxay muhiim u tahay cilladaha galinta Nashqada Nashqad Madow Nashqad Cad @@ -104,7 +104,7 @@ Ku shubidii way guuldaraysatay sababtoo ah qofka aalada isticmaalaya ayaa joojiyay. Ku shubidii way guuldaraysatay sababtoo ah qofka aalada isticmaalaya ayaa xanibay. Ku shubidii way guuldaraysatay sababtoo ah qofka aalada isticmaalaya ayaa isku dayay inuu nooc hore ku shubo. Ka saar cusboonaysiinta xaga app-ka YouTube-ka caadiga ah, kadibna markale isku day. - Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again. + Ku shubidii way guuldaraysatay sababtoo ah app-ka waxay iskhilaafeen mid horay ugu jiray aalada. Ka saar nooca hadda ee kujira, kadib markale ku celi. Ku shubidii way guuldaraysatay sababo aan la garanaynin awgood, kusoo biir Telegram-kanaga ama Discord-ka si aad caawin dheerad ah u hesho. Ku shubidii way guuldaraysatay sababtoo ah faylka kuma shaqaynayo aaladaada. Xaga Fadhiga ka saar waxyaabaha lasoo dajiyay, kadib markale isku day. Ku shubidii way guuldaraysatay sababtoo ah faylashii apk-ga ayaa khalkhalsan, markale isku day. diff --git a/app/src/main/res/values-tr-rTR/strings.xml b/app/src/main/res/values-tr-rTR/strings.xml index c311a6f2..e859fafa 100644 --- a/app/src/main/res/values-tr-rTR/strings.xml +++ b/app/src/main/res/values-tr-rTR/strings.xml @@ -51,9 +51,9 @@ Chrome Özel Sekmelerini kullan Bağlantılar Chrome Özel Sekmelerinde açılacaktır Sistem varsayılanı - Failed to save new time value + Yeni zaman değeri kaydedilemedi Root Script Sleep Time - Adjust sleep time value used in /data/adb/service.d/app.sh script, useful for fixing mounting issues + /data/adb/service.d/app.sh komut dosyasında kullanılan uyku süresi değerini ayarlayın, montaj sorunlarını düzeltmek için yararlıdır Tema Koyu Tema Açık Tema @@ -104,7 +104,7 @@ Kullanıcı kurulumu iptal ettiği için kurulum başarısız oldu. Kullanıcı kurulumu engellediği için kurulum başarısız oldu. Kullanıcı eski sürümü yüklemeye çalıştığı için kurulum tamamlanamadı. Orijinal YouTube uygulamasının güncellemelerini kaldırdıktan sonra yeniden deneyin. - Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again. + Uygulama önceden yüklenmiş bir uygulamayla çakıştığından yükleme başarısız oldu. Uygulamanın mevcut sürümünü kaldırın ve ardından tekrar deneyin. Kurulum bilinmeyen nedenlerden dolayı başarısız oldu. Telegram veya Discord\'a katılarak destek alabilirsin. Kurulum dosyası cihazınız ile uyumsuz olduğu için kurulum işlemi başarısız oldu. Ayarlar\'da indirilen dosyaları temizleyip, tekrar deneyin. APK dosyaları çözümlenemediğinden, kurulum başarısız oldu. Lütfen yeniden deneyin. diff --git a/core-ui/src/main/java/com/vanced/manager/core/ui/ext/FragmentExt.kt b/core-ui/src/main/java/com/vanced/manager/core/ui/ext/FragmentExt.kt index c7fe6fe0..6dc5d24d 100644 --- a/core-ui/src/main/java/com/vanced/manager/core/ui/ext/FragmentExt.kt +++ b/core-ui/src/main/java/com/vanced/manager/core/ui/ext/FragmentExt.kt @@ -1,10 +1,16 @@ package com.vanced.manager.core.ui.ext +import android.util.Log import androidx.fragment.app.DialogFragment import androidx.fragment.app.Fragment fun Fragment.requireSupportFM() = requireActivity().supportFragmentManager fun Fragment.showDialog(dialog: D) { - dialog.show(requireSupportFM(), dialog::class.simpleName) + try { + dialog.show(requireSupportFM(), dialog::class.simpleName) + } catch (e: IllegalStateException) { + Log.d("VMUI", "Can not perform this action after onSaveInstanceState") + } + } \ No newline at end of file