secant-android-wallet/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/backup/AndroidBackup.kt

124 lines
3.9 KiB
Kotlin

package co.electriccoin.zcash.ui.screen.backup
import android.content.ClipData
import android.content.ClipboardManager
import android.content.Context
import androidx.activity.ComponentActivity
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.saveable.rememberSaveable
import cash.z.ecc.android.sdk.model.PersistableWallet
import co.electriccoin.zcash.ui.MainActivity
import co.electriccoin.zcash.ui.R
import co.electriccoin.zcash.ui.configuration.ConfigurationEntries
import co.electriccoin.zcash.ui.configuration.RemoteConfig
import co.electriccoin.zcash.ui.screen.backup.ext.Saver
import co.electriccoin.zcash.ui.screen.backup.state.BackupState
import co.electriccoin.zcash.ui.screen.backup.state.TestChoices
import co.electriccoin.zcash.ui.screen.backup.view.LongNewWalletBackup
import co.electriccoin.zcash.ui.screen.backup.view.ShortNewWalletBackup
@Composable
internal fun MainActivity.WrapNewWallet(
persistableWallet: PersistableWallet,
onBackupComplete: () -> Unit
) {
if (ConfigurationEntries.IS_SHORT_NEW_WALLET_BACKUP_UX.getValue(RemoteConfig.current)) {
WrapShortNewWallet(
persistableWallet,
onBackupComplete = onBackupComplete
)
} else {
WrapLongNewWallet(
persistableWallet,
onBackupComplete = onBackupComplete
)
}
}
@Composable
internal fun MainActivity.WrapLongNewWallet(
persistableWallet: PersistableWallet,
onBackupComplete: () -> Unit
) {
WrapLongNewWallet(this, persistableWallet, onBackupComplete)
}
// This layer of indirection allows for activity re-creation tests
@Composable
internal fun WrapLongNewWallet(
activity: ComponentActivity,
persistableWallet: PersistableWallet,
onBackupComplete: () -> Unit
) {
WrapLongNewWallet(
persistableWallet,
onCopyToClipboard = { copyToClipboard(activity.applicationContext, persistableWallet) },
onBackupComplete = onBackupComplete
)
}
// This extra layer of indirection allows unit tests to validate the screen state retention.
@Composable
internal fun WrapLongNewWallet(
persistableWallet: PersistableWallet,
onCopyToClipboard: () -> Unit,
onBackupComplete: () -> Unit
) {
val testChoices by rememberSaveable(stateSaver = TestChoices.Saver) { mutableStateOf(TestChoices()) }
val backupState by rememberSaveable(stateSaver = BackupState.Saver) { mutableStateOf(BackupState()) }
LongNewWalletBackup(
persistableWallet,
backupState,
testChoices,
onCopyToClipboard = onCopyToClipboard,
onComplete = onBackupComplete,
null
)
}
@Composable
private fun MainActivity.WrapShortNewWallet(
persistableWallet: PersistableWallet,
onBackupComplete: () -> Unit
) {
WrapShortNewWallet(this, persistableWallet, onBackupComplete)
}
@Composable
private fun WrapShortNewWallet(
activity: ComponentActivity,
persistableWallet: PersistableWallet,
onBackupComplete: () -> Unit
) {
WrapShortNewWallet(
persistableWallet,
onCopyToClipboard = { copyToClipboard(activity.applicationContext, persistableWallet) },
onNewWalletComplete = onBackupComplete
)
}
@Composable
private fun WrapShortNewWallet(
persistableWallet: PersistableWallet,
onCopyToClipboard: () -> Unit,
onNewWalletComplete: () -> Unit
) {
ShortNewWalletBackup(
persistableWallet,
onCopyToClipboard = onCopyToClipboard,
onComplete = onNewWalletComplete,
)
}
internal fun copyToClipboard(context: Context, persistableWallet: PersistableWallet) {
val clipboardManager = context.getSystemService(ClipboardManager::class.java)
val data = ClipData.newPlainText(
context.getString(R.string.new_wallet_clipboard_tag),
persistableWallet.seedPhrase.joinToString()
)
clipboardManager.setPrimaryClip(data)
}