diff --git a/app/src/main/java/com/vanced/manager/core/downloader/MicrogDownloader.kt b/app/src/main/java/com/vanced/manager/core/downloader/MicrogDownloader.kt index 69099d34..f3880c5b 100644 --- a/app/src/main/java/com/vanced/manager/core/downloader/MicrogDownloader.kt +++ b/app/src/main/java/com/vanced/manager/core/downloader/MicrogDownloader.kt @@ -24,6 +24,6 @@ object MicrogDownloader { fun startMicrogInstall(context: Context) { installing.postValue(true) postReset() - install(context.getFilePathInStorage("$folderName/$fileName"), context) + install("$folderName/$fileName".managerFilepath, context) } } diff --git a/app/src/main/java/com/vanced/manager/core/downloader/MusicDownloader.kt b/app/src/main/java/com/vanced/manager/core/downloader/MusicDownloader.kt index ade96438..8fc95532 100644 --- a/app/src/main/java/com/vanced/manager/core/downloader/MusicDownloader.kt +++ b/app/src/main/java/com/vanced/manager/core/downloader/MusicDownloader.kt @@ -68,6 +68,6 @@ object MusicDownloader { if (variant == "root") installMusicRoot(context) else - install(context.getFilePathInStorage("music/nonroot/nonroot.apk"), context) + install("music/nonroot/nonroot.apk".managerFilepath, context) } } 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 7f9aa069..c0bf2f58 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 @@ -41,7 +41,7 @@ object VancedDownloader { prefs = context.installPrefs variant = defPrefs.managerVariant folderName = "vanced/$variant" - downloadPath = context.getFilePathInStorage(folderName!!) + downloadPath = context.getExternalFilesDir(folderName)?.path File(downloadPath.toString()).deleteRecursively() prefs.lang?.let { lang = it.split(", ").toMutableList() diff --git a/app/src/main/java/com/vanced/manager/ui/MainActivity.kt b/app/src/main/java/com/vanced/manager/ui/MainActivity.kt index 0ee5af6b..cedf844d 100644 --- a/app/src/main/java/com/vanced/manager/ui/MainActivity.kt +++ b/app/src/main/java/com/vanced/manager/ui/MainActivity.kt @@ -102,7 +102,7 @@ class MainActivity : AppCompatActivity() { setFinalTheme() super.onResume() Crowdin.registerDataLoadingObserver(loadingObserver) - if (defPrefs.managerStorage == externalPath && !canAccessStorage(this)) { + if (!canAccessStorage(this)) { DialogContainer.storageDialog(this) } } diff --git a/app/src/main/java/com/vanced/manager/ui/dialogs/DialogContainer.kt b/app/src/main/java/com/vanced/manager/ui/dialogs/DialogContainer.kt index bcbeb013..15756977 100644 --- a/app/src/main/java/com/vanced/manager/ui/dialogs/DialogContainer.kt +++ b/app/src/main/java/com/vanced/manager/ui/dialogs/DialogContainer.kt @@ -42,7 +42,7 @@ object DialogContainer { setMessage(R.string.storage_access_required_summary) setPositiveButton(R.string.auth_dialog_ok) { dialog, _ -> dialog.cancel() - requestStoragePerms(activity, null) + requestStoragePerms(activity) } setCancelable(false) create() diff --git a/app/src/main/java/com/vanced/manager/ui/dialogs/ManagerStorageDialog.kt b/app/src/main/java/com/vanced/manager/ui/dialogs/ManagerStorageDialog.kt deleted file mode 100644 index 7b6dd3ad..00000000 --- a/app/src/main/java/com/vanced/manager/ui/dialogs/ManagerStorageDialog.kt +++ /dev/null @@ -1,67 +0,0 @@ -package com.vanced.manager.ui.dialogs - -import android.os.Bundle -import android.view.LayoutInflater -import android.view.ViewGroup -import androidx.activity.result.contract.ActivityResultContracts -import androidx.preference.PreferenceManager.getDefaultSharedPreferences -import com.google.android.material.radiobutton.MaterialRadioButton -import com.vanced.manager.core.ui.base.BindingBottomSheetDialogFragment -import com.vanced.manager.databinding.DialogManagerStorageBinding -import com.vanced.manager.utils.* - -class ManagerStorageDialog : BindingBottomSheetDialogFragment() { - - private val permissionLauncher = registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { results -> - if (results.all { it.value == true }) { - prefs.managerStorage = externalPath - } else { - prefs.managerStorage = internalPath - } - dismiss() - } - - companion object { - - fun newInstance(): ManagerStorageDialog = ManagerStorageDialog().apply { - arguments = Bundle() - } - } - - private val prefs by lazy { getDefaultSharedPreferences(requireActivity()) } - - override fun binding( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ) = DialogManagerStorageBinding.inflate(inflater, container, false) - - override fun otherSetups() { - bindData() - } - - private fun bindData() { - with(binding) { - val storage = prefs.managerStorage - root.findViewWithTag(storage).isChecked = true - storageSave.setOnClickListener { - val newPref = storageRadiogroup.checkedButtonTag - if (storage != newPref) { - if (newPref == externalPath) { - if (!canAccessStorage(requireActivity())) { - return@setOnClickListener requestStoragePerms(requireActivity(), permissionLauncher) - } - - prefs.managerStorage = externalPath - } else { - prefs.managerStorage = internalPath - } - dismiss() - requireActivity().recreate() - } else { - dismiss() - } - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/fragments/LogFragment.kt b/app/src/main/java/com/vanced/manager/ui/fragments/LogFragment.kt index 7f80f0c9..078f67d6 100644 --- a/app/src/main/java/com/vanced/manager/ui/fragments/LogFragment.kt +++ b/app/src/main/java/com/vanced/manager/ui/fragments/LogFragment.kt @@ -10,7 +10,7 @@ import com.vanced.manager.core.ui.base.BindingFragment import com.vanced.manager.databinding.FragmentLogBinding import com.vanced.manager.utils.AppUtils import com.vanced.manager.utils.AppUtils.logs -import com.vanced.manager.utils.getFilePathInStorage +import com.vanced.manager.utils.managerFilepath import com.vanced.manager.utils.performStorageAction import java.io.File import java.io.FileWriter @@ -42,7 +42,7 @@ class LogFragment : BindingFragment() { val second = calendar.get(Calendar.SECOND) try { performStorageAction(requireActivity()) { - val logPath = File(requireActivity().getFilePathInStorage("logs")).apply { + val logPath = File("logs".managerFilepath).apply { if (!exists()) { mkdirs() } diff --git a/app/src/main/java/com/vanced/manager/ui/fragments/SettingsFragment.kt b/app/src/main/java/com/vanced/manager/ui/fragments/SettingsFragment.kt index 836cdfd5..d43f80a0 100644 --- a/app/src/main/java/com/vanced/manager/ui/fragments/SettingsFragment.kt +++ b/app/src/main/java/com/vanced/manager/ui/fragments/SettingsFragment.kt @@ -19,7 +19,10 @@ import com.vanced.manager.core.ui.base.BindingFragment import com.vanced.manager.core.ui.ext.showDialog import com.vanced.manager.databinding.FragmentSettingsBinding import com.vanced.manager.ui.dialogs.* -import com.vanced.manager.utils.* +import com.vanced.manager.utils.accentColor +import com.vanced.manager.utils.defAccentColor +import com.vanced.manager.utils.getLanguageFormat +import com.vanced.manager.utils.toHex import java.io.File class SettingsFragment : BindingFragment() { @@ -57,7 +60,6 @@ class SettingsFragment : BindingFragment() { bindManagerTheme() bindManagerAccentColor() bindManagerLanguage() - bindManagerStorage() selectApps.setOnClickListener { showDialog(SelectAppsDialog()) } } } @@ -84,21 +86,6 @@ class SettingsFragment : BindingFragment() { } } - private fun FragmentSettingsBinding.bindManagerStorage() { - managerStorage.apply { - setSummary( - getString( - if (prefs.managerStorage == externalPath) { - R.string.storage_external - } else { - R.string.storage_internal - } - ) - ) - setOnClickListener { showDialog(ManagerStorageDialog()) } - } - } - private fun FragmentSettingsBinding.bindServiceDTimer() { servicedTimer.apply { if (variant == "root") this.isVisible = true @@ -109,13 +96,10 @@ class SettingsFragment : BindingFragment() { private fun FragmentSettingsBinding.bindClearFiles() { clearFiles.setOnClickListener { with(requireActivity()) { - performStorageAction(this) { managerPath -> - if (File(managerPath).deleteRecursively()) { - Toast.makeText(this, getString(R.string.cleared_files), Toast.LENGTH_SHORT).show() - } else { - Toast.makeText(this, getString(R.string.clear_files_failed), Toast.LENGTH_SHORT).show() - } + listOf("vanced/nonroot", "vanced/root", "music/nonroot", "music/root", "microg").forEach { dir -> + File(getExternalFilesDir(dir)?.path.toString()).deleteRecursively() } + Toast.makeText(this, getString(R.string.cleared_files), Toast.LENGTH_SHORT).show() } } } 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 7501d2bb..64f587a1 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 @@ -110,7 +110,7 @@ class HomeViewModel(private val activity: FragmentActivity): ViewModel() { activity.getString(R.string.vanced) -> { when (variant) { "nonroot" -> { - if (vancedInstallFilesExist(activity)) { + if (vancedInstallFilesExist()) { InstallationFilesDetectedDialog.newInstance(app).show(activity) } else { VancedPreferencesDialog().show(activity) @@ -124,7 +124,7 @@ class HomeViewModel(private val activity: FragmentActivity): ViewModel() { activity.getString(R.string.music) -> { when (variant) { "nonroot" -> { - if (musicApkExists(activity)) { + if (musicApkExists()) { InstallationFilesDetectedDialog.newInstance(app).show(activity) } else { MusicPreferencesDialog().show(activity) @@ -136,7 +136,7 @@ class HomeViewModel(private val activity: FragmentActivity): ViewModel() { } } activity.getString(R.string.microg) -> { - if (apkExist("microg.apk", activity)) { + if (apkExist("microg.apk")) { InstallationFilesDetectedDialog.newInstance(app).show(activity) } else { AppDownloadDialog.newInstance(app).show(activity) 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 87aafee8..453dcaeb 100644 --- a/app/src/main/java/com/vanced/manager/utils/DownloadHelper.kt +++ b/app/src/main/java/com/vanced/manager/utils/DownloadHelper.kt @@ -49,7 +49,7 @@ object DownloadHelper : CoroutineScope by CoroutineScope(Dispatchers.IO) { override fun onResponse(call: Call, response: Response) { if (response.isSuccessful) { launch { - if (response.body()?.let { writeFile(it, fileFolder, fileName, context) } == true) { + if (response.body()?.let { writeFile(it, fileFolder, fileName) } == true) { onDownloadComplete() } else { onError(response.errorBody().toString()) @@ -78,12 +78,12 @@ object DownloadHelper : CoroutineScope by CoroutineScope(Dispatchers.IO) { }) } - fun writeFile(body: ResponseBody, folderName: String, fileName: String, context: Context): Boolean = + fun writeFile(body: ResponseBody, folderName: String, fileName: String): Boolean = try { val totalBytes = body.contentLength() val fileReader = ByteArray(8096) var downloadedBytes: Long = 0 - val dir = File(context.getFilePathInStorage(folderName)).apply { + val dir = File(managerPath, folderName).apply { if (!exists()) { mkdirs() } @@ -114,7 +114,7 @@ object DownloadHelper : CoroutineScope by CoroutineScope(Dispatchers.IO) { "manager.apk", context, onDownloadComplete = { - val apk = File(context.getFilePathInStorage("manager/manager.apk")) + val apk = File("manager/manager.apk".managerFilepath) val uri = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) FileProvider.getUriForFile(context, "${context.packageName}.provider", apk) diff --git a/app/src/main/java/com/vanced/manager/utils/Extensions.kt b/app/src/main/java/com/vanced/manager/utils/Extensions.kt index 71c418c0..3ec6cab6 100644 --- a/app/src/main/java/com/vanced/manager/utils/Extensions.kt +++ b/app/src/main/java/com/vanced/manager/utils/Extensions.kt @@ -19,6 +19,8 @@ import java.util.* val RadioGroup.checkedButtonTag: String? get() = findViewById(checkedRadioButtonId)?.tag?.toString() +val String.managerFilepath get() = "$managerPath/$this" + fun DialogFragment.show(activity: FragmentActivity) { try { show(activity.supportFragmentManager, "") 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 62594942..7ca56d5b 100644 --- a/app/src/main/java/com/vanced/manager/utils/PackageHelper.kt +++ b/app/src/main/java/com/vanced/manager/utils/PackageHelper.kt @@ -100,16 +100,16 @@ object PackageHelper { } } - fun apkExist(apk: String, context: Context): Boolean { - val apkPath = File(context.getFilePathInStorage("${apk.removeSuffix(".apk")}/$apk")) + fun apkExist(apk: String): Boolean { + val apkPath = File("${apk.removeSuffix(".apk")}/$apk".managerFilepath) if (apkPath.exists()) return true return false } - fun musicApkExists(context: Context): Boolean { - val apkPath = File(context.getFilePathInStorage("music/nonroot/nonroot.apk")) + fun musicApkExists(): Boolean { + val apkPath = File("music/nonroot/nonroot.apk".managerFilepath) if (apkPath.exists()) { return true } @@ -117,8 +117,8 @@ object PackageHelper { return false } - fun vancedInstallFilesExist(context: Context): Boolean { - val apksPath = File(context.getFilePathInStorage("vanced/nonroot")) + fun vancedInstallFilesExist(): Boolean { + val apksPath = File("vanced/nonroot".managerFilepath) val splitFiles = mutableListOf() if (apksPath.exists()) { val files = apksPath.listFiles() @@ -212,7 +212,7 @@ object PackageHelper { private fun installRootApp(context: Context, app: String, appVerCode: Int?, pkg: String, modApkBool: (fileName: String) -> Boolean) = CoroutineScope(Dispatchers.IO).launch { Shell.getShell { - val apkFilesPath = context.getFilePathInStorage("$app/root") + val apkFilesPath = "$app/root".managerFilepath val files = File(apkFilesPath).listFiles()?.toList() if (files != null) { val modApk: File? = files.lastOrNull { modApkBool(it.name) } @@ -268,7 +268,7 @@ object PackageHelper { appName: String ) { val packageInstaller = context.packageManager.packageInstaller - val folder = File(context.getFilePathInStorage("$appName/nonroot")) + val folder = File("$appName/nonroot".managerFilepath) var session: PackageInstaller.Session? = null val sessionId: Int val sessionParams = PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL) diff --git a/app/src/main/java/com/vanced/manager/utils/Preferences.kt b/app/src/main/java/com/vanced/manager/utils/Preferences.kt index d40c0364..b4b527f9 100644 --- a/app/src/main/java/com/vanced/manager/utils/Preferences.kt +++ b/app/src/main/java/com/vanced/manager/utils/Preferences.kt @@ -19,10 +19,6 @@ var SharedPreferences.managerVariant get() = getString("vanced_variant", "nonroot") set(value) = edit { putString("vanced_variant", value) } -var SharedPreferences.managerStorage - get() = getString("manager_storage", internalPath) - set(value) = edit { putString("manager_storage", value) } - var SharedPreferences.managerLang get() = getString("manager_lang", "System Default") set(value) = edit { putString("manager_lang", value) } diff --git a/app/src/main/java/com/vanced/manager/utils/StorageUtils.kt b/app/src/main/java/com/vanced/manager/utils/StorageUtils.kt index 78688ac6..8cd87c29 100644 --- a/app/src/main/java/com/vanced/manager/utils/StorageUtils.kt +++ b/app/src/main/java/com/vanced/manager/utils/StorageUtils.kt @@ -1,63 +1,40 @@ package com.vanced.manager.utils import android.Manifest -import android.content.Context import android.content.Intent import android.content.pm.PackageManager import android.os.Build import android.os.Environment import android.provider.Settings -import androidx.activity.result.ActivityResultLauncher import androidx.fragment.app.FragmentActivity +import com.vanced.manager.ui.MainActivity import com.vanced.manager.ui.dialogs.DialogContainer.storageDialog -const val storage = "/storage/emulated/0" - -const val internalPath = "$storage/Android/data/com.vanced.manager/files" -const val externalPath = "$storage/Vanced Manager" - -val Context.managerPath: String - get() { - var path = defPrefs.managerStorage ?: internalPath - - if (path == externalPath && !canAccessStorage(this)) { - path = internalPath - } - - return path - } - -fun Context.getFilePathInStorage(child: String): String = "$managerPath/$child" - - -inline fun performStorageAction(activity: FragmentActivity, action: (managerPath: String) -> Unit) { - val managerPath = activity.managerPath - - if (managerPath == internalPath) { - return action(managerPath) - } +@Suppress("DEPRECATION") +val managerPath get() = "${Environment.getExternalStorageDirectory().path}/Vanced Manager" +inline fun performStorageAction(activity: FragmentActivity, action: () -> Unit) { if (canAccessStorage(activity)) { - action(managerPath) + action() } else { storageDialog(activity) } } -fun canAccessStorage(context: Context): Boolean = when { +fun canAccessStorage(activity: FragmentActivity): Boolean = when { Build.VERSION.SDK_INT >= Build.VERSION_CODES.R -> Environment.isExternalStorageManager() Build.VERSION.SDK_INT >= Build.VERSION_CODES.M -> { listOf( Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE ).all { - context.checkSelfPermission(it) == PackageManager.PERMISSION_GRANTED + activity.checkSelfPermission(it) == PackageManager.PERMISSION_GRANTED } } else -> true } -fun requestStoragePerms(activity: FragmentActivity, permissionLauncher: ActivityResultLauncher>?) { +fun requestStoragePerms(activity: FragmentActivity) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { activity.startActivity( Intent( @@ -65,11 +42,12 @@ fun requestStoragePerms(activity: FragmentActivity, permissionLauncher: Activity ) ) } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - permissionLauncher?.launch( + activity.requestPermissions( arrayOf( - Manifest.permission.WRITE_EXTERNAL_STORAGE, - Manifest.permission.READ_EXTERNAL_STORAGE - ) + Manifest.permission.READ_EXTERNAL_STORAGE, + Manifest.permission.WRITE_EXTERNAL_STORAGE + ), + MainActivity.REQUEST_CODE ) } } \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_manager_storage.xml b/app/src/main/res/layout/dialog_manager_storage.xml deleted file mode 100644 index 20a6f55b..00000000 --- a/app/src/main/res/layout/dialog_manager_storage.xml +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/fragment_settings.xml b/app/src/main/res/layout/fragment_settings.xml index 58c4f101..ef49caa9 100644 --- a/app/src/main/res/layout/fragment_settings.xml +++ b/app/src/main/res/layout/fragment_settings.xml @@ -49,12 +49,6 @@ android:layout_height="wrap_content" app:preference_title="@string/variant" /> - - use_custom_tabs - /storage/emulated/0/Android/data/com.vanced.manager/files - /storage/emulated/0/Vanced Manager - diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a113fb79..22ba7670 100755 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -50,7 +50,6 @@ Appearance Behavior Clear downloaded files - Failed to clear files Successfully cleared files This lets us collect information about app performance and crash logs Firebase Analytics @@ -96,11 +95,8 @@ Please do NOT exit the app during this process! Redownload Make sure that you downloaded the app from vancedapp.com, the Vanced Discord server, or the Vanced GitHub - Storage Storage access required In order for Vanced Manager to work, you must grant the storage permission - Internal Storage - App-Specific Storage Version Welcome