diff --git a/app/src/main/java/com/aurora/store/data/providers/SpoofDeviceProvider.kt b/app/src/main/java/com/aurora/store/data/providers/SpoofDeviceProvider.kt index 1b47e5a6d..ea2e30c3e 100644 --- a/app/src/main/java/com/aurora/store/data/providers/SpoofDeviceProvider.kt +++ b/app/src/main/java/com/aurora/store/data/providers/SpoofDeviceProvider.kt @@ -74,7 +74,7 @@ class SpoofDeviceProvider private constructor(var context: Context) { private val spoofDevicesFromUser: List get() { val deviceNames: MutableList = ArrayList() - val defaultDir = File(PathUtil.getExternalPath()) + val defaultDir = File(PathUtil.getSpoofDirectory(context)) val files = defaultDir.listFiles() if (defaultDir.exists() && files != null) { for (file in files) { diff --git a/app/src/main/java/com/aurora/store/util/PathUtil.kt b/app/src/main/java/com/aurora/store/util/PathUtil.kt index a0db2e39b..0d511590d 100644 --- a/app/src/main/java/com/aurora/store/util/PathUtil.kt +++ b/app/src/main/java/com/aurora/store/util/PathUtil.kt @@ -24,6 +24,7 @@ import android.os.Environment import com.aurora.extensions.isLAndAbove import com.aurora.gplayapi.data.models.App import com.aurora.gplayapi.data.models.File +import java.util.UUID fun Context.getInternalBaseDirectory(): String { return (getExternalFilesDir(null) ?: filesDir).path @@ -86,6 +87,17 @@ object PathUtil { fun needsStorageManagerPerm(fileList: List): Boolean { return fileList.any { it.type == File.FileType.OBB || it.type == File.FileType.PATCH } } + + fun getSpoofDirectory(context: Context): String { + return "${context.getInternalBaseDirectory()}/SpoofConfigs" + } + + fun getNewEmptySpoofConfig(context: Context): java.io.File { + val file = java.io.File("${getSpoofDirectory(context)}/${UUID.randomUUID()}.properties") + file.parentFile?.mkdirs() + file.createNewFile() + return file + } } fun Context.isExternalStorageEnable(): Boolean { diff --git a/app/src/main/java/com/aurora/store/view/ui/spoof/SpoofActivity.kt b/app/src/main/java/com/aurora/store/view/ui/spoof/SpoofActivity.kt index b8599ddea..3bae340f7 100644 --- a/app/src/main/java/com/aurora/store/view/ui/spoof/SpoofActivity.kt +++ b/app/src/main/java/com/aurora/store/view/ui/spoof/SpoofActivity.kt @@ -33,6 +33,7 @@ import com.aurora.extensions.toast import com.aurora.store.R import com.aurora.store.data.providers.NativeDeviceInfoProvider import com.aurora.store.databinding.ActivityGenericPagerBinding +import com.aurora.store.util.PathUtil import com.aurora.store.view.ui.commons.BaseActivity import com.google.android.material.tabs.TabLayout import com.google.android.material.tabs.TabLayoutMediator @@ -44,8 +45,17 @@ class SpoofActivity : BaseActivity() { private lateinit var B: ActivityGenericPagerBinding - private val startForDocument = - registerForActivityResult(ActivityResultContracts.CreateDocument("text/x-java-properties")) { + // Android is weird, even if export device config with proper mime type, it will refuse to open + // it again with same mime type + private val importMimeType = "application/octet-stream" + private val exportMimeType = "text/x-java-properties" + + private val startForDocumentImport = + registerForActivityResult(ActivityResultContracts.OpenDocument()) { + if (it != null) importDeviceConfig(it) else toast(R.string.toast_import_failed) + } + private val startForDocumentExport = + registerForActivityResult(ActivityResultContracts.CreateDocument(exportMimeType)) { if (it != null) exportDeviceConfig(it) else toast(R.string.toast_export_failed) } @@ -80,8 +90,12 @@ class SpoofActivity : BaseActivity() { onBackPressedDispatcher.onBackPressed() return true } + R.id.action_import -> { + startForDocumentImport.launch(arrayOf(importMimeType)) + } R.id.action_export -> { - startForDocument.launch("aurora_store_${Build.BRAND}_${Build.DEVICE}.properties") + startForDocumentExport + .launch("aurora_store_${Build.BRAND}_${Build.DEVICE}.properties") } } return super.onOptionsItemSelected(item) @@ -111,6 +125,22 @@ class SpoofActivity : BaseActivity() { }.attach() } + private fun importDeviceConfig(uri: Uri) { + task { + contentResolver.openInputStream(uri)?.use { input -> + PathUtil.getNewEmptySpoofConfig(this).outputStream().use { + input.copyTo(it) + } + } + } successUi { + toast(R.string.toast_import_success) + recreate() + } failUi { + it.printStackTrace() + toast(R.string.toast_import_failed) + } + } + private fun exportDeviceConfig(uri: Uri) { task { NativeDeviceInfoProvider(this) diff --git a/app/src/main/res/menu/menu_spoof.xml b/app/src/main/res/menu/menu_spoof.xml index 9a994dad1..5bad5f14c 100644 --- a/app/src/main/res/menu/menu_spoof.xml +++ b/app/src/main/res/menu/menu_spoof.xml @@ -18,6 +18,9 @@ --> + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 83699facf..4782e8067 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -59,6 +59,7 @@ "Deny" "Disable" "Export" + "Import" "Filters" "All" "Apply" @@ -322,6 +323,8 @@ Could not generate AAS Token Device config exported Could not export device config + Device config imported + Could not import device config App background download service Background app download Enables background app download