commit
90767325ad
|
@ -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
|
||||
|
||||
|
|
|
@ -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++
|
||||
}
|
||||
|
|
|
@ -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") {
|
||||
|
|
|
@ -16,9 +16,9 @@ import kotlinx.coroutines.launch
|
|||
open class DataModel(
|
||||
private val jsonObject: LiveData<JsonObject?>,
|
||||
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<Int>()
|
||||
|
@ -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)
|
||||
|
|
|
@ -23,7 +23,7 @@ open class ProgressModel {
|
|||
}
|
||||
|
||||
init {
|
||||
installing.value = false
|
||||
installing.postValue(false)
|
||||
reset()
|
||||
}
|
||||
|
||||
|
|
|
@ -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<JsonObject?>,
|
||||
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
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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<DataModel>()
|
||||
val vancedRootModel = MutableLiveData<RootDataModel>()
|
||||
|
@ -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))
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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<FileInfo>, 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()
|
||||
}
|
||||
|
|
|
@ -51,9 +51,9 @@
|
|||
<string name="link_title">Isticmaal Daaqadaha Chrome</string>
|
||||
<string name="link_custom_tabs">Linkiyadu waxay ku furmi doonaan daaqadaha Chrome-ka ee loogu talagalay</string>
|
||||
<string name="system_default">Sida aaladu tahay</string>
|
||||
<string name="script_save_failed">Failed to save new time value</string>
|
||||
<string name="script_sleep_timer">Root Script Sleep Time</string>
|
||||
<string name="script_sleep_timer_description">Adjust sleep time value used in /data/adb/service.d/app.sh script, useful for fixing mounting issues</string>
|
||||
<string name="script_save_failed">Laguma guulaysan in cadadka wakhtiga la kaydiyo</string>
|
||||
<string name="script_sleep_timer">Qormada Wakhtiga Jiifka ee Root-ka</string>
|
||||
<string name="script_sleep_timer_description">Habee cadadka wakhtiga jiifka ee loo isticmaalay qormada /data/adb/service.d/app.s, waxay muhiim u tahay cilladaha galinta</string>
|
||||
<string name="theme">Nashqada</string>
|
||||
<string name="theme_dark">Nashqad Madow</string>
|
||||
<string name="theme_light">Nashqad Cad</string>
|
||||
|
@ -104,7 +104,7 @@
|
|||
<string name="installation_aborted">Ku shubidii way guuldaraysatay sababtoo ah qofka aalada isticmaalaya ayaa joojiyay.</string>
|
||||
<string name="installation_blocked">Ku shubidii way guuldaraysatay sababtoo ah qofka aalada isticmaalaya ayaa xanibay.</string>
|
||||
<string name="installation_downgrade">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.</string>
|
||||
<string name="installation_conflict">Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again.</string>
|
||||
<string name="installation_conflict">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.</string>
|
||||
<string name="installation_failed">Ku shubidii way guuldaraysatay sababo aan la garanaynin awgood, kusoo biir Telegram-kanaga ama Discord-ka si aad caawin dheerad ah u hesho.</string>
|
||||
<string name="installation_incompatible">Ku shubidii way guuldaraysatay sababtoo ah faylka kuma shaqaynayo aaladaada. Xaga Fadhiga ka saar waxyaabaha lasoo dajiyay, kadib markale isku day.</string>
|
||||
<string name="installation_invalid">Ku shubidii way guuldaraysatay sababtoo ah faylashii apk-ga ayaa khalkhalsan, markale isku day.</string>
|
||||
|
|
|
@ -51,9 +51,9 @@
|
|||
<string name="link_title">Chrome Özel Sekmelerini kullan</string>
|
||||
<string name="link_custom_tabs">Bağlantılar Chrome Özel Sekmelerinde açılacaktır</string>
|
||||
<string name="system_default">Sistem varsayılanı</string>
|
||||
<string name="script_save_failed">Failed to save new time value</string>
|
||||
<string name="script_save_failed">Yeni zaman değeri kaydedilemedi</string>
|
||||
<string name="script_sleep_timer">Root Script Sleep Time</string>
|
||||
<string name="script_sleep_timer_description">Adjust sleep time value used in /data/adb/service.d/app.sh script, useful for fixing mounting issues</string>
|
||||
<string name="script_sleep_timer_description">/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</string>
|
||||
<string name="theme">Tema</string>
|
||||
<string name="theme_dark">Koyu Tema</string>
|
||||
<string name="theme_light">Açık Tema</string>
|
||||
|
@ -104,7 +104,7 @@
|
|||
<string name="installation_aborted">Kullanıcı kurulumu iptal ettiği için kurulum başarısız oldu.</string>
|
||||
<string name="installation_blocked">Kullanıcı kurulumu engellediği için kurulum başarısız oldu.</string>
|
||||
<string name="installation_downgrade">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.</string>
|
||||
<string name="installation_conflict">Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again.</string>
|
||||
<string name="installation_conflict">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.</string>
|
||||
<string name="installation_failed">Kurulum bilinmeyen nedenlerden dolayı başarısız oldu. Telegram veya Discord\'a katılarak destek alabilirsin.</string>
|
||||
<string name="installation_incompatible">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.</string>
|
||||
<string name="installation_invalid">APK dosyaları çözümlenemediğinden, kurulum başarısız oldu. Lütfen yeniden deneyin.</string>
|
||||
|
|
|
@ -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 <D : DialogFragment> 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")
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue