SpoofActivity: Allow users to import spoof configs with open document contract
Signed-off-by: Aayush Gupta <aayushgupta219@gmail.com>
This commit is contained in:
@@ -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) {
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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" />
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user