Import of database files

This commit is contained in:
Hanh 2022-08-17 10:58:15 +08:00
parent cf04827692
commit b77bf4bfc2
14 changed files with 295 additions and 186 deletions

View File

@ -1,74 +1,74 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>YWallet</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>$(FLUTTER_BUILD_NAME)</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLSchemes</key>
<array>
<string>zcash</string>
</array>
</dict>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLSchemes</key>
<array>
<string>ycash</string>
</array>
</dict>
</array>
<key>CFBundleVersion</key>
<string>$(FLUTTER_BUILD_NUMBER)</string>
<key>ITSAppUsesNonExemptEncryption</key>
<false/>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>NSCameraUsageDescription</key>
<string>Camera permission is required for barcode scanning.</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>Not needed - report if you see this message</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>Need by file picker to broadcast transactions</string>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIMainStoryboardFile</key>
<string>Main</string>
<key>UIStatusBarHidden</key>
<false/>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
</dict>
</plist>
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>YWallet</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>$(FLUTTER_BUILD_NAME)</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLSchemes</key>
<array>
<string>zcash</string>
</array>
</dict>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLSchemes</key>
<array>
<string>ycash</string>
</array>
</dict>
</array>
<key>CFBundleVersion</key>
<string>$(FLUTTER_BUILD_NUMBER)</string>
<key>ITSAppUsesNonExemptEncryption</key>
<false/>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>NSCameraUsageDescription</key>
<string>Camera permission is required for barcode scanning.</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>Not needed - report if you see this message</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>Need by file picker to broadcast transactions</string>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIMainStoryboardFile</key>
<string>Main</string>
<key>UIStatusBarHidden</key>
<false/>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
</dict>
</plist>

View File

@ -1,3 +1,4 @@
import 'package:file_picker/file_picker.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart' show rootBundle;
import 'package:flutter_markdown/flutter_markdown.dart';
@ -6,6 +7,7 @@ import 'package:package_info_plus/package_info_plus.dart';
import 'package:mustache_template/mustache.dart';
import 'package:warp_api/warp_api.dart';
import 'coin/coins.dart';
import 'main.dart';
import 'generated/l10n.dart';
@ -26,7 +28,9 @@ Future<void> showAbout(BuildContext context) async {
context: context,
barrierDismissible: false,
builder: (context) => AlertDialog(
title: Text('${S.of(context).about} $APP_NAME'),
title: GestureDetector(
onLongPress: () { onImportDb(context); },
child: Text('${S.of(context).about} $APP_NAME')),
contentPadding: EdgeInsets.all(16),
content: Container(width: mq.size.width, height: mq.size.height,
child: SingleChildScrollView(child: Column(
@ -48,6 +52,33 @@ Future<void> showAbout(BuildContext context) async {
]));
}
Future<void> onImportDb(BuildContext context) async {
final confirmation = await showConfirmDialog(context, 'DB', S.of(context).doYouWantToRestore);
if (!confirmation) return;
final s = S.of(context);
final result = await FilePicker.platform.pickFiles();
if (result != null) {
final file = result.files.single;
bool imported = false;
for (var coin in [ycash, zcash]) {
if (await coin.tryImport(file)) {
imported = true;
break;
}
}
if (imported) {
await showMessageBox(context, 'Db Import Successful',
'Database updated. Please restart the app.', s.ok);
final prefs = await SharedPreferences.getInstance();
await prefs.setBool('recover', true);
}
else
await showMessageBox(
context, 'Db Import Failed', 'Please check the database file', s.ok);
}
}
Future<void> showAboutOnce(BuildContext context) async {
final prefs = await SharedPreferences.getInstance();
final about = prefs.getBool('about');

View File

@ -101,7 +101,7 @@ class SyncStatusState extends State<SyncStatusWidget> {
return AnimatedTextKit(
key: ValueKey(syncedHeight),
repeatForever: true,
animatedTexts: [ for (int i = 0; i < 6; i++) createSyncText(i, true) ],
animatedTexts: [ for (int i = 0; i < 7; i++) createSyncText(i, true) ],
onTap: () => setState(() { display += 1; }),
);
return createSyncText(d-1, false);

View File

@ -1,9 +1,11 @@
import 'dart:io';
import 'package:ZYWallet/main.dart';
import 'package:file_picker/file_picker.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:path/path.dart';
import 'package:path/path.dart' as p;
import 'package:path_provider/path_provider.dart';
import 'package:share_plus/share_plus.dart';
import 'package:sqflite/sqflite.dart';
@ -23,26 +25,57 @@ abstract class CoinBase {
String get explorerUrl;
AssetImage get image;
String get dbName;
late String dbPath;
late Database db;
List<LWInstance> get lwd;
bool get supportsUA;
bool get supportsMultisig;
List<double> get weights;
Future<void> open(String dbPath) async {
final path = join(dbPath, dbName);
void init(String dbDirPath) {
dbPath = getPath(dbDirPath);
}
Future<void> open() async {
// schema handled in backend
db = await openDatabase(path/*, onCreate: createSchema, version: 1*/);
db = await openDatabase(dbPath/*, onCreate: createSchema, version: 1*/);
}
Future<void> delete(String dbPath) async {
final path = join(dbPath, dbName);
await deleteDatabase(path);
await File(p.join(dbPath, dbName)).delete();
await File(p.join(dbPath, "${dbName}-shm")).delete();
await File(p.join(dbPath, "${dbName}-wal")).delete();
}
Future<bool> tryImport(PlatformFile file) async {
if (file.name == dbName) {
Directory tempDir = await getTemporaryDirectory();
final dest = p.join(tempDir.path, dbName);
await File(file.path!).copy(dest); // save to temporary directory
return true;
}
return false;
}
Future<void> importFromTemp() async {
Directory tempDir = await getTemporaryDirectory();
final src = File(p.join(tempDir.path, dbName));
print("Import from ${src.path}");
if (await src.exists()) {
print("copied to ${dbPath}");
await src.copy(dbPath);
await src.delete();
}
}
String getPath(String dbPath) {
final path = p.join(dbPath, dbName);
return path;
}
Future<void> export(String dbPath) async {
if (isMobile()) {
final path = join(dbPath, dbName);
final path = getPath(dbPath);
db = await openDatabase(path);
await db.close();
await Share.shareFiles([path], subject: dbName);

View File

@ -187,6 +187,8 @@ class MessageLookup extends MessageLookupByLibrary {
"doYouWantToDeleteTheSecretKeyAndConvert":
MessageLookupByLibrary.simpleMessage(
"Do you want to DELETE the secret key and convert this account to a watch-only account? You will not be able to spend from this device anymore. This operation is NOT reversible."),
"doYouWantToRestore": MessageLookupByLibrary.simpleMessage(
"Do you want to restore your database? THIS WILL ERASE YOUR CURRENT DATA"),
"doYouWantToTransferYourEntireTransparentBalanceTo": m4,
"duplicateAccount":
MessageLookupByLibrary.simpleMessage("Duplicate Account"),

View File

@ -23,20 +23,20 @@ class MessageLookup extends MessageLookupByLibrary {
static String m0(currency) => "Cantidad en ${currency}";
static String m1(ticker) =>
"Estás seguro de que quieres guardar tus contactos? Costará 0,01 mZEC ";
"¿Estás seguro de que quieres guardar tus contactos? Costará 0,01 mZEC ";
static String m2(name) =>
"Copia De Seguridad - ${name} - Requerido Para Restaurar";
"Copia de seguridad - ${name} - Requerida para restaurar";
static String m3(address, amount) =>
"Do you want to sign a transaction to ${address} for ${amount}";
"Desea firmar una transacción a ${address} por ${amount}";
static String m4(ticker) =>
"¿Quiere transferir su saldo transparente a su dirección blindada? ";
static String m5(app) => "${app} Copia completa";
static String m6(msg) => "FALTA: ${msg}";
static String m6(msg) => "ERROR: ${msg}";
static String m8(ticker) => "Recibir ${ticker}";
@ -71,18 +71,19 @@ class MessageLookup extends MessageLookupByLibrary {
"M6": MessageLookupByLibrary.simpleMessage("6 M"),
"Y1": MessageLookupByLibrary.simpleMessage("1 A"),
"about": MessageLookupByLibrary.simpleMessage("Acerca"),
"accentColor": MessageLookupByLibrary.simpleMessage("Acento Color"),
"accentColor": MessageLookupByLibrary.simpleMessage("Color de acento"),
"account": MessageLookupByLibrary.simpleMessage("Cuenta"),
"accountBalanceHistory":
MessageLookupByLibrary.simpleMessage("Historial De Cuenta"),
MessageLookupByLibrary.simpleMessage("Historial de la cuenta"),
"accountHasSomeBalanceAreYouSureYouWantTo":
MessageLookupByLibrary.simpleMessage(
"La cuenta tiene un saldo. ¿Estás seguro de que quieres eliminarlo?"),
"accountIndex":
MessageLookupByLibrary.simpleMessage("Índice de cuenta"),
"accountName": MessageLookupByLibrary.simpleMessage("Nombre de Cuenta"),
"accountName":
MessageLookupByLibrary.simpleMessage("Nombre de la cuenta"),
"accountNameIsRequired": MessageLookupByLibrary.simpleMessage(
"Se requiere el nombre de cuenta"),
"Se requiere el nombre de la cuenta"),
"accounts": MessageLookupByLibrary.simpleMessage("Cuentas"),
"add": MessageLookupByLibrary.simpleMessage("AGREGAR"),
"addARecipientAndItWillShowHere": MessageLookupByLibrary.simpleMessage(
@ -93,31 +94,31 @@ class MessageLookup extends MessageLookupByLibrary {
"addressCopiedToClipboard": MessageLookupByLibrary.simpleMessage(
"Dirección copiada al portapapeles"),
"addressIsEmpty":
MessageLookupByLibrary.simpleMessage("Dirección está vacía"),
MessageLookupByLibrary.simpleMessage("La Dirección está vacía"),
"advanced": MessageLookupByLibrary.simpleMessage("Avanzado"),
"advancedOptions":
MessageLookupByLibrary.simpleMessage("Opciones Avanzadas"),
"amount": MessageLookupByLibrary.simpleMessage("Monto"),
"amountInSettingscurrency": m0,
"amountMustBeANumber":
MessageLookupByLibrary.simpleMessage("Cantidad debe ser un número"),
"amountMustBeANumber": MessageLookupByLibrary.simpleMessage(
"La cantidad debe ser un número"),
"amountMustBePositive": MessageLookupByLibrary.simpleMessage(
"Cantidad debe ser un positivo"),
"La cantidad debe ser positiva"),
"amountTooHigh":
MessageLookupByLibrary.simpleMessage("Cantidad demasiado alta"),
"antispamFilter":
MessageLookupByLibrary.simpleMessage("Anti-Spam Filter"),
"applicationReset":
MessageLookupByLibrary.simpleMessage("Application Reset"),
MessageLookupByLibrary.simpleMessage("Restablecer la aplicación"),
"approve": MessageLookupByLibrary.simpleMessage("APROBAR"),
"areYouSureYouWantToDeleteThisContact":
MessageLookupByLibrary.simpleMessage(
"Estás seguro de que deseas eliminar este contacto?"),
"¿Estás seguro de que deseas eliminar este contacto?"),
"areYouSureYouWantToSaveYourContactsIt": m1,
"auto": MessageLookupByLibrary.simpleMessage("Auto"),
"autoHideBalance": MessageLookupByLibrary.simpleMessage(
"Ocultar Saldo Automáticamente"),
"backup": MessageLookupByLibrary.simpleMessage("Copia De Seguridad"),
"backup": MessageLookupByLibrary.simpleMessage("Copia de seguridad"),
"backupAllAccounts":
MessageLookupByLibrary.simpleMessage("Copia de seguridad completa"),
"backupDataRequiredForRestore": m2,
@ -126,12 +127,12 @@ class MessageLookup extends MessageLookupByLibrary {
"backupWarning": MessageLookupByLibrary.simpleMessage(
"Nadie puede recuperar sus claves secretas. Si no tiene una copia de seguridad, PERDERÁ SU DINERO si su teléfono se avería. Puede acceder a esta página mediante el menú de la aplicación y luego \'Copia de Seguridad\'"),
"balance": MessageLookupByLibrary.simpleMessage("Saldo"),
"barcode": MessageLookupByLibrary.simpleMessage("Código de Barras"),
"barcode": MessageLookupByLibrary.simpleMessage("Código de barras"),
"barcodeScannerIsNotAvailableOnDesktop":
MessageLookupByLibrary.simpleMessage(
"El escáner de código de barras no está disponible en el escritorio"),
"blue": MessageLookupByLibrary.simpleMessage("Azul"),
"body": MessageLookupByLibrary.simpleMessage("Body"),
"body": MessageLookupByLibrary.simpleMessage("Cuerpo"),
"broadcast": MessageLookupByLibrary.simpleMessage("Transmisión"),
"broadcastFromYourOnlineDevice": MessageLookupByLibrary.simpleMessage(
"Transmite desde tu dispositivo en línea"),
@ -140,18 +141,18 @@ class MessageLookup extends MessageLookupByLibrary {
"cancelScan": MessageLookupByLibrary.simpleMessage("Cancelar Escaneo"),
"changeAccountName":
MessageLookupByLibrary.simpleMessage("Cambiar nombre de la cuenta"),
"changeTransparentKey":
MessageLookupByLibrary.simpleMessage("Change Transparent Key"),
"changeTransparentKey": MessageLookupByLibrary.simpleMessage(
"Cambiar la clave transparente"),
"changingTheModeWillTakeEffectAtNextRestart":
MessageLookupByLibrary.simpleMessage(
"Cambiar el modo tendrá efecto en el próximo reinicio"),
"checkTransaction":
MessageLookupByLibrary.simpleMessage("Controlar la Transacción"),
MessageLookupByLibrary.simpleMessage("Controlar la transacción"),
"close": MessageLookupByLibrary.simpleMessage("Cambiar la Clave"),
"closeApplication":
MessageLookupByLibrary.simpleMessage("Cierra la aplicación"),
"coffee": MessageLookupByLibrary.simpleMessage("Café"),
"coldStorage": MessageLookupByLibrary.simpleMessage("Billetera Fría"),
"coldStorage": MessageLookupByLibrary.simpleMessage("Billetera fría"),
"color": MessageLookupByLibrary.simpleMessage("Color"),
"confirmDeleteAccount": MessageLookupByLibrary.simpleMessage(
"¿Está SEGURO de que desea BORRAR esta cuenta? DEBE tener una COPIA DE SEGURIDAD para recuperarla. Esta operación NO es reversible."),
@ -159,23 +160,23 @@ class MessageLookup extends MessageLookupByLibrary {
"¿Seguro que quieres restablecer la aplicación? Sus cuentas NO serán eliminadas"),
"confirmSignATransactionToAddressFor": m3,
"confirmSigning":
MessageLookupByLibrary.simpleMessage("Confirm Signing"),
MessageLookupByLibrary.simpleMessage("Confirmar firma"),
"confs": MessageLookupByLibrary.simpleMessage("Confs"),
"contactName":
MessageLookupByLibrary.simpleMessage("Nombre de contacto"),
MessageLookupByLibrary.simpleMessage("Nombre del contacto"),
"contacts": MessageLookupByLibrary.simpleMessage("Contactos"),
"convertToWatchonly":
MessageLookupByLibrary.simpleMessage("Convertir en solo vista"),
"copy": MessageLookupByLibrary.simpleMessage("Copy"),
"copy": MessageLookupByLibrary.simpleMessage("Copiar"),
"count": MessageLookupByLibrary.simpleMessage("Cuenta"),
"createANewAccount": MessageLookupByLibrary.simpleMessage(
"Crea una cuenta y aparecerá aquí."),
"Crea una nueva cuenta y aparecerá aquí."),
"createANewContactAndItWillShowUpHere":
MessageLookupByLibrary.simpleMessage(
"Crea un contacto y aparecerá aquí."),
"crypto": MessageLookupByLibrary.simpleMessage("Crypto"),
"currency": MessageLookupByLibrary.simpleMessage("Moneda"),
"custom": MessageLookupByLibrary.simpleMessage("Custom"),
"custom": MessageLookupByLibrary.simpleMessage("Personalizado"),
"dark": MessageLookupByLibrary.simpleMessage("Noche"),
"date": MessageLookupByLibrary.simpleMessage("Fecha"),
"datetime": MessageLookupByLibrary.simpleMessage("Fecha/Hora"),
@ -190,24 +191,26 @@ class MessageLookup extends MessageLookupByLibrary {
"doYouWantToDeleteTheSecretKeyAndConvert":
MessageLookupByLibrary.simpleMessage(
"¿Quiere BORRAR la clave secreta y convertir esta cuenta a solo lectura? Ya no podrá gastar desde este dispositivo. Esta operación NO es reversible."),
"doYouWantToRestore": MessageLookupByLibrary.simpleMessage(
"Do you want to restore your database? THIS WILL ERASE YOUR CURRENT DATA"),
"doYouWantToTransferYourEntireTransparentBalanceTo": m4,
"duplicateAccount":
MessageLookupByLibrary.simpleMessage("Cuenta duplicada"),
"editContact": MessageLookupByLibrary.simpleMessage("Editar Contacto"),
"editContact": MessageLookupByLibrary.simpleMessage("Editar contacto"),
"encryptedBackup": m5,
"enterSecretShareIfAccountIsMultisignature":
MessageLookupByLibrary.simpleMessage(
"Enter secret share if account is multi-signature"),
"Introduzca la clave secreta si la cuenta es multi-firma"),
"enterSeed": MessageLookupByLibrary.simpleMessage(
"Ingrese Semilla, Clave Secreta o Clave Lectura. Dejar en blanco para una nueva cuenta "),
"Ingrese la Semilla, Clave secreta o Clave de visualización. Dejar en blanco para una nueva cuenta"),
"error": m6,
"excludedNotes":
MessageLookupByLibrary.simpleMessage("Notas Excluidas"),
"fileSaved": MessageLookupByLibrary.simpleMessage("File saved"),
MessageLookupByLibrary.simpleMessage("Notas excluidas"),
"fileSaved": MessageLookupByLibrary.simpleMessage("Archivo guardado"),
"fromto": MessageLookupByLibrary.simpleMessage("Rem/Dest."),
"fullBackup": MessageLookupByLibrary.simpleMessage("Copia completa"),
"fullRestore": MessageLookupByLibrary.simpleMessage(
"Restauración copia de seguridad completa"),
"Restauración de la copia de seguridad completada"),
"gapLimit": MessageLookupByLibrary.simpleMessage("Brecha"),
"gold": MessageLookupByLibrary.simpleMessage("Oro"),
"height": MessageLookupByLibrary.simpleMessage("Altura"),
@ -216,49 +219,49 @@ class MessageLookup extends MessageLookupByLibrary {
"iHaveMadeABackup": MessageLookupByLibrary.simpleMessage(
"He hecho una copia de seguridad"),
"includeFeeInAmount": MessageLookupByLibrary.simpleMessage(
"Incluir tarifa en la cantidad"),
"includeReplyTo":
MessageLookupByLibrary.simpleMessage("Include My Address in Memo"),
"Incluir comisión en la cantidad"),
"includeReplyTo": MessageLookupByLibrary.simpleMessage(
"Incluir mi dirección en el memo"),
"inputBarcodeValue":
MessageLookupByLibrary.simpleMessage("Escriba el Código de Barras"),
MessageLookupByLibrary.simpleMessage("Escriba el Código de barras"),
"invalidAddress":
MessageLookupByLibrary.simpleMessage("Dirección no es válida"),
MessageLookupByLibrary.simpleMessage("La Dirección no es válida"),
"invalidKey": MessageLookupByLibrary.simpleMessage("Tecla inválida"),
"key": MessageLookupByLibrary.simpleMessage("Llave"),
"key": MessageLookupByLibrary.simpleMessage("Clave"),
"keyTool": MessageLookupByLibrary.simpleMessage("Clave Utilidad"),
"largestSpendingLastMonth":
MessageLookupByLibrary.simpleMessage("Pago Más Grande Mes Pasado"),
"largestSpendingLastMonth": MessageLookupByLibrary.simpleMessage(
"Principales pagos del último mes"),
"largestSpendingsByAddress": MessageLookupByLibrary.simpleMessage(
"Pagos más grandes por dirección"),
"ledger": MessageLookupByLibrary.simpleMessage("Ledger"),
"light": MessageLookupByLibrary.simpleMessage("Día"),
"loadBackup":
MessageLookupByLibrary.simpleMessage("Respaldo copia de seguridad"),
"loadBackup": MessageLookupByLibrary.simpleMessage(
"Respaldar copia de seguridad"),
"loading": MessageLookupByLibrary.simpleMessage("Cargando..."),
"markAllAsRead":
MessageLookupByLibrary.simpleMessage("Marcar Todo como Leido"),
MessageLookupByLibrary.simpleMessage("Marcar todo como leido"),
"max": MessageLookupByLibrary.simpleMessage("MAX"),
"maxAmountPerNote":
MessageLookupByLibrary.simpleMessage("Monto máximo por nota"),
"memo": MessageLookupByLibrary.simpleMessage("Nota"),
"message": MessageLookupByLibrary.simpleMessage("Mensaje"),
"messages": MessageLookupByLibrary.simpleMessage("Messages"),
"messages": MessageLookupByLibrary.simpleMessage("Mensages"),
"mm": MessageLookupByLibrary.simpleMessage("M/M"),
"mobileCharges": MessageLookupByLibrary.simpleMessage(
"En datos móviles, el escaneo puede incurrir en cargos adicionales. Quieres proceder?"),
"Con datos móviles, el escaneo puede incurrir en cargos adicionales. ¿Quieres proceder?"),
"mode": MessageLookupByLibrary.simpleMessage("Modo"),
"multiPay": MessageLookupByLibrary.simpleMessage("Multi Pagos"),
"multipay": MessageLookupByLibrary.simpleMessage("MultiPagos"),
"multipleAddresses":
MessageLookupByLibrary.simpleMessage("multiple addresses"),
"multisig": MessageLookupByLibrary.simpleMessage("Multisig"),
MessageLookupByLibrary.simpleMessage("Múltiples direcciones"),
"multisig": MessageLookupByLibrary.simpleMessage("Multi-firma"),
"multisigShares":
MessageLookupByLibrary.simpleMessage("Multisig Shares"),
MessageLookupByLibrary.simpleMessage("Acciones multi-firmas"),
"na": MessageLookupByLibrary.simpleMessage("N/A"),
"nameIsEmpty": MessageLookupByLibrary.simpleMessage("Nombre vacio"),
"newAccount": MessageLookupByLibrary.simpleMessage("Nueva Cuenta"),
"newAccount": MessageLookupByLibrary.simpleMessage("Nueva cuenta"),
"newSnapAddress":
MessageLookupByLibrary.simpleMessage("Nueva Dirección Instantánea"),
MessageLookupByLibrary.simpleMessage("Nueva Dirección instantánea"),
"newSubAccount":
MessageLookupByLibrary.simpleMessage("Nueva subcuenta"),
"noAccount": MessageLookupByLibrary.simpleMessage("Sin Cuenta"),
@ -269,7 +272,7 @@ class MessageLookup extends MessageLookupByLibrary {
"noContacts": MessageLookupByLibrary.simpleMessage("Sin Contactos"),
"noRecipient": MessageLookupByLibrary.simpleMessage("Sin Destinatario"),
"noSpendingInTheLast30Days":
MessageLookupByLibrary.simpleMessage("Sin Pagos En 30 Días"),
MessageLookupByLibrary.simpleMessage("Sin pagos en 30 días"),
"notEnoughBalance":
MessageLookupByLibrary.simpleMessage("Saldo Insuficiente"),
"notes": MessageLookupByLibrary.simpleMessage("Notas"),
@ -279,7 +282,7 @@ class MessageLookup extends MessageLookupByLibrary {
"Número de confirmaciones necesarias antes de gastar"),
"ok": MessageLookupByLibrary.simpleMessage("OK"),
"openInExplorer":
MessageLookupByLibrary.simpleMessage("Abre con Explorador"),
MessageLookupByLibrary.simpleMessage("Abrir en el Explorador"),
"paymentInProgress":
MessageLookupByLibrary.simpleMessage("Pago en curso..."),
"pink": MessageLookupByLibrary.simpleMessage("Rosado"),
@ -300,16 +303,15 @@ class MessageLookup extends MessageLookupByLibrary {
"price": MessageLookupByLibrary.simpleMessage("Precio"),
"primary": MessageLookupByLibrary.simpleMessage("Primario"),
"privateKey": MessageLookupByLibrary.simpleMessage("Clave Privada"),
"protectOpen":
MessageLookupByLibrary.simpleMessage("Proteger presentar"),
"protectSend": MessageLookupByLibrary.simpleMessage("Proteger enviar"),
"protectOpen": MessageLookupByLibrary.simpleMessage("Bloquer al abrir"),
"protectSend": MessageLookupByLibrary.simpleMessage("Bloquear envío"),
"protectSendSettingChanged": MessageLookupByLibrary.simpleMessage(
"La configuración de envío protegido ha cambiado"),
"purple": MessageLookupByLibrary.simpleMessage("Morada"),
"La configuración de bloquear envío ha cambiado"),
"purple": MessageLookupByLibrary.simpleMessage("Morado"),
"qty": MessageLookupByLibrary.simpleMessage("Cantidad"),
"rawTransaction":
MessageLookupByLibrary.simpleMessage("Transacción con firmar"),
"realized": MessageLookupByLibrary.simpleMessage("Dio Cuenta"),
"realized": MessageLookupByLibrary.simpleMessage("Realizado"),
"receive": m8,
"receivePayment":
MessageLookupByLibrary.simpleMessage("Recibir un pago"),
@ -318,27 +320,27 @@ class MessageLookup extends MessageLookupByLibrary {
"rescan": MessageLookupByLibrary.simpleMessage("Escanear"),
"rescanFrom": MessageLookupByLibrary.simpleMessage("¿Escanear desde?"),
"rescanNeeded":
MessageLookupByLibrary.simpleMessage("Necesita Escanear"),
MessageLookupByLibrary.simpleMessage("Necesita escanear"),
"rescanRequested": m9,
"rescanning": MessageLookupByLibrary.simpleMessage("Escanear..."),
"reset": MessageLookupByLibrary.simpleMessage("RESET"),
"reset": MessageLookupByLibrary.simpleMessage("RESTABLECER"),
"restart": MessageLookupByLibrary.simpleMessage("Reiniciar"),
"restoreAnAccount":
MessageLookupByLibrary.simpleMessage("Restaurar una Cuenta?"),
MessageLookupByLibrary.simpleMessage("¿Restaurar una Cuenta?"),
"resumeScan": MessageLookupByLibrary.simpleMessage("Reanudar Escaneo"),
"retrieveTransactionDetails": MessageLookupByLibrary.simpleMessage(
"Obtener detalles de la transacción"),
"roundToMillis":
MessageLookupByLibrary.simpleMessage("Redonda a millis"),
MessageLookupByLibrary.simpleMessage("Redondear a milési"),
"saveBackup":
MessageLookupByLibrary.simpleMessage("Guardar copia de seguridad"),
"saveToBlockchain":
MessageLookupByLibrary.simpleMessage("Guardar en blockchain?"),
MessageLookupByLibrary.simpleMessage("Guardar en la blockchain?"),
"scanStartingMomentarily": MessageLookupByLibrary.simpleMessage(
"Escaneo comenzando momentáneamente "),
"Escaneo iniciado momentáneamente"),
"secondary": MessageLookupByLibrary.simpleMessage("Secundario"),
"secretKey": MessageLookupByLibrary.simpleMessage("Llave Secreta"),
"secretShare": MessageLookupByLibrary.simpleMessage("Secret Share"),
"secretKey": MessageLookupByLibrary.simpleMessage("Clave secreta"),
"secretShare": MessageLookupByLibrary.simpleMessage("Clave secreta"),
"seed": MessageLookupByLibrary.simpleMessage("Semilla"),
"selectAccount":
MessageLookupByLibrary.simpleMessage("Seleccionar cuenta"),
@ -355,46 +357,46 @@ class MessageLookup extends MessageLookupByLibrary {
"server": MessageLookupByLibrary.simpleMessage("Servidor"),
"settings": MessageLookupByLibrary.simpleMessage("Ajustes"),
"shieldTranspBalance":
MessageLookupByLibrary.simpleMessage("Blindar Saldo Transp."),
MessageLookupByLibrary.simpleMessage("Blindar Saldo transp."),
"shieldTransparentBalance":
MessageLookupByLibrary.simpleMessage("Blindar Saldo Transparente"),
MessageLookupByLibrary.simpleMessage("Blindar saldo transparente"),
"shieldingInProgress":
MessageLookupByLibrary.simpleMessage("Blindaje en progreso…"),
"showMessagesAsTable":
MessageLookupByLibrary.simpleMessage("Mostrar mensajes como Tabla"),
"sign": MessageLookupByLibrary.simpleMessage("Sign"),
MessageLookupByLibrary.simpleMessage("Mostrar mensajes como tabla"),
"sign": MessageLookupByLibrary.simpleMessage("Firma"),
"signOffline": MessageLookupByLibrary.simpleMessage("Firmar"),
"signOnYourOfflineDevice": MessageLookupByLibrary.simpleMessage(
"Firme con tu dispositivo fuera de línea"),
"signedTx": MessageLookupByLibrary.simpleMessage("Firmado Tx"),
"simple": MessageLookupByLibrary.simpleMessage("Sencillo"),
"Firmar con tu dispositivo fuera de línea"),
"signedTx": MessageLookupByLibrary.simpleMessage("Tx Firmado"),
"simple": MessageLookupByLibrary.simpleMessage("Básico"),
"simpleMode": MessageLookupByLibrary.simpleMessage("Modo simple"),
"spendable": MessageLookupByLibrary.simpleMessage("Gastable"),
"spendable": MessageLookupByLibrary.simpleMessage("Disponible"),
"spendableBalance":
MessageLookupByLibrary.simpleMessage("Saldo Gastable"),
"splitAccount": MessageLookupByLibrary.simpleMessage("Split Account"),
MessageLookupByLibrary.simpleMessage("Saldo disponible"),
"splitAccount": MessageLookupByLibrary.simpleMessage("Cuenta dividida"),
"subAccountIndexOf": m15,
"subAccountOf": m16,
"subject": MessageLookupByLibrary.simpleMessage("Subject"),
"subject": MessageLookupByLibrary.simpleMessage("Asunto"),
"syncPaused": MessageLookupByLibrary.simpleMessage("Escaneo en pausa"),
"synching": MessageLookupByLibrary.simpleMessage("Sincronizando"),
"table": MessageLookupByLibrary.simpleMessage("Lista"),
"tapAnIconToShowTheQrCode": MessageLookupByLibrary.simpleMessage(
"Pinchar icono para mostrar código QR"),
"Tocar el icono para mostrar el código QR"),
"tapChartToToggleBetweenAddressAndAmount":
MessageLookupByLibrary.simpleMessage(
"Toque gráfico para alternar entre dirección y cantidad"),
"Tocar gráfica para alternar entre dirección y cantidad"),
"tapQrCodeForShieldedAddress": MessageLookupByLibrary.simpleMessage(
"Pinchar QR para Dirección Blindada"),
"Toca el QR para Dirección blindada"),
"tapQrCodeForTransparentAddress": MessageLookupByLibrary.simpleMessage(
"Pinchar QR para Dirección Transparente"),
"Toca el QR para Dirección transparente"),
"tapTransactionForDetails": MessageLookupByLibrary.simpleMessage(
"Toque Transacción para detalles"),
"Tocar Transacción para detalles"),
"textCopiedToClipboard": m17,
"thePrivateWalletMessenger": MessageLookupByLibrary.simpleMessage(
"La Cartera & Mensajero Privado"),
"Billetera & Mensajería Privada"),
"theme": MessageLookupByLibrary.simpleMessage("Tema"),
"themeEditor": MessageLookupByLibrary.simpleMessage("Editora de temas"),
"themeEditor": MessageLookupByLibrary.simpleMessage("Editor de temas"),
"thisAccountAlreadyExists":
MessageLookupByLibrary.simpleMessage("Esta cuenta ya existe."),
"tiltYourDeviceUpToRevealYourBalance":
@ -403,11 +405,11 @@ class MessageLookup extends MessageLookupByLibrary {
"timestamp": MessageLookupByLibrary.simpleMessage("Fecha/Hora"),
"toMakeAContactSendThemAMemoWithContact":
MessageLookupByLibrary.simpleMessage(
"Para hacer un contacto, enviarles una nota con Contact:"),
"Para contactar, enviarles una nota con Contact:"),
"total": MessageLookupByLibrary.simpleMessage("Total"),
"totalBalance": MessageLookupByLibrary.simpleMessage("Saldo Total"),
"tradingChartRange":
MessageLookupByLibrary.simpleMessage("Rango de Gráfico"),
MessageLookupByLibrary.simpleMessage("Rango del gráfico"),
"tradingPl": MessageLookupByLibrary.simpleMessage("Intercambio G&P"),
"transactionDetails":
MessageLookupByLibrary.simpleMessage("Detalles de transacción"),
@ -415,22 +417,23 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage("Historia de transacciones"),
"txId": m18,
"underConfirmed":
MessageLookupByLibrary.simpleMessage("Confirmaciones Insuficiente"),
MessageLookupByLibrary.simpleMessage("Confirmaciones insuficiente"),
"unshielded": MessageLookupByLibrary.simpleMessage("Sin blindaje"),
"unshieldedBalance":
MessageLookupByLibrary.simpleMessage("Saldo sin blindaje"),
"unsignedTransactionFile": MessageLookupByLibrary.simpleMessage(
"Archivo de transaccion sin firmar"),
"unsignedTx": MessageLookupByLibrary.simpleMessage("No firmado Tx"),
"unsignedTx": MessageLookupByLibrary.simpleMessage("Tx no firmado "),
"update": MessageLookupByLibrary.simpleMessage("Recalcular"),
"useQrForOfflineSigning": MessageLookupByLibrary.simpleMessage(
"Use QR para firmar sin conexión"),
"Usar QR para firmar sin conexión"),
"useSettingscurrency": m19,
"useTransparentBalance":
MessageLookupByLibrary.simpleMessage("Usar Saldo Transp"),
"useUa": MessageLookupByLibrary.simpleMessage("Usar UA"),
MessageLookupByLibrary.simpleMessage("Usar saldo transp"),
"useUa": MessageLookupByLibrary.simpleMessage("Usar DU"),
"version": MessageLookupByLibrary.simpleMessage("Versión"),
"viewingKey": MessageLookupByLibrary.simpleMessage("Llave Lectura"),
"viewingKey":
MessageLookupByLibrary.simpleMessage("Clave de visualización"),
"welcomeToYwallet":
MessageLookupByLibrary.simpleMessage("Bienvenido a YWallet")
};

View File

@ -191,6 +191,8 @@ class MessageLookup extends MessageLookupByLibrary {
"doYouWantToDeleteTheSecretKeyAndConvert":
MessageLookupByLibrary.simpleMessage(
"Voulez-vous SUPPRIMER la clé secrète et convertir ce compte en un compte d\'observation ? Vous ne pourrez plus dépenser depuis cet appareil. Cette opération n\'est PAS réversible."),
"doYouWantToRestore": MessageLookupByLibrary.simpleMessage(
"Voulez vous restaurer vos données? CECI VA EFFACER VOS COMPTES."),
"doYouWantToTransferYourEntireTransparentBalanceTo": m4,
"duplicateAccount":
MessageLookupByLibrary.simpleMessage("Compte en double"),

View File

@ -2591,6 +2591,16 @@ class S {
args: [],
);
}
/// `Do you want to restore your database? THIS WILL ERASE YOUR CURRENT DATA`
String get doYouWantToRestore {
return Intl.message(
'Do you want to restore your database? THIS WILL ERASE YOUR CURRENT DATA',
name: 'doYouWantToRestore',
desc: '',
args: [],
);
}
}
class AppLocalizationDelegate extends LocalizationsDelegate<S> {

View File

@ -252,5 +252,6 @@
"privateKey": "Private Key",
"keyTool": "Key Tool",
"update": "Recalc",
"antispamFilter": "Anti-Spam Filter"
"antispamFilter": "Anti-Spam Filter",
"doYouWantToRestore": "Do you want to restore your database? THIS WILL ERASE YOUR CURRENT DATA"
}

View File

@ -250,5 +250,6 @@
"privateKey": "Clave Privada",
"keyTool": "Clave Utilidad",
"update": "Recalcular",
"antispamFilter": "Anti-Spam Filter"
"antispamFilter": "Anti-Spam Filter",
"doYouWantToRestore": "Do you want to restore your database? THIS WILL ERASE YOUR CURRENT DATA"
}

View File

@ -250,5 +250,6 @@
"privateKey": "Clé Privée",
"keyTool": "Clés Utilitaires",
"update": "Recalculer",
"antispamFilter": "Anti-Spam Filter"
"antispamFilter": "Anti-Spam Filter",
"doYouWantToRestore": "Voulez vous restaurer vos données? CECI VA EFFACER VOS COMPTES."
}

View File

@ -288,6 +288,8 @@ class ZWalletAppState extends State<ZWalletApp> {
}
}
final coins = [ycash, zcash];
Future<bool> _init() async {
try {
final prefs = await SharedPreferences.getInstance();
@ -295,9 +297,13 @@ class ZWalletAppState extends State<ZWalletApp> {
final exportDb = prefs.getBool('export_db') ?? false;
prefs.setBool('recover', false);
print("recover ${recover}");
if (!initialized || recover || exportDb) {
initialized = true;
final dbPath = await getDbPath();
for (var coin in coins)
coin.init(dbPath);
if (exportDb) {
await ycash.export(dbPath);
final r1 = await showMessageBox(
@ -308,23 +314,27 @@ class ZWalletAppState extends State<ZWalletApp> {
if (r1 && r2) prefs.setBool('export_db', false);
}
if (recover) {
ycash.delete(dbPath);
zcash.delete(dbPath);
for (var coin in coins) {
await coin.delete(dbPath);
await coin.importFromTemp();
}
}
_setProgress(0.1, 'Initializing Ycash');
await ycash.open(dbPath);
await ycash.open();
_setProgress(0.2, 'Initializing Zcash');
await zcash.open(dbPath);
await zcash.open();
_setProgress(0.3, 'Initializing Wallet');
WarpApi.initWallet(dbPath);
await ycash.open(dbPath);
await zcash.open(dbPath);
for (var coin in coins)
await coin.open();
if (recover) {
final f = await getRecoveryFile();
final backup = await f.readAsString();
WarpApi.restoreFullBackup("", backup);
f.delete();
if (f.existsSync()) {
final backup = await f.readAsString();
WarpApi.restoreFullBackup("", backup);
f.delete();
}
}
for (var s in settings.servers) {
@ -723,6 +733,21 @@ Future<void> resetApp(BuildContext context) async {
}
}
Future<bool> showConfirmDialog(BuildContext context, String title, String body) async {
final s = S.of(context);
final confirmation = await showDialog<bool>(
context: context,
barrierDismissible: false,
builder: (context) => AlertDialog(
title: Text(title),
content: Text(body),
actions: confirmButtons(context, () {
Navigator.of(context).pop(true);
}, okLabel: S.of(context).ok, cancelValue: false)),
) ?? false;
return confirmation;
}
Future<void> exportDb() async {
final prefs = await SharedPreferences.getInstance();
prefs.setBool('export_db', true);

@ -1 +1 @@
Subproject commit d2da2b2935d73df3fa5260160d7473415964c24d
Subproject commit b56d6426f79c51b1181986f5126a4b78a00ef292

View File

@ -15,7 +15,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.
# Read more about iOS versioning at
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
version: 1.2.12+264
version: 1.2.12+266
environment:
sdk: ">=2.12.0 <3.0.0"