Refactor: Move keystore to external dir
This commit is contained in:
parent
eba0fbf29c
commit
1df152f41b
8 changed files with 107 additions and 4 deletions
|
@ -101,6 +101,7 @@ dependencies {
|
||||||
|
|
||||||
implementation("com.google.accompanist:accompanist-systemuicontroller:$accompanistVersion")
|
implementation("com.google.accompanist:accompanist-systemuicontroller:$accompanistVersion")
|
||||||
implementation("com.google.accompanist:accompanist-pager:$accompanistVersion")
|
implementation("com.google.accompanist:accompanist-pager:$accompanistVersion")
|
||||||
|
implementation("com.google.accompanist:accompanist-permissions:$accompanistVersion")
|
||||||
|
|
||||||
val voyagerVersion = "1.0.0-rc03"
|
val voyagerVersion = "1.0.0-rc03"
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
package dev.beefers.vendetta.manager.installer.util
|
package dev.beefers.vendetta.manager.installer.util
|
||||||
|
|
||||||
import dev.beefers.vendetta.manager.network.utils.Signer
|
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
import org.lsposed.lspatch.share.PatchConfig
|
import org.lsposed.lspatch.share.PatchConfig
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
package dev.beefers.vendetta.manager.network.utils
|
package dev.beefers.vendetta.manager.installer.util
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import com.android.apksig.ApkSigner
|
import com.android.apksig.ApkSigner
|
||||||
|
import dev.beefers.vendetta.manager.utils.Constants
|
||||||
import org.bouncycastle.asn1.x500.X500Name
|
import org.bouncycastle.asn1.x500.X500Name
|
||||||
import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo
|
import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo
|
||||||
import org.bouncycastle.cert.X509v3CertificateBuilder
|
import org.bouncycastle.cert.X509v3CertificateBuilder
|
||||||
|
@ -28,8 +29,14 @@ object Signer : KoinComponent {
|
||||||
get() {
|
get() {
|
||||||
lateinit var ks: File
|
lateinit var ks: File
|
||||||
cacheDir.resolve("ks.keystore").also {
|
cacheDir.resolve("ks.keystore").also {
|
||||||
|
if (it.exists()) {
|
||||||
|
it.copyTo(Constants.VENDETTA_DIR.resolve("ks.keystore"), true)
|
||||||
|
it.delete()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Constants.VENDETTA_DIR.resolve("ks.keystore").also {
|
||||||
if (!it.exists()) {
|
if (!it.exists()) {
|
||||||
cacheDir.mkdir()
|
Constants.VENDETTA_DIR.mkdir()
|
||||||
newKeystore(it)
|
newKeystore(it)
|
||||||
}
|
}
|
||||||
ks = it
|
ks = it
|
|
@ -25,6 +25,7 @@ import com.google.accompanist.pager.PagerState
|
||||||
import com.google.accompanist.pager.rememberPagerState
|
import com.google.accompanist.pager.rememberPagerState
|
||||||
import dev.beefers.vendetta.manager.ui.screen.home.HomeScreen
|
import dev.beefers.vendetta.manager.ui.screen.home.HomeScreen
|
||||||
import dev.beefers.vendetta.manager.ui.viewmodel.main.MainViewModel
|
import dev.beefers.vendetta.manager.ui.viewmodel.main.MainViewModel
|
||||||
|
import dev.beefers.vendetta.manager.ui.widgets.dialog.StoragePermissionsDialog
|
||||||
import dev.beefers.vendetta.manager.ui.widgets.updater.UpdateDialog
|
import dev.beefers.vendetta.manager.ui.widgets.updater.UpdateDialog
|
||||||
import dev.beefers.vendetta.manager.utils.MainTab
|
import dev.beefers.vendetta.manager.utils.MainTab
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
|
@ -38,6 +39,8 @@ class MainScreen : Screen {
|
||||||
val viewModel: MainViewModel = getScreenModel()
|
val viewModel: MainViewModel = getScreenModel()
|
||||||
val pagerState = rememberPagerState()
|
val pagerState = rememberPagerState()
|
||||||
|
|
||||||
|
StoragePermissionsDialog()
|
||||||
|
|
||||||
CompositionLocalProvider(
|
CompositionLocalProvider(
|
||||||
LocalPagerState provides pagerState
|
LocalPagerState provides pagerState
|
||||||
) {
|
) {
|
||||||
|
|
|
@ -23,7 +23,7 @@ import dev.beefers.vendetta.manager.domain.manager.PreferenceManager
|
||||||
import dev.beefers.vendetta.manager.installer.util.ManifestPatcher
|
import dev.beefers.vendetta.manager.installer.util.ManifestPatcher
|
||||||
import dev.beefers.vendetta.manager.installer.util.Patcher
|
import dev.beefers.vendetta.manager.installer.util.Patcher
|
||||||
import dev.beefers.vendetta.manager.installer.util.installApks
|
import dev.beefers.vendetta.manager.installer.util.installApks
|
||||||
import dev.beefers.vendetta.manager.network.utils.Signer
|
import dev.beefers.vendetta.manager.installer.util.Signer
|
||||||
import dev.beefers.vendetta.manager.utils.DiscordVersion
|
import dev.beefers.vendetta.manager.utils.DiscordVersion
|
||||||
import dev.beefers.vendetta.manager.utils.copyText
|
import dev.beefers.vendetta.manager.utils.copyText
|
||||||
import dev.beefers.vendetta.manager.utils.showToast
|
import dev.beefers.vendetta.manager.utils.showToast
|
||||||
|
|
|
@ -0,0 +1,86 @@
|
||||||
|
package dev.beefers.vendetta.manager.ui.widgets.dialog
|
||||||
|
|
||||||
|
import android.Manifest
|
||||||
|
import android.annotation.SuppressLint
|
||||||
|
import android.content.Intent
|
||||||
|
import android.os.Build
|
||||||
|
import android.os.Environment
|
||||||
|
import android.provider.Settings
|
||||||
|
import androidx.activity.compose.rememberLauncherForActivityResult
|
||||||
|
import androidx.activity.result.contract.ActivityResultContracts
|
||||||
|
import androidx.compose.material3.*
|
||||||
|
import androidx.compose.runtime.*
|
||||||
|
import androidx.compose.ui.res.stringResource
|
||||||
|
import androidx.compose.ui.window.DialogProperties
|
||||||
|
import androidx.core.net.toUri
|
||||||
|
import com.google.accompanist.permissions.*
|
||||||
|
import dev.beefers.vendetta.manager.BuildConfig
|
||||||
|
import dev.beefers.vendetta.manager.R
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun StoragePermissionsDialog() {
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
|
||||||
|
ManageStorageDialog()
|
||||||
|
} else {
|
||||||
|
ExternalStorageDialog()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
@SuppressLint("NewApi")
|
||||||
|
private fun ManageStorageDialog() {
|
||||||
|
var manageStorageGranted by remember { mutableStateOf(Environment.isExternalStorageManager()) }
|
||||||
|
|
||||||
|
if (!manageStorageGranted) {
|
||||||
|
AlertDialog(
|
||||||
|
onDismissRequest = {},
|
||||||
|
confirmButton = {
|
||||||
|
val launcher =
|
||||||
|
rememberLauncherForActivityResult(ActivityResultContracts.StartActivityForResult()) {
|
||||||
|
if (Environment.isExternalStorageManager()) {
|
||||||
|
manageStorageGranted = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Button(
|
||||||
|
onClick = {
|
||||||
|
Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION)
|
||||||
|
.setData("package:${BuildConfig.APPLICATION_ID}".toUri())
|
||||||
|
.let { launcher.launch(it) }
|
||||||
|
}
|
||||||
|
) {
|
||||||
|
Text(stringResource(R.string.action_open_settings))
|
||||||
|
}
|
||||||
|
},
|
||||||
|
title = { Text(stringResource(R.string.title_permission_grant)) },
|
||||||
|
text = { Text(stringResource(R.string.msg_permission_grant)) },
|
||||||
|
properties = DialogProperties(
|
||||||
|
dismissOnBackPress = false,
|
||||||
|
dismissOnClickOutside = false
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@OptIn(ExperimentalPermissionsApi::class)
|
||||||
|
@Composable
|
||||||
|
private fun ExternalStorageDialog() {
|
||||||
|
val writeStorageState = rememberPermissionState(Manifest.permission.WRITE_EXTERNAL_STORAGE)
|
||||||
|
|
||||||
|
if (!writeStorageState.status.isGranted) {
|
||||||
|
AlertDialog(
|
||||||
|
onDismissRequest = {},
|
||||||
|
confirmButton = {
|
||||||
|
Button(onClick = writeStorageState::launchPermissionRequest) {
|
||||||
|
Text(stringResource(R.string.action_confirm))
|
||||||
|
}
|
||||||
|
},
|
||||||
|
title = { Text(stringResource(R.string.title_permission_grant)) },
|
||||||
|
text = { Text(stringResource(R.string.msg_permission_grant)) },
|
||||||
|
properties = DialogProperties(
|
||||||
|
dismissOnBackPress = false,
|
||||||
|
dismissOnClickOutside = false
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,5 +1,7 @@
|
||||||
package dev.beefers.vendetta.manager.utils
|
package dev.beefers.vendetta.manager.utils
|
||||||
|
|
||||||
|
import android.os.Environment
|
||||||
|
|
||||||
object Constants {
|
object Constants {
|
||||||
|
|
||||||
val TEAM_MEMBERS = listOf(
|
val TEAM_MEMBERS = listOf(
|
||||||
|
@ -7,6 +9,8 @@ object Constants {
|
||||||
TeamMember("Kasi", "Developer - Xposed Module", "redstonekasi")
|
TeamMember("Kasi", "Developer - Xposed Module", "redstonekasi")
|
||||||
)
|
)
|
||||||
|
|
||||||
|
val VENDETTA_DIR = Environment.getExternalStorageDirectory().resolve("Vendetta")
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
data class TeamMember(
|
data class TeamMember(
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
<string name="msg_five_left">5 more taps</string>
|
<string name="msg_five_left">5 more taps</string>
|
||||||
<string name="msg_two_left">2 more taps</string>
|
<string name="msg_two_left">2 more taps</string>
|
||||||
<string name="msg_unlocked">You are now a developer</string>
|
<string name="msg_unlocked">You are now a developer</string>
|
||||||
|
<string name="msg_permission_grant">In order for Vendetta Manager to function, file permissions are required. Since shared data is stored in ~/Vendetta, permissions are required in order to access it.</string>
|
||||||
|
|
||||||
<string name="group_download">Download APKs</string>
|
<string name="group_download">Download APKs</string>
|
||||||
<string name="group_patch">Patching</string>
|
<string name="group_patch">Patching</string>
|
||||||
|
@ -52,6 +53,7 @@
|
||||||
<string name="action_retry">Retry</string>
|
<string name="action_retry">Retry</string>
|
||||||
<string name="action_reload">Reload</string>
|
<string name="action_reload">Reload</string>
|
||||||
<string name="action_open_about">Open about</string>
|
<string name="action_open_about">Open about</string>
|
||||||
|
<string name="action_open_settings">Open settings</string>
|
||||||
|
|
||||||
<string name="installer_cached">Cached</string>
|
<string name="installer_cached">Cached</string>
|
||||||
|
|
||||||
|
@ -60,6 +62,7 @@
|
||||||
<string name="title_settings">Settings</string>
|
<string name="title_settings">Settings</string>
|
||||||
<string name="title_update">Update available!</string>
|
<string name="title_update">Update available!</string>
|
||||||
<string name="title_about">About</string>
|
<string name="title_about">About</string>
|
||||||
|
<string name="title_permission_grant">Grant Permissions</string>
|
||||||
|
|
||||||
<string name="theme_system">System</string>
|
<string name="theme_system">System</string>
|
||||||
<string name="theme_light">Light</string>
|
<string name="theme_light">Light</string>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue