diff --git a/assets/images/2.0x/litecoin.png b/assets/images/2.0x/litecoin.png new file mode 100644 index 000000000..ea6d0e6a0 Binary files /dev/null and b/assets/images/2.0x/litecoin.png differ diff --git a/assets/images/3.0x/litecoin.png b/assets/images/3.0x/litecoin.png new file mode 100644 index 000000000..56ca3f689 Binary files /dev/null and b/assets/images/3.0x/litecoin.png differ diff --git a/assets/images/litecoin.png b/assets/images/litecoin.png new file mode 100644 index 000000000..53e0202ac Binary files /dev/null and b/assets/images/litecoin.png differ diff --git a/lib/generated/i18n.dart b/lib/generated/i18n.dart index 608c882b0..56fac72e2 100644 --- a/lib/generated/i18n.dart +++ b/lib/generated/i18n.dart @@ -29,6 +29,8 @@ class S implements WidgetsLocalizations { String get add_new_word => "Add new word"; String get address_book => "Address Book"; String get address_book_menu => "Address book"; + String get address_remove_contact => "Remove contact"; + String get address_remove_content => "Are you sure that you want to remove selected contact?"; String get all => "ALL"; String get amount => "Amount: "; String get amount_is_estimate => "The receive amount is an estimate"; @@ -766,6 +768,8 @@ class $de extends S { @override String get trade_history_title => "Handelsgeschichte"; @override + String get address_remove_contact => "Kontakt entfernen"; + @override String get error_text_wallet_name => "Der Wallet darf nur Buchstaben und Zahlen enthalten\nund muss zwischen 1 und 15 Zeichen lang sein"; @override String get restore_description_from_keys => "Stellen Sie Ihr Wallet von generiert wieder her Tastenanschläge, die von Ihren privaten Schlüsseln gespeichert wurden"; @@ -836,6 +840,8 @@ class $de extends S { @override String get ok => "OK"; @override + String get address_remove_content => "Sind Sie sicher, dass Sie den ausgewählten Kontakt entfernen möchten?"; + @override String get wallet_list_title => "Monero Wallet"; @override String get authentication => "Authentifizierung"; @@ -1378,6 +1384,8 @@ class $hi extends S { @override String get trade_history_title => "व्यापार का इतिहास"; @override + String get address_remove_contact => "संपर्क हटाये"; + @override String get error_text_wallet_name => "वॉलेट नाम में केवल अक्षर, संख्याएं हो सकती हैं\nऔर 1 और 15 वर्णों के बीच लंबा होना चाहिए"; @override String get restore_description_from_keys => "अपने वॉलेट को जेनरेट से पुनर्स्थापित करें आपकी निजी कुंजी से कीस्ट्रोक्स सहेजे गए"; @@ -1448,6 +1456,8 @@ class $hi extends S { @override String get ok => "ठीक है"; @override + String get address_remove_content => "क्या आप वाकई चयनित संपर्क को हटाना चाहते हैं?"; + @override String get wallet_list_title => "Monero बटुआ"; @override String get authentication => "प्रमाणीकरण"; @@ -1990,6 +2000,8 @@ class $ru extends S { @override String get trade_history_title => "История сделок"; @override + String get address_remove_contact => "Удалить контакт"; + @override String get error_text_wallet_name => "Имя кошелька может содержать только буквы, цифры\nи должно быть от 1 до 15 символов в длину"; @override String get restore_description_from_keys => "Вы можете восстановить кошелёк с помощью приватных ключей"; @@ -2060,6 +2072,8 @@ class $ru extends S { @override String get ok => "OK"; @override + String get address_remove_content => "Вы уверены, что хотите удалить выбранный контакт?"; + @override String get wallet_list_title => "Monero Кошелёк"; @override String get authentication => "Аутентификация"; @@ -2602,6 +2616,8 @@ class $ko extends S { @override String get trade_history_title => "무역 역사"; @override + String get address_remove_contact => "연락처 삭제"; + @override String get error_text_wallet_name => "지갑 이름은 문자, 숫자 만 포함 할 수 있습니다\n1 ~ 15 자 사이 여야합니다"; @override String get restore_description_from_keys => "개인 키에서 저장된 생성 된 키 스트로크에서 월렛 복원"; @@ -2672,6 +2688,8 @@ class $ko extends S { @override String get ok => "승인"; @override + String get address_remove_content => "선택한 연락처를 삭제 하시겠습니까?"; + @override String get wallet_list_title => "모네로 월렛"; @override String get authentication => "입증"; @@ -3214,6 +3232,8 @@ class $pt extends S { @override String get trade_history_title => "Histórico de trocas"; @override + String get address_remove_contact => "Remover contato"; + @override String get error_text_wallet_name => "O nome da carteira só pode conter letras, números\ne deve ter entre 1 e 15 caracteres"; @override String get restore_description_from_keys => "Restaure sua carteira a partir de suas chaves privadas"; @@ -3284,6 +3304,8 @@ class $pt extends S { @override String get ok => "Ok"; @override + String get address_remove_content => "Tem certeza de que deseja remover o contato selecionado?"; + @override String get wallet_list_title => "Carteira Monero"; @override String get authentication => "Autenticação"; @@ -3826,6 +3848,8 @@ class $uk extends S { @override String get trade_history_title => "Історія операцій"; @override + String get address_remove_contact => "Видалити контакт"; + @override String get error_text_wallet_name => "Ім'я гаманця може містити тільки букви, цифри\nі повинно бути від 1 до 15 символів в довжину"; @override String get restore_description_from_keys => "Ви можете відновити гаманець за допомогою приватних ключів"; @@ -3896,6 +3920,8 @@ class $uk extends S { @override String get ok => "OK"; @override + String get address_remove_content => "Ви впевнені, що хочете видалити вибраний контакт?"; + @override String get wallet_list_title => "Monero Гаманець"; @override String get authentication => "Аутентифікація"; @@ -4438,6 +4464,8 @@ class $ja extends S { @override String get trade_history_title => "取引履歴"; @override + String get address_remove_contact => "連絡先を削除します"; + @override String get error_text_wallet_name => "ウォレット名には文字のみを含めることができます\n1〜15文字である必要があります"; @override String get restore_description_from_keys => "生成されたウォレットを復元します秘密鍵から保存されたキーストローク"; @@ -4508,6 +4536,8 @@ class $ja extends S { @override String get ok => "OK"; @override + String get address_remove_content => "選択した連絡先を削除してもよろしいですか?"; + @override String get wallet_list_title => "Monero 財布"; @override String get authentication => "認証"; @@ -5054,6 +5084,8 @@ class $pl extends S { @override String get trade_history_title => "Historia handlu"; @override + String get address_remove_contact => "Usuń kontakt"; + @override String get error_text_wallet_name => "Nazwa portfela może zawierać tylko litery i cyfry\ni musi mieć od 1 do 15 znaków"; @override String get restore_description_from_keys => "Przywróć swój portfel z wygenerowanego naciśnięcia klawiszy zapisane z kluczy prywatnych"; @@ -5124,6 +5156,8 @@ class $pl extends S { @override String get ok => "Dobrze"; @override + String get address_remove_content => "Czy na pewno chcesz usunąć wybrany kontakt?"; + @override String get wallet_list_title => "Portfel Monero"; @override String get authentication => "Poświadczenie"; @@ -5666,6 +5700,8 @@ class $es extends S { @override String get trade_history_title => "Historia del comercio"; @override + String get address_remove_contact => "Remover contacto"; + @override String get error_text_wallet_name => "El nombre de la billetera solo puede contener letras, números \ny debe tener entre 1 y 15 caracteres de longitud"; @override String get restore_description_from_keys => "Restaure su billetera de las pulsaciones de teclas generadas guardadas de sus claves privadas"; @@ -5736,6 +5772,8 @@ class $es extends S { @override String get ok => "OK"; @override + String get address_remove_content => "¿Estás seguro de que quieres eliminar el contacto seleccionado?"; + @override String get wallet_list_title => "Monedero Monero"; @override String get authentication => "Autenticación"; @@ -6278,6 +6316,8 @@ class $nl extends S { @override String get trade_history_title => "Handelsgeschiedenis"; @override + String get address_remove_contact => "Contact verwijderen"; + @override String get error_text_wallet_name => "Naam portemonnee kan alleen letters, cijfers bevatten\nen moet tussen de 1 en 15 tekens lang zijn"; @override String get restore_description_from_keys => "Herstel uw portemonnee van gegenereerd toetsaanslagen opgeslagen van uw privésleutels"; @@ -6348,6 +6388,8 @@ class $nl extends S { @override String get ok => "OK"; @override + String get address_remove_content => "Weet u zeker dat u het geselecteerde contact wilt verwijderen?"; + @override String get wallet_list_title => "Monero portemonnee"; @override String get authentication => "Authenticatie"; @@ -6890,6 +6932,8 @@ class $zh extends S { @override String get trade_history_title => "交易历史"; @override + String get address_remove_contact => "刪除聯繫人"; + @override String get error_text_wallet_name => "钱包名称只能包含字母,数字\n且必须介于1到15个字符之间"; @override String get restore_description_from_keys => "R从生成的电子钱包从您的私钥中保存的击键"; @@ -6960,6 +7004,8 @@ class $zh extends S { @override String get ok => "好"; @override + String get address_remove_content => "您確定要刪除所選的聯繫人嗎?"; + @override String get wallet_list_title => "Monero 钱包"; @override String get authentication => "认证方式"; diff --git a/lib/src/screens/address_book/address_book_page.dart b/lib/src/screens/address_book/address_book_page.dart index 97351f91b..4a66c3092 100644 --- a/lib/src/screens/address_book/address_book_page.dart +++ b/lib/src/screens/address_book/address_book_page.dart @@ -10,6 +10,7 @@ import 'package:cake_wallet/generated/i18n.dart'; import 'package:cake_wallet/src/domain/common/crypto_currency.dart'; import 'package:cake_wallet/src/stores/address_book/address_book_store.dart'; import 'package:cake_wallet/src/screens/base_page.dart'; +import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart'; class AddressBookPage extends BasePage { AddressBookPage({this.isEditable = true}); @@ -17,14 +18,11 @@ class AddressBookPage extends BasePage { final bool isEditable; @override - bool get isModalBackButton => true; + Color get backgroundColor => PaletteDark.historyPanel; @override String get title => S.current.address_book; - @override - AppBarStyle get appBarStyle => AppBarStyle.withShadow; - @override Widget trailing(BuildContext context) { if (!isEditable) { @@ -34,17 +32,17 @@ class AddressBookPage extends BasePage { final addressBookStore = Provider.of(context); return Container( - width: 28.0, - height: 28.0, + width: 32.0, + height: 32.0, decoration: BoxDecoration( - shape: BoxShape.circle, color: Theme.of(context).selectedRowColor), + shape: BoxShape.circle, color: PaletteDark.menuList), child: Stack( alignment: Alignment.center, children: [ - Icon(Icons.add, color: Palette.violet, size: 22.0), + Icon(Icons.add, color: Colors.white, size: 22.0), ButtonTheme( - minWidth: 28.0, - height: 28.0, + minWidth: 32.0, + height: 32.0, child: FlatButton( shape: CircleBorder(), onPressed: () async { @@ -63,20 +61,30 @@ class AddressBookPage extends BasePage { final addressBookStore = Provider.of(context); return Container( + color: PaletteDark.historyPanel, padding: EdgeInsets.only(top: 20.0, bottom: 20.0), child: Observer( builder: (_) => ListView.separated( - separatorBuilder: (_, __) => Divider( - color: Theme.of(context).dividerTheme.color, - height: 1.0, - ), + separatorBuilder: (_, __) => Container( + height: 1, + padding: EdgeInsets.only(left: 24), + color: PaletteDark.menuList, + child: Container( + height: 1, + color: PaletteDark.mainBackgroundColor, + ), + ), itemCount: addressBookStore.contactList == null ? 0 : addressBookStore.contactList.length, itemBuilder: (BuildContext context, int index) { final contact = addressBookStore.contactList[index]; + final image = _getCurrencyImage(contact.type); - final content = ListTile( + final isDrawTop = index == 0 ? true : false; + final isDrawBottom = index == addressBookStore.contactList.length - 1 ? true : false; + + final content = GestureDetector( onTap: () async { if (!isEditable) { Navigator.of(context).pop(contact); @@ -86,39 +94,69 @@ class AddressBookPage extends BasePage { final isCopied = await showNameAndAddressDialog( context, contact.name, contact.address); - if (isCopied) { + if (isCopied != null && isCopied) { await Clipboard.setData( ClipboardData(text: contact.address)); Scaffold.of(context).showSnackBar( SnackBar( - content: Text('Copied to Clipboard'), + content: Text( + S.of(context).copied_to_clipboard, + style: TextStyle( + color: Colors.white + ), + ), backgroundColor: Colors.green, duration: Duration(milliseconds: 1500), ), ); } }, - leading: Container( - height: 25.0, - width: 48.0, - alignment: Alignment.center, - decoration: BoxDecoration( - color: _getCurrencyBackgroundColor(contact.type), - borderRadius: BorderRadius.circular(6.0), - ), - child: Text( - contact.type.toString(), - style: TextStyle( - fontSize: 11.0, - color: _getCurrencyTextColor(contact.type), + child: Column( + children: [ + isDrawTop + ? Container( + width: double.infinity, + height: 1, + color: PaletteDark.mainBackgroundColor, + ) + : Offstage(), + Container( + width: double.infinity, + color: PaletteDark.menuList, + child: Padding( + padding: const EdgeInsets.only(left: 24, top: 16, bottom: 16, right: 24), + child: Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + image != null + ? image + : Offstage(), + Padding( + padding: image != null + ? EdgeInsets.only(left: 12) + : EdgeInsets.only(left: 0), + child: Text( + contact.name, + style: TextStyle( + fontSize: 14, + color: Colors.white + ), + ), + ) + ], + ) + ), ), - ), - ), - title: Text( - contact.name, - style: TextStyle( - fontSize: 16.0, - color: Theme.of(context).primaryTextTheme.title.color), + isDrawBottom + ? Container( + width: double.infinity, + height: 1, + color: PaletteDark.mainBackgroundColor, + ) + : Offstage(), + ], ), ); @@ -130,7 +168,7 @@ class AddressBookPage extends BasePage { child: content, secondaryActions: [ IconSlideAction( - caption: 'Edit', + caption: S.of(context).edit, color: Colors.blue, icon: Icons.edit, onTap: () async { @@ -141,7 +179,7 @@ class AddressBookPage extends BasePage { }, ), IconSlideAction( - caption: 'Delete', + caption: S.of(context).delete, color: Colors.red, icon: CupertinoIcons.delete, onTap: () async { @@ -171,95 +209,68 @@ class AddressBookPage extends BasePage { )); } - Color _getCurrencyBackgroundColor(CryptoCurrency currency) { - Color color; + Image _getCurrencyImage(CryptoCurrency currency) { + Image image; switch (currency) { case CryptoCurrency.xmr: - color = Palette.cakeGreenWithOpacity; + image = Image.asset('assets/images/monero.png', height: 24, width: 24); break; case CryptoCurrency.ada: - color = Colors.blue[200]; + image = null; break; case CryptoCurrency.bch: - color = Colors.orangeAccent; + image = null; break; case CryptoCurrency.bnb: - color = Colors.blue; + image = null; break; case CryptoCurrency.btc: - color = Colors.orange; + image = Image.asset('assets/images/bitcoin.png', height: 24, width: 24); break; case CryptoCurrency.dash: - color = Colors.blue; + image = null; break; case CryptoCurrency.eos: - color = Colors.orangeAccent; + image = null; break; case CryptoCurrency.eth: - color = Colors.black; + image = null; break; case CryptoCurrency.ltc: - color = Colors.blue[200]; + image = Image.asset('assets/images/litecoin.png', height: 24, width: 24); break; case CryptoCurrency.nano: - color = Colors.orange; + image = null; break; case CryptoCurrency.trx: - color = Colors.black; + image = null; break; case CryptoCurrency.usdt: - color = Colors.blue[200]; + image = null; break; case CryptoCurrency.xlm: - color = color = Colors.blue; + image = null; break; case CryptoCurrency.xrp: - color = Colors.orangeAccent; + image = null; break; default: - color = Colors.white; + image = null; } - return color; - } - - Color _getCurrencyTextColor(CryptoCurrency currency) { - Color color; - switch (currency) { - case CryptoCurrency.xmr: - color = Palette.cakeGreen; - break; - case CryptoCurrency.ltc: - case CryptoCurrency.ada: - case CryptoCurrency.usdt: - color = Palette.lightBlue; - break; - default: - color = Colors.white; - } - return color; + return image; } Future showAlertDialog(BuildContext context) async { return await showDialog( context: context, builder: (BuildContext context) { - return AlertDialog( - title: const Text( - 'Remove contact', - textAlign: TextAlign.center, - ), - content: const Text( - 'Are you sure that you want to remove selected contact?', - textAlign: TextAlign.center, - ), - actions: [ - FlatButton( - onPressed: () => Navigator.of(context).pop( false), - child: const Text('Cancel')), - FlatButton( - onPressed: () => Navigator.of(context).pop(true), - child: const Text('Remove')), - ], + return AlertWithTwoActions( + alertTitle: S.of(context).address_remove_contact, + alertContent: S.of(context).address_remove_content, + leftButtonText: S.of(context).remove, + rightButtonText: S.of(context).cancel, + actionLeftButton: () => Navigator.of(context).pop(true), + actionRightButton: () => Navigator.of(context).pop(false) ); }); } @@ -269,24 +280,13 @@ class AddressBookPage extends BasePage { return await showDialog( context: context, builder: (BuildContext context) { - return AlertDialog( - title: Text( - name, - textAlign: TextAlign.center, - style: TextStyle(fontWeight: FontWeight.bold), - ), - content: Text( - address, - textAlign: TextAlign.center, - ), - actions: [ - FlatButton( - onPressed: () => Navigator.of(context).pop(false), - child: Text('Cancel')), - FlatButton( - onPressed: () => Navigator.of(context).pop(true), - child: Text('Copy')) - ], + return AlertWithTwoActions( + alertTitle: name, + alertContent: address, + leftButtonText: S.of(context).copy, + rightButtonText: S.of(context).cancel, + actionLeftButton: () => Navigator.of(context).pop(true), + actionRightButton: () => Navigator.of(context).pop(false) ); }); } diff --git a/res/values/strings_de.arb b/res/values/strings_de.arb index 4b78f6af2..147a49dba 100644 --- a/res/values/strings_de.arb +++ b/res/values/strings_de.arb @@ -21,6 +21,8 @@ "contact_name" : "Name des Ansprechpartners", "reset" : "Zurücksetzen", "save" : "speichern", + "address_remove_contact" : "Kontakt entfernen", + "address_remove_content" : "Sind Sie sicher, dass Sie den ausgewählten Kontakt entfernen möchten?", "authenticated" : "Authentifiziert", diff --git a/res/values/strings_en.arb b/res/values/strings_en.arb index 3f8ba3280..bbd4dd53e 100644 --- a/res/values/strings_en.arb +++ b/res/values/strings_en.arb @@ -21,6 +21,8 @@ "contact_name" : "Contact Name", "reset" : "Reset", "save" : "Save", + "address_remove_contact" : "Remove contact", + "address_remove_content" : "Are you sure that you want to remove selected contact?", "authenticated" : "Authenticated", diff --git a/res/values/strings_es.arb b/res/values/strings_es.arb index 54acc7d85..c36c2bb4b 100644 --- a/res/values/strings_es.arb +++ b/res/values/strings_es.arb @@ -21,6 +21,8 @@ "contact_name" : "Nombre de contacto", "reset" : "Reiniciar", "save" : "Salvar", + "address_remove_contact" : "Remover contacto", + "address_remove_content" : "¿Estás seguro de que quieres eliminar el contacto seleccionado?", "authenticated" : "Autenticados", diff --git a/res/values/strings_hi.arb b/res/values/strings_hi.arb index 1751b594e..3ed5edec7 100644 --- a/res/values/strings_hi.arb +++ b/res/values/strings_hi.arb @@ -21,6 +21,8 @@ "contact_name" : "संपर्क नाम", "reset" : "रीसेट", "save" : "बचाना", + "address_remove_contact" : "संपर्क हटाये", + "address_remove_content" : "क्या आप वाकई चयनित संपर्क को हटाना चाहते हैं?", "authenticated" : "प्रमाणीकृत", diff --git a/res/values/strings_ja.arb b/res/values/strings_ja.arb index 6ea4b08be..f11766e4f 100644 --- a/res/values/strings_ja.arb +++ b/res/values/strings_ja.arb @@ -21,6 +21,8 @@ "contact_name" : "連絡先", "reset" : "リセットする", "save" : "セーブ", + "address_remove_contact" : "連絡先を削除します", + "address_remove_content" : "選択した連絡先を削除してもよろしいですか?", "authenticated" : "認証済み", diff --git a/res/values/strings_ko.arb b/res/values/strings_ko.arb index 1a89f243d..cb559ccf4 100644 --- a/res/values/strings_ko.arb +++ b/res/values/strings_ko.arb @@ -21,6 +21,8 @@ "contact_name" : "담당자 이름", "reset" : "다시 놓기", "save" : "구하다", + "address_remove_contact" : "연락처 삭제", + "address_remove_content" : "선택한 연락처를 삭제 하시겠습니까?", "authenticated" : "인증", diff --git a/res/values/strings_nl.arb b/res/values/strings_nl.arb index 079bcfd55..346365ee8 100644 --- a/res/values/strings_nl.arb +++ b/res/values/strings_nl.arb @@ -21,6 +21,8 @@ "contact_name" : "Contactnaam", "reset" : "Reset", "save" : "Opslaan", + "address_remove_contact" : "Contact verwijderen", + "address_remove_content" : "Weet u zeker dat u het geselecteerde contact wilt verwijderen?", "authenticated" : "Authenticated", diff --git a/res/values/strings_pl.arb b/res/values/strings_pl.arb index 10c2cdb75..9ba148c0a 100644 --- a/res/values/strings_pl.arb +++ b/res/values/strings_pl.arb @@ -21,6 +21,8 @@ "contact_name" : "Nazwa Kontaktu", "reset" : "Nastawić", "save" : "Zapisać", + "address_remove_contact" : "Usuń kontakt", + "address_remove_content" : "Czy na pewno chcesz usunąć wybrany kontakt?", "authenticated" : "Zalegalizowany", diff --git a/res/values/strings_pt.arb b/res/values/strings_pt.arb index 2a0f779e6..f2aa35201 100644 --- a/res/values/strings_pt.arb +++ b/res/values/strings_pt.arb @@ -21,6 +21,8 @@ "contact_name" : "Nome do contato", "reset" : "Limpar", "save" : "Salvar", + "address_remove_contact" : "Remover contato", + "address_remove_content" : "Tem certeza de que deseja remover o contato selecionado?", "authenticated" : "Autenticado", diff --git a/res/values/strings_ru.arb b/res/values/strings_ru.arb index 35d67247a..b8833ff7a 100644 --- a/res/values/strings_ru.arb +++ b/res/values/strings_ru.arb @@ -21,6 +21,8 @@ "contact_name" : "Имя контакта", "reset" : "Сброс", "save" : "Сохранить", + "address_remove_contact" : "Удалить контакт", + "address_remove_content" : "Вы уверены, что хотите удалить выбранный контакт?", "authenticated" : "Аутентифицировано", diff --git a/res/values/strings_uk.arb b/res/values/strings_uk.arb index 07464070f..f420442da 100644 --- a/res/values/strings_uk.arb +++ b/res/values/strings_uk.arb @@ -21,6 +21,8 @@ "contact_name" : "Ім'я контакту", "reset" : "Скинути", "save" : "Зберегти", + "address_remove_contact" : "Видалити контакт", + "address_remove_content" : "Ви впевнені, що хочете видалити вибраний контакт?", "authenticated" : "Аутентифіковано", diff --git a/res/values/strings_zh.arb b/res/values/strings_zh.arb index 5c1c2c100..00f9c1ce9 100644 --- a/res/values/strings_zh.arb +++ b/res/values/strings_zh.arb @@ -21,6 +21,8 @@ "contact_name" : "联系人姓名", "reset" : "重启", "save" : "保存", + "address_remove_contact" : "刪除聯繫人", + "address_remove_content" : "您確定要刪除所選的聯繫人嗎?", "authenticated" : "已认证",