SpoofActivity: Allow users to import spoof configs with open document contract

Signed-off-by: Aayush Gupta <aayushgupta219@gmail.com>
This commit is contained in:
Aayush Gupta
2023-06-02 00:07:22 +08:00
parent a0f13e6040
commit 2f80ef1109
5 changed files with 52 additions and 4 deletions

View File

@@ -74,7 +74,7 @@ class SpoofDeviceProvider private constructor(var context: Context) {
private val spoofDevicesFromUser: List<Properties> private val spoofDevicesFromUser: List<Properties>
get() { get() {
val deviceNames: MutableList<Properties> = ArrayList() val deviceNames: MutableList<Properties> = ArrayList()
val defaultDir = File(PathUtil.getExternalPath()) val defaultDir = File(PathUtil.getSpoofDirectory(context))
val files = defaultDir.listFiles() val files = defaultDir.listFiles()
if (defaultDir.exists() && files != null) { if (defaultDir.exists() && files != null) {
for (file in files) { for (file in files) {

View File

@@ -24,6 +24,7 @@ import android.os.Environment
import com.aurora.extensions.isLAndAbove import com.aurora.extensions.isLAndAbove
import com.aurora.gplayapi.data.models.App import com.aurora.gplayapi.data.models.App
import com.aurora.gplayapi.data.models.File import com.aurora.gplayapi.data.models.File
import java.util.UUID
fun Context.getInternalBaseDirectory(): String { fun Context.getInternalBaseDirectory(): String {
return (getExternalFilesDir(null) ?: filesDir).path return (getExternalFilesDir(null) ?: filesDir).path
@@ -86,6 +87,17 @@ object PathUtil {
fun needsStorageManagerPerm(fileList: List<File>): Boolean { fun needsStorageManagerPerm(fileList: List<File>): Boolean {
return fileList.any { it.type == File.FileType.OBB || it.type == File.FileType.PATCH } 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 { fun Context.isExternalStorageEnable(): Boolean {

View File

@@ -33,6 +33,7 @@ import com.aurora.extensions.toast
import com.aurora.store.R import com.aurora.store.R
import com.aurora.store.data.providers.NativeDeviceInfoProvider import com.aurora.store.data.providers.NativeDeviceInfoProvider
import com.aurora.store.databinding.ActivityGenericPagerBinding import com.aurora.store.databinding.ActivityGenericPagerBinding
import com.aurora.store.util.PathUtil
import com.aurora.store.view.ui.commons.BaseActivity import com.aurora.store.view.ui.commons.BaseActivity
import com.google.android.material.tabs.TabLayout import com.google.android.material.tabs.TabLayout
import com.google.android.material.tabs.TabLayoutMediator import com.google.android.material.tabs.TabLayoutMediator
@@ -44,8 +45,17 @@ class SpoofActivity : BaseActivity() {
private lateinit var B: ActivityGenericPagerBinding private lateinit var B: ActivityGenericPagerBinding
private val startForDocument = // Android is weird, even if export device config with proper mime type, it will refuse to open
registerForActivityResult(ActivityResultContracts.CreateDocument("text/x-java-properties")) { // 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) if (it != null) exportDeviceConfig(it) else toast(R.string.toast_export_failed)
} }
@@ -80,8 +90,12 @@ class SpoofActivity : BaseActivity() {
onBackPressedDispatcher.onBackPressed() onBackPressedDispatcher.onBackPressed()
return true return true
} }
R.id.action_import -> {
startForDocumentImport.launch(arrayOf(importMimeType))
}
R.id.action_export -> { 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) return super.onOptionsItemSelected(item)
@@ -111,6 +125,22 @@ class SpoofActivity : BaseActivity() {
}.attach() }.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) { private fun exportDeviceConfig(uri: Uri) {
task { task {
NativeDeviceInfoProvider(this) NativeDeviceInfoProvider(this)

View File

@@ -18,6 +18,9 @@
--> -->
<menu xmlns:android="http://schemas.android.com/apk/res/android"> <menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/action_import"
android:title="@string/action_import" />
<item <item
android:id="@+id/action_export" android:id="@+id/action_export"
android:title="@string/action_export" /> android:title="@string/action_export" />

View File

@@ -59,6 +59,7 @@
<string name="action_deny">"Deny"</string> <string name="action_deny">"Deny"</string>
<string name="action_disable">"Disable"</string> <string name="action_disable">"Disable"</string>
<string name="action_export">"Export"</string> <string name="action_export">"Export"</string>
<string name="action_import">"Import"</string>
<string name="action_filter">"Filters"</string> <string name="action_filter">"Filters"</string>
<string name="action_filter_all">"All"</string> <string name="action_filter_all">"All"</string>
<string name="action_filter_apply">"Apply"</string> <string name="action_filter_apply">"Apply"</string>
@@ -322,6 +323,8 @@
<string name="toast_aas_token_failed">Could not generate AAS Token</string> <string name="toast_aas_token_failed">Could not generate AAS Token</string>
<string name="toast_export_success">Device config exported</string> <string name="toast_export_success">Device config exported</string>
<string name="toast_export_failed">Could not export device config</string> <string name="toast_export_failed">Could not export device config</string>
<string name="toast_import_success">Device config imported</string>
<string name="toast_import_failed">Could not import device config</string>
<string name="notification_channel_updater_service">App background download service</string> <string name="notification_channel_updater_service">App background download service</string>
<string name="app_updater_service_notif_title">Background app download</string> <string name="app_updater_service_notif_title">Background app download</string>
<string name="app_updater_service_notif_text">Enables background app download</string> <string name="app_updater_service_notif_text">Enables background app download</string>