diff --git a/assets/gif/coins/bitcoin/kiss.gif b/assets/gif/coins/bitcoin/kiss.gif index 8649f857d..4c645a8c2 100644 Binary files a/assets/gif/coins/bitcoin/kiss.gif and b/assets/gif/coins/bitcoin/kiss.gif differ diff --git a/assets/gif/coins/bitcoin/plain.gif b/assets/gif/coins/bitcoin/plain.gif index 5f3680219..f2fce4f49 100644 Binary files a/assets/gif/coins/bitcoin/plain.gif and b/assets/gif/coins/bitcoin/plain.gif differ diff --git a/assets/gif/coins/bitcoincash/kiss.gif b/assets/gif/coins/bitcoincash/kiss.gif index bbd5924b1..97013d1a1 100644 Binary files a/assets/gif/coins/bitcoincash/kiss.gif and b/assets/gif/coins/bitcoincash/kiss.gif differ diff --git a/assets/gif/coins/bitcoincash/plain.gif b/assets/gif/coins/bitcoincash/plain.gif index 4c8d29c77..1d764d132 100644 Binary files a/assets/gif/coins/bitcoincash/plain.gif and b/assets/gif/coins/bitcoincash/plain.gif differ diff --git a/assets/gif/coins/dogecoin/kiss.gif b/assets/gif/coins/dogecoin/kiss.gif index d0f1ffba4..1c0a7f57c 100644 Binary files a/assets/gif/coins/dogecoin/kiss.gif and b/assets/gif/coins/dogecoin/kiss.gif differ diff --git a/assets/gif/coins/dogecoin/plain.gif b/assets/gif/coins/dogecoin/plain.gif index 9ce1fbb7a..19ac9c474 100644 Binary files a/assets/gif/coins/dogecoin/plain.gif and b/assets/gif/coins/dogecoin/plain.gif differ diff --git a/assets/gif/coins/epicCash/kiss.gif b/assets/gif/coins/epicCash/kiss.gif index ef8f27fab..2b71c1291 100644 Binary files a/assets/gif/coins/epicCash/kiss.gif and b/assets/gif/coins/epicCash/kiss.gif differ diff --git a/assets/gif/coins/epicCash/plain.gif b/assets/gif/coins/epicCash/plain.gif index 4a05889af..3ad6ef13d 100644 Binary files a/assets/gif/coins/epicCash/plain.gif and b/assets/gif/coins/epicCash/plain.gif differ diff --git a/assets/gif/coins/ethereum/kiss.gif b/assets/gif/coins/ethereum/kiss.gif index 712834662..1399368e7 100644 Binary files a/assets/gif/coins/ethereum/kiss.gif and b/assets/gif/coins/ethereum/kiss.gif differ diff --git a/assets/gif/coins/ethereum/plain.gif b/assets/gif/coins/ethereum/plain.gif index 0da0eeb64..040f643ce 100644 Binary files a/assets/gif/coins/ethereum/plain.gif and b/assets/gif/coins/ethereum/plain.gif differ diff --git a/assets/gif/coins/firo/kiss.gif b/assets/gif/coins/firo/kiss.gif index 0225077db..b969feae5 100644 Binary files a/assets/gif/coins/firo/kiss.gif and b/assets/gif/coins/firo/kiss.gif differ diff --git a/assets/gif/coins/firo/plain.gif b/assets/gif/coins/firo/plain.gif index 3d2f9b620..535098f46 100644 Binary files a/assets/gif/coins/firo/plain.gif and b/assets/gif/coins/firo/plain.gif differ diff --git a/assets/gif/coins/litecoin/kiss.gif b/assets/gif/coins/litecoin/kiss.gif index 68272d06d..2e0ed64d4 100644 Binary files a/assets/gif/coins/litecoin/kiss.gif and b/assets/gif/coins/litecoin/kiss.gif differ diff --git a/assets/gif/coins/litecoin/plain.gif b/assets/gif/coins/litecoin/plain.gif index 5c12d94bf..0a1d55170 100644 Binary files a/assets/gif/coins/litecoin/plain.gif and b/assets/gif/coins/litecoin/plain.gif differ diff --git a/assets/gif/coins/monero/kiss.gif b/assets/gif/coins/monero/kiss.gif index b54fb2096..173bc8f9c 100644 Binary files a/assets/gif/coins/monero/kiss.gif and b/assets/gif/coins/monero/kiss.gif differ diff --git a/assets/gif/coins/monero/plain.gif b/assets/gif/coins/monero/plain.gif index 5090eefc2..7d93c50c8 100644 Binary files a/assets/gif/coins/monero/plain.gif and b/assets/gif/coins/monero/plain.gif differ diff --git a/assets/gif/coins/namecoin/kiss.gif b/assets/gif/coins/namecoin/kiss.gif index 10b74b356..5d773fa4c 100644 Binary files a/assets/gif/coins/namecoin/kiss.gif and b/assets/gif/coins/namecoin/kiss.gif differ diff --git a/assets/gif/coins/namecoin/plain.gif b/assets/gif/coins/namecoin/plain.gif index 954fa0046..f08720983 100644 Binary files a/assets/gif/coins/namecoin/plain.gif and b/assets/gif/coins/namecoin/plain.gif differ diff --git a/assets/gif/coins/particl/kiss.gif b/assets/gif/coins/particl/kiss.gif index 0cc80c1c8..da138ea07 100644 Binary files a/assets/gif/coins/particl/kiss.gif and b/assets/gif/coins/particl/kiss.gif differ diff --git a/assets/gif/coins/particl/plain.gif b/assets/gif/coins/particl/plain.gif index 99d36ef9c..adba9b545 100644 Binary files a/assets/gif/coins/particl/plain.gif and b/assets/gif/coins/particl/plain.gif differ diff --git a/assets/gif/coins/wownero/kiss.gif b/assets/gif/coins/wownero/kiss.gif index 16c1c1fdc..e3fd05fa3 100644 Binary files a/assets/gif/coins/wownero/kiss.gif and b/assets/gif/coins/wownero/kiss.gif differ diff --git a/assets/gif/coins/wownero/plain.gif b/assets/gif/coins/wownero/plain.gif index 0c30a857f..fd498a875 100644 Binary files a/assets/gif/coins/wownero/plain.gif and b/assets/gif/coins/wownero/plain.gif differ diff --git a/assets/gif/stacy-plain.gif b/assets/gif/stacy-plain.gif new file mode 100644 index 000000000..8fde2db6f Binary files /dev/null and b/assets/gif/stacy-plain.gif differ diff --git a/assets/svg/darkChansTheme.svg b/assets/svg/darkChansTheme.svg new file mode 100644 index 000000000..5bcca42fd --- /dev/null +++ b/assets/svg/darkChansTheme.svg @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg width="100%" height="100%" viewBox="0 0 200 162" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;"> + <defs> + <image id="_Image1" width="200px" height="162px" xlink:href="data:image/png;base64,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"/> + </defs> + <use id="Background" xlink:href="#_Image1" x="0" y="0" width="200px" height="162px"/> +</svg> diff --git a/assets/svg/oled-black-theme.svg b/assets/svg/oled-black-theme.svg index 27cd50638..d52469e4b 100644 --- a/assets/svg/oled-black-theme.svg +++ b/assets/svg/oled-black-theme.svg @@ -1,23 +1,23 @@ <svg width="200" height="162" viewBox="0 0 200 162" fill="none" xmlns="http://www.w3.org/2000/svg"> -<g clip-path="url(#clip0_489_21263)"> -<rect width="200" height="162" rx="8" fill="black"/> -<rect x="10" y="10" width="180" height="20" rx="2" fill="#77A7F9"/> +<g clip-path="url(#clip0_622_21287)"> +<rect width="200" height="162" rx="8" fill="#121212"/> +<rect x="10" y="10" width="180" height="20" rx="2" fill="#F26822"/> <rect x="16" y="16" width="106" height="8" rx="1" fill="black"/> -<rect x="10" y="40" width="180" height="20" rx="2" fill="#212F46"/> -<rect x="16" y="46" width="106" height="8" rx="1" fill="black"/> -<rect x="10" y="62" width="180" height="20" rx="2" fill="#212F46"/> -<rect x="16" y="68" width="106" height="8" rx="1" fill="black"/> -<rect x="10" y="84" width="180" height="20" rx="2" fill="#212F46"/> -<rect x="16" y="90" width="106" height="8" rx="1" fill="black"/> -<rect x="10" y="106" width="180" height="20" rx="2" fill="#212F46"/> -<rect x="16" y="112" width="106" height="8" rx="1" fill="black"/> -<rect x="10" y="128" width="180" height="20" rx="2" fill="#212F46"/> -<rect x="16" y="134" width="106" height="8" rx="1" fill="black"/> -<rect x="10" y="150" width="180" height="20" rx="2" fill="#212F46"/> -<rect x="16" y="156" width="106" height="8" rx="1" fill="black"/> +<rect x="10" y="40" width="180" height="20" rx="2" fill="#303030"/> +<rect x="16" y="46" width="106" height="8" rx="1" fill="#121212"/> +<rect x="10" y="62" width="180" height="20" rx="2" fill="#303030"/> +<rect x="16" y="68" width="106" height="8" rx="1" fill="#121212"/> +<rect x="10" y="84" width="180" height="20" rx="2" fill="#303030"/> +<rect x="16" y="90" width="106" height="8" rx="1" fill="#121212"/> +<rect x="10" y="106" width="180" height="20" rx="2" fill="#303030"/> +<rect x="16" y="112" width="106" height="8" rx="1" fill="#121212"/> +<rect x="10" y="128" width="180" height="20" rx="2" fill="#303030"/> +<rect x="16" y="134" width="106" height="8" rx="1" fill="#121212"/> +<rect x="10" y="150" width="180" height="20" rx="2" fill="#303030"/> +<rect x="16" y="156" width="106" height="8" rx="1" fill="#121212"/> </g> <defs> -<clipPath id="clip0_489_21263"> +<clipPath id="clip0_622_21287"> <rect width="200" height="162" rx="8" fill="white"/> </clipPath> </defs> diff --git a/lib/db/hive/db.dart b/lib/db/hive/db.dart index 9f73a4962..1efa94cb2 100644 --- a/lib/db/hive/db.dart +++ b/lib/db/hive/db.dart @@ -31,7 +31,7 @@ class DB { static const String boxNameWalletsToDeleteOnStart = "walletsToDeleteOnStart"; static const String boxNamePriceCache = "priceAPIPrice24hCache"; static const String boxNameDBInfo = "dbInfo"; - static const String boxNameTheme = "theme"; + // static const String boxNameTheme = "theme"; static const String boxNameDesktopData = "desktopData"; static const String boxNameBuys = "buysBox"; diff --git a/lib/main.dart b/lib/main.dart index 24184cf4b..6519a6596 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -56,15 +56,9 @@ import 'package:stackwallet/utilities/db_version_migration.dart'; import 'package:stackwallet/utilities/enums/backup_frequency_type.dart'; import 'package:stackwallet/utilities/flutter_secure_storage_interface.dart'; import 'package:stackwallet/utilities/logger.dart'; +import 'package:stackwallet/utilities/prefs.dart'; import 'package:stackwallet/utilities/stack_file_system.dart'; -import 'package:stackwallet/utilities/theme/chan_colors.dart'; import 'package:stackwallet/utilities/theme/color_theme.dart'; -import 'package:stackwallet/utilities/theme/dark_colors.dart'; -import 'package:stackwallet/utilities/theme/forest_colors.dart'; -import 'package:stackwallet/utilities/theme/fruit_sorbet_colors.dart'; -import 'package:stackwallet/utilities/theme/light_colors.dart'; -import 'package:stackwallet/utilities/theme/ocean_breeze_colors.dart'; -import 'package:stackwallet/utilities/theme/oled_black_colors.dart'; import 'package:stackwallet/utilities/theme/stack_colors.dart'; import 'package:stackwallet/utilities/util.dart'; import 'package:window_size/window_size.dart'; @@ -160,6 +154,8 @@ void main() async { (await StackFileSystem.applicationHiveDirectory()).path); await Hive.openBox<dynamic>(DB.boxNameDBInfo); + await Hive.openBox<dynamic>(DB.boxNamePrefs); + await Prefs.instance.init(); // Desktop migrate handled elsewhere (currently desktop_login_view.dart) if (!Util.isDesktop) { @@ -185,8 +181,6 @@ void main() async { monero.onStartup(); wownero.onStartup(); - await Hive.openBox<dynamic>(DB.boxNameTheme); - // SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, // overlays: [SystemUiOverlay.bottom]); await NotificationApi.init(); @@ -334,33 +328,27 @@ class _MaterialAppWithThemeState extends ConsumerState<MaterialAppWithTheme> @override void initState() { - final colorScheme = DB.instance - .get<dynamic>(boxName: DB.boxNameTheme, key: "colorScheme") as String?; - StackColorTheme colorTheme; - switch (colorScheme) { - case "dark": - colorTheme = DarkColors(); - break; - case "oledBlack": - colorTheme = OledBlackColors(); - break; - case "oceanBreeze": - colorTheme = OceanBreezeColors(); - break; - case "fruitSorbet": - colorTheme = FruitSorbetColors(); - break; - case "forest": - colorTheme = ForestColors(); - break; - case "chan": - colorTheme = ChanColors(); - break; - case "light": - default: - colorTheme = LightColors(); + if (ref.read(prefsChangeNotifierProvider).enableSystemBrightness) { + final brightness = WidgetsBinding.instance.window.platformBrightness; + switch (brightness) { + case Brightness.dark: + colorTheme = ref + .read(prefsChangeNotifierProvider) + .systemBrightnessDarkTheme + .colorTheme; + break; + case Brightness.light: + colorTheme = ref + .read(prefsChangeNotifierProvider) + .systemBrightnessLightTheme + .colorTheme; + break; + } + } else { + colorTheme = ref.read(prefsChangeNotifierProvider).theme.colorTheme; } + loadingCompleter = Completer(); WidgetsBinding.instance.addObserver(this); // load locale and prefs @@ -389,6 +377,31 @@ class _MaterialAppWithThemeState extends ConsumerState<MaterialAppWithTheme> } }); + WidgetsBinding.instance.window.onPlatformBrightnessChanged = () { + StackColorTheme colorTheme; + switch (WidgetsBinding.instance.window.platformBrightness) { + case Brightness.dark: + colorTheme = ref + .read(prefsChangeNotifierProvider) + .systemBrightnessDarkTheme + .colorTheme; + break; + case Brightness.light: + colorTheme = ref + .read(prefsChangeNotifierProvider) + .systemBrightnessLightTheme + .colorTheme; + break; + } + + WidgetsBinding.instance.addPostFrameCallback((_) { + if (ref.read(prefsChangeNotifierProvider).enableSystemBrightness) { + ref.read(colorThemeProvider.notifier).state = + StackColors.fromStackColorTheme(colorTheme); + } + }); + }; + super.initState(); } diff --git a/lib/models/isar/models/address_label.dart b/lib/models/isar/models/address_label.dart index f3efa8acf..9988c83c0 100644 --- a/lib/models/isar/models/address_label.dart +++ b/lib/models/isar/models/address_label.dart @@ -8,6 +8,7 @@ class AddressLabel { required this.walletId, required this.addressString, required this.value, + required this.tags, }); Id id = Isar.autoIncrement; @@ -20,11 +21,14 @@ class AddressLabel { late final String value; - AddressLabel copyWith({String? label, Id? id}) { + late final List<String>? tags; + + AddressLabel copyWith({String? label, Id? id, List<String>? tags}) { final addressLabel = AddressLabel( walletId: walletId, addressString: addressString, value: label ?? value, + tags: tags ?? this.tags, ); addressLabel.id = id ?? this.id; return addressLabel; diff --git a/lib/models/isar/models/address_label.g.dart b/lib/models/isar/models/address_label.g.dart index 1cd21f035..2a6b41e70 100644 --- a/lib/models/isar/models/address_label.g.dart +++ b/lib/models/isar/models/address_label.g.dart @@ -22,13 +22,18 @@ const AddressLabelSchema = CollectionSchema( name: r'addressString', type: IsarType.string, ), - r'value': PropertySchema( + r'tags': PropertySchema( id: 1, + name: r'tags', + type: IsarType.stringList, + ), + r'value': PropertySchema( + id: 2, name: r'value', type: IsarType.string, ), r'walletId': PropertySchema( - id: 2, + id: 3, name: r'walletId', type: IsarType.string, ) @@ -86,6 +91,18 @@ int _addressLabelEstimateSize( ) { var bytesCount = offsets.last; bytesCount += 3 + object.addressString.length * 3; + { + final list = object.tags; + if (list != null) { + bytesCount += 3 + list.length * 3; + { + for (var i = 0; i < list.length; i++) { + final value = list[i]; + bytesCount += value.length * 3; + } + } + } + } bytesCount += 3 + object.value.length * 3; bytesCount += 3 + object.walletId.length * 3; return bytesCount; @@ -98,8 +115,9 @@ void _addressLabelSerialize( Map<Type, List<int>> allOffsets, ) { writer.writeString(offsets[0], object.addressString); - writer.writeString(offsets[1], object.value); - writer.writeString(offsets[2], object.walletId); + writer.writeStringList(offsets[1], object.tags); + writer.writeString(offsets[2], object.value); + writer.writeString(offsets[3], object.walletId); } AddressLabel _addressLabelDeserialize( @@ -110,8 +128,9 @@ AddressLabel _addressLabelDeserialize( ) { final object = AddressLabel( addressString: reader.readString(offsets[0]), - value: reader.readString(offsets[1]), - walletId: reader.readString(offsets[2]), + tags: reader.readStringList(offsets[1]), + value: reader.readString(offsets[2]), + walletId: reader.readString(offsets[3]), ); object.id = id; return object; @@ -127,9 +146,11 @@ P _addressLabelDeserializeProp<P>( case 0: return (reader.readString(offset)) as P; case 1: - return (reader.readString(offset)) as P; + return (reader.readStringList(offset)) as P; case 2: return (reader.readString(offset)) as P; + case 3: + return (reader.readString(offset)) as P; default: throw IsarError('Unknown property with id $propertyId'); } @@ -649,6 +670,248 @@ extension AddressLabelQueryFilter }); } + QueryBuilder<AddressLabel, AddressLabel, QAfterFilterCondition> tagsIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'tags', + )); + }); + } + + QueryBuilder<AddressLabel, AddressLabel, QAfterFilterCondition> + tagsIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'tags', + )); + }); + } + + QueryBuilder<AddressLabel, AddressLabel, QAfterFilterCondition> + tagsElementEqualTo( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'tags', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder<AddressLabel, AddressLabel, QAfterFilterCondition> + tagsElementGreaterThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'tags', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder<AddressLabel, AddressLabel, QAfterFilterCondition> + tagsElementLessThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'tags', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder<AddressLabel, AddressLabel, QAfterFilterCondition> + tagsElementBetween( + String lower, + String upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'tags', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder<AddressLabel, AddressLabel, QAfterFilterCondition> + tagsElementStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'tags', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder<AddressLabel, AddressLabel, QAfterFilterCondition> + tagsElementEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'tags', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder<AddressLabel, AddressLabel, QAfterFilterCondition> + tagsElementContains(String value, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'tags', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder<AddressLabel, AddressLabel, QAfterFilterCondition> + tagsElementMatches(String pattern, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'tags', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder<AddressLabel, AddressLabel, QAfterFilterCondition> + tagsElementIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'tags', + value: '', + )); + }); + } + + QueryBuilder<AddressLabel, AddressLabel, QAfterFilterCondition> + tagsElementIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'tags', + value: '', + )); + }); + } + + QueryBuilder<AddressLabel, AddressLabel, QAfterFilterCondition> + tagsLengthEqualTo(int length) { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'tags', + length, + true, + length, + true, + ); + }); + } + + QueryBuilder<AddressLabel, AddressLabel, QAfterFilterCondition> + tagsIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'tags', + 0, + true, + 0, + true, + ); + }); + } + + QueryBuilder<AddressLabel, AddressLabel, QAfterFilterCondition> + tagsIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'tags', + 0, + false, + 999999, + true, + ); + }); + } + + QueryBuilder<AddressLabel, AddressLabel, QAfterFilterCondition> + tagsLengthLessThan( + int length, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'tags', + 0, + true, + length, + include, + ); + }); + } + + QueryBuilder<AddressLabel, AddressLabel, QAfterFilterCondition> + tagsLengthGreaterThan( + int length, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'tags', + length, + include, + 999999, + true, + ); + }); + } + + QueryBuilder<AddressLabel, AddressLabel, QAfterFilterCondition> + tagsLengthBetween( + int lower, + int upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'tags', + lower, + includeLower, + upper, + includeUpper, + ); + }); + } + QueryBuilder<AddressLabel, AddressLabel, QAfterFilterCondition> valueEqualTo( String value, { bool caseSensitive = true, @@ -1028,6 +1291,12 @@ extension AddressLabelQueryWhereDistinct }); } + QueryBuilder<AddressLabel, AddressLabel, QDistinct> distinctByTags() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'tags'); + }); + } + QueryBuilder<AddressLabel, AddressLabel, QDistinct> distinctByValue( {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { @@ -1057,6 +1326,12 @@ extension AddressLabelQueryProperty }); } + QueryBuilder<AddressLabel, List<String>?, QQueryOperations> tagsProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'tags'); + }); + } + QueryBuilder<AddressLabel, String, QQueryOperations> valueProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'value'); diff --git a/lib/models/isar/models/blockchain_data/address.dart b/lib/models/isar/models/blockchain_data/address.dart index 1992cd051..80b3d8a98 100644 --- a/lib/models/isar/models/blockchain_data/address.dart +++ b/lib/models/isar/models/blockchain_data/address.dart @@ -123,7 +123,26 @@ enum AddressType { mimbleWimble, unknown, nonWallet, - ethereum, + ethereum; + + String get readableName { + switch (this) { + case AddressType.p2pkh: + return "Legacy"; + case AddressType.p2sh: + return "Wrapped segwit"; + case AddressType.p2wpkh: + return "Segwit"; + case AddressType.cryptonote: + return "Cryptonote"; + case AddressType.mimbleWimble: + return "Mimble Wimble"; + case AddressType.unknown: + return "Unknown"; + case AddressType.nonWallet: + return "Non wallet/unknown"; + } + } } // do not modify @@ -134,7 +153,26 @@ enum AddressSubType { paynymSend, paynymReceive, unknown, - nonWallet, + nonWallet; + + String get prettyName { + switch (this) { + case AddressSubType.receiving: + return "Receiving"; + case AddressSubType.change: + return "Change"; + case AddressSubType.paynymNotification: + return "PayNym Notification"; + case AddressSubType.paynymSend: + return "PayNym Send"; + case AddressSubType.paynymReceive: + return "PayNym Receiving"; + case AddressSubType.unknown: + return "Unknown"; + case AddressSubType.nonWallet: + return "Non wallet/unknown"; + } + } } @Embedded(inheritance: false) diff --git a/lib/pages/add_wallet_views/create_or_restore_wallet_view/create_or_restore_wallet_view.dart b/lib/pages/add_wallet_views/create_or_restore_wallet_view/create_or_restore_wallet_view.dart index 565636a92..09cf78953 100644 --- a/lib/pages/add_wallet_views/create_or_restore_wallet_view/create_or_restore_wallet_view.dart +++ b/lib/pages/add_wallet_views/create_or_restore_wallet_view/create_or_restore_wallet_view.dart @@ -5,6 +5,8 @@ import 'package:stackwallet/pages/add_wallet_views/create_or_restore_wallet_view import 'package:stackwallet/pages/add_wallet_views/create_or_restore_wallet_view/sub_widgets/create_or_restore_wallet_title.dart'; import 'package:stackwallet/pages/add_wallet_views/create_or_restore_wallet_view/sub_widgets/create_wallet_button_group.dart'; import 'package:stackwallet/pages_desktop_specific/my_stack_view/exit_to_my_stack_button.dart'; +import 'package:stackwallet/utilities/enums/coin_enum.dart'; +import 'package:stackwallet/utilities/theme/color_theme.dart'; import 'package:stackwallet/utilities/theme/stack_colors.dart'; import 'package:stackwallet/utilities/util.dart'; import 'package:stackwallet/widgets/background.dart'; @@ -81,6 +83,11 @@ class CreateOrRestoreWalletView extends StatelessWidget { ), ); } else { + final isChans = Theme.of(context).extension<StackColors>()!.themeType == + ThemeType.chan || + Theme.of(context).extension<StackColors>()!.themeType == + ThemeType.darkChans; + return Background( child: Scaffold( backgroundColor: @@ -95,42 +102,59 @@ class CreateOrRestoreWalletView extends StatelessWidget { body: SafeArea( child: Container( color: Theme.of(context).extension<StackColors>()!.background, - child: Padding( - padding: const EdgeInsets.all(16), - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - CoinImage( - coin: entity.coin, - width: isDesktop - ? 324 - : MediaQuery.of(context).size.width / 1.6, - height: isDesktop - ? null - : MediaQuery.of(context).size.width / 1.6, + child: LayoutBuilder( + builder: (context, constraints) { + return SingleChildScrollView( + child: ConstrainedBox( + constraints: BoxConstraints( + minHeight: constraints.maxHeight, + ), + child: IntrinsicHeight( + child: Padding( + padding: const EdgeInsets.all(16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + if (!isChans) + const Spacer( + flex: 2, + ), + CoinImage( + coin: entity.coin, + width: isDesktop + ? 324 + : MediaQuery.of(context).size.width / 1.6, + height: isDesktop + ? null + : MediaQuery.of(context).size.width / 1.6, + ), + const Spacer( + flex: 2, + ), + CreateRestoreWalletTitle( + coin: entity.coin, + isDesktop: isDesktop, + ), + const SizedBox( + height: 8, + ), + CreateRestoreWalletSubTitle( + isDesktop: isDesktop, + ), + const Spacer( + flex: 5, + ), + CreateWalletButtonGroup( + coin: entity.coin, + isDesktop: isDesktop, + ), + ], + ), + ), + ), ), - const Spacer( - flex: 2, - ), - CreateRestoreWalletTitle( - coin: entity.coin, - isDesktop: isDesktop, - ), - const SizedBox( - height: 8, - ), - CreateRestoreWalletSubTitle( - isDesktop: isDesktop, - ), - const Spacer( - flex: 5, - ), - CreateWalletButtonGroup( - coin: entity.coin, - isDesktop: isDesktop, - ), - ], - ), + ); + }, ), ), ), diff --git a/lib/pages/add_wallet_views/create_or_restore_wallet_view/sub_widgets/coin_image.dart b/lib/pages/add_wallet_views/create_or_restore_wallet_view/sub_widgets/coin_image.dart index fb282d9ca..4b8a18005 100644 --- a/lib/pages/add_wallet_views/create_or_restore_wallet_view/sub_widgets/coin_image.dart +++ b/lib/pages/add_wallet_views/create_or_restore_wallet_view/sub_widgets/coin_image.dart @@ -6,6 +6,8 @@ import 'package:stackwallet/utilities/enums/coin_enum.dart'; import 'package:stackwallet/utilities/theme/color_theme.dart'; import 'package:stackwallet/utilities/theme/stack_colors.dart'; +import '../../../../utilities/util.dart'; + class CoinImage extends ConsumerWidget { const CoinImage({ Key? key, @@ -20,11 +22,17 @@ class CoinImage extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { - if (Theme.of(context).extension<StackColors>()!.themeType == - ThemeType.chan) { + final isChans = Theme.of(context).extension<StackColors>()!.themeType == + ThemeType.chan || + Theme.of(context).extension<StackColors>()!.themeType == + ThemeType.darkChans; + + final isDesktop = Util.isDesktop; + + if (isChans) { return SizedBox( - width: width, - height: height, + width: isDesktop ? width : MediaQuery.of(context).size.width, + height: isDesktop ? height : MediaQuery.of(context).size.width, child: Image( image: AssetImage( Assets.gif.plain(coin), diff --git a/lib/pages/coin_control/utxo_details_view.dart b/lib/pages/coin_control/utxo_details_view.dart index e5bcba57e..eabaf1ff0 100644 --- a/lib/pages/coin_control/utxo_details_view.dart +++ b/lib/pages/coin_control/utxo_details_view.dart @@ -111,6 +111,10 @@ class _UtxoDetailsViewState extends ConsumerState<UtxoDetailsView> { Navigator.of(context).pop(_popWithRefresh ? "refresh" : null); }, ), + title: Text( + "Output details", + style: STextStyles.navBarTitle(context), + ), ), body: SafeArea( child: LayoutBuilder( diff --git a/lib/pages/generic/single_field_edit_view.dart b/lib/pages/generic/single_field_edit_view.dart index c1049b006..5735a7754 100644 --- a/lib/pages/generic/single_field_edit_view.dart +++ b/lib/pages/generic/single_field_edit_view.dart @@ -196,7 +196,11 @@ class _SingleFieldEditViewState extends State<SingleFieldEditView> { } }, ), - ) + ), + if (!isDesktop) + const SizedBox( + height: 16, + ), ], ), ); diff --git a/lib/pages/loading_view.dart b/lib/pages/loading_view.dart index 6c4b611ee..2da507847 100644 --- a/lib/pages/loading_view.dart +++ b/lib/pages/loading_view.dart @@ -16,6 +16,12 @@ class LoadingView extends StatelessWidget { Widget build(BuildContext context) { final size = MediaQuery.of(context).size; final width = min(size.width, size.height) * 0.5; + + final isChan = Theme.of(context).extension<StackColors>()!.themeType == + ThemeType.chan || + Theme.of(context).extension<StackColors>()!.themeType == + ThemeType.darkChans; + return Background( child: Scaffold( backgroundColor: Theme.of(context).extension<StackColors>()!.background, @@ -35,11 +41,17 @@ class LoadingView extends StatelessWidget { ), child: SizedBox( width: width, - child: Lottie.asset( - Assets.lottie.test2, - animate: true, - repeat: true, - ), + child: isChan + ? Image( + image: AssetImage( + Assets.gif.stacyPlain, + ), + ) + : Lottie.asset( + Assets.lottie.test2, + animate: true, + repeat: true, + ), ), ), // child: Image( diff --git a/lib/pages/receive_view/addresses/address_card.dart b/lib/pages/receive_view/addresses/address_card.dart index bd9e74902..69427d505 100644 --- a/lib/pages/receive_view/addresses/address_card.dart +++ b/lib/pages/receive_view/addresses/address_card.dart @@ -1,21 +1,13 @@ import 'dart:async'; import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; import 'package:isar/isar.dart'; import 'package:stackwallet/db/isar/main_db.dart'; import 'package:stackwallet/models/isar/models/isar_models.dart'; -import 'package:stackwallet/notifications/show_flush_bar.dart'; -import 'package:stackwallet/pages/receive_view/addresses/address_qr_popup.dart'; -import 'package:stackwallet/pages/receive_view/addresses/edit_address_label_view.dart'; +import 'package:stackwallet/pages/receive_view/addresses/address_tag.dart'; import 'package:stackwallet/utilities/clipboard_interface.dart'; import 'package:stackwallet/utilities/enums/coin_enum.dart'; import 'package:stackwallet/utilities/text_styles.dart'; -import 'package:stackwallet/utilities/theme/stack_colors.dart'; -import 'package:stackwallet/widgets/custom_buttons/blue_text_button.dart'; -import 'package:stackwallet/widgets/desktop/secondary_button.dart'; -import 'package:stackwallet/widgets/icon_widgets/copy_icon.dart'; -import 'package:stackwallet/widgets/icon_widgets/qrcode_icon.dart'; import 'package:stackwallet/widgets/rounded_white_container.dart'; class AddressCard extends StatefulWidget { @@ -24,6 +16,7 @@ class AddressCard extends StatefulWidget { required this.addressId, required this.walletId, required this.coin, + this.onPressed, this.clipboard = const ClipboardWrapper(), }) : super(key: key); @@ -31,6 +24,7 @@ class AddressCard extends StatefulWidget { final String walletId; final Coin coin; final ClipboardInterface clipboard; + final VoidCallback? onPressed; @override State<AddressCard> createState() => _AddressCardState(); @@ -56,6 +50,11 @@ class _AddressCardState extends State<AddressCard> { walletId: widget.walletId, addressString: address.value, value: "", + tags: address.subType == AddressSubType.receiving + ? ["receiving"] + : address.subType == AddressSubType.change + ? ["change"] + : null, ); id = MainDB.instance.putAddressLabelSync(label!); } @@ -67,106 +66,126 @@ class _AddressCardState extends State<AddressCard> { @override Widget build(BuildContext context) { return RoundedWhiteContainer( + onPressed: widget.onPressed, child: StreamBuilder<AddressLabel?>( - stream: stream, - builder: (context, snapshot) { - if (snapshot.hasData) { - label = snapshot.data!; - } + stream: stream, + builder: (context, snapshot) { + if (snapshot.hasData) { + label = snapshot.data!; + } - return Column( - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text( - label!.value, - style: STextStyles.itemSubtitle(context), - ), - CustomTextButton( - text: "Edit label", - textSize: 14, - onTap: () { - Navigator.of(context).pushNamed( - EditAddressLabelView.routeName, - arguments: label!.id, - ); - }, - ), - ], + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + if (label!.value.isNotEmpty) + Text( + label!.value, + style: STextStyles.itemSubtitle(context), + textAlign: TextAlign.left, ), + // Row( + // mainAxisAlignment: MainAxisAlignment.spaceBetween, + // children: [ + // + // CustomTextButton( + // text: "Edit label", + // textSize: 14, + // onTap: () { + // Navigator.of(context).pushNamed( + // EditAddressLabelView.routeName, + // arguments: label!.id, + // ); + // }, + // ), + // ], + // ), + if (label!.value.isNotEmpty) const SizedBox( height: 8, ), - Row( - children: [ - Expanded( - child: SelectableText( - address.value, - style: STextStyles.itemSubtitle12(context), - ), - ) - ], - ), - const SizedBox( - height: 10, - ), - Row( - children: [ - Expanded( - child: SecondaryButton( - label: "Copy address", - icon: CopyIcon( - color: Theme.of(context) - .extension<StackColors>()! - .buttonTextSecondary, + Row( + children: [ + Expanded( + child: Text( + address.value, + style: STextStyles.itemSubtitle12(context), + ), + ), + ], + ), + const SizedBox( + height: 10, + ), + + if (label!.tags != null && label!.tags!.isNotEmpty) + Wrap( + spacing: 10, + runSpacing: 10, + children: label!.tags! + .map( + (e) => AddressTag( + tag: e, ), - onPressed: () async { - await widget.clipboard.setData( - ClipboardData( - text: address.value, - ), - ); - if (mounted) { - unawaited( - showFloatingFlushBar( - type: FlushBarType.info, - message: "Copied to clipboard", - context: context, - ), - ); - } - }, - ), - ), - const SizedBox( - width: 12, - ), - Expanded( - child: SecondaryButton( - label: "Show QR Code", - icon: QrCodeIcon( - color: Theme.of(context) - .extension<StackColors>()! - .buttonTextSecondary, - ), - onPressed: () { - showDialog<void>( - context: context, - builder: (context) => AddressQrPopup( - addressString: address.value, - coin: widget.coin, - clipboard: widget.clipboard, - ), - ); - }, - ), - ), - ], - ) - ], - ); - }), + ) + .toList(), + ), + // Row( + // children: [ + // Expanded( + // child: SecondaryButton( + // label: "Copy address", + // icon: CopyIcon( + // color: Theme.of(context) + // .extension<StackColors>()! + // .buttonTextSecondary, + // ), + // onPressed: () async { + // await widget.clipboard.setData( + // ClipboardData( + // text: address.value, + // ), + // ); + // if (mounted) { + // unawaited( + // showFloatingFlushBar( + // type: FlushBarType.info, + // message: "Copied to clipboard", + // context: context, + // ), + // ); + // } + // }, + // ), + // ), + // const SizedBox( + // width: 12, + // ), + // Expanded( + // child: SecondaryButton( + // label: "Show QR Code", + // icon: QrCodeIcon( + // color: Theme.of(context) + // .extension<StackColors>()! + // .buttonTextSecondary, + // ), + // onPressed: () { + // showDialog<void>( + // context: context, + // builder: (context) => AddressQrPopup( + // addressString: address.value, + // coin: widget.coin, + // clipboard: widget.clipboard, + // ), + // ); + // }, + // ), + // ), + // ], + // ) + ], + ); + }, + ), ); } } diff --git a/lib/pages/receive_view/addresses/address_details_view.dart b/lib/pages/receive_view/addresses/address_details_view.dart new file mode 100644 index 000000000..1ddf2f666 --- /dev/null +++ b/lib/pages/receive_view/addresses/address_details_view.dart @@ -0,0 +1,350 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:isar/isar.dart'; +import 'package:qr_flutter/qr_flutter.dart'; +import 'package:stackwallet/db/main_db.dart'; +import 'package:stackwallet/models/isar/models/isar_models.dart'; +import 'package:stackwallet/pages/receive_view/addresses/address_tag.dart'; +import 'package:stackwallet/pages/wallet_view/sub_widgets/no_transactions_found.dart'; +import 'package:stackwallet/providers/global/wallets_provider.dart'; +import 'package:stackwallet/utilities/address_utils.dart'; +import 'package:stackwallet/utilities/text_styles.dart'; +import 'package:stackwallet/utilities/theme/stack_colors.dart'; +import 'package:stackwallet/utilities/util.dart'; +import 'package:stackwallet/widgets/background.dart'; +import 'package:stackwallet/widgets/conditional_parent.dart'; +import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart'; +import 'package:stackwallet/widgets/custom_buttons/simple_copy_button.dart'; +import 'package:stackwallet/widgets/custom_buttons/simple_edit_button.dart'; +import 'package:stackwallet/widgets/rounded_white_container.dart'; +import 'package:stackwallet/widgets/transaction_card.dart'; + +class AddressDetailsView extends ConsumerStatefulWidget { + const AddressDetailsView({ + Key? key, + required this.addressId, + required this.walletId, + }) : super(key: key); + + static const String routeName = "/addressDetailsView"; + + final Id addressId; + final String walletId; + + @override + ConsumerState<AddressDetailsView> createState() => _AddressDetailsViewState(); +} + +class _AddressDetailsViewState extends ConsumerState<AddressDetailsView> { + final _qrKey = GlobalKey(); + final isDesktop = Util.isDesktop; + + late Stream<AddressLabel?> stream; + late final Address address; + + AddressLabel? label; + + @override + void initState() { + address = MainDB.instance.isar.addresses + .where() + .idEqualTo(widget.addressId) + .findFirstSync()!; + + label = MainDB.instance.getAddressLabelSync(widget.walletId, address.value); + Id? id = label?.id; + if (id == null) { + label = AddressLabel( + walletId: widget.walletId, + addressString: address.value, + value: "", + tags: address.subType == AddressSubType.receiving + ? ["receiving"] + : address.subType == AddressSubType.change + ? ["change"] + : null, + ); + id = MainDB.instance.putAddressLabelSync(label!); + } + stream = MainDB.instance.watchAddressLabel(id: id); + + super.initState(); + } + + @override + Widget build(BuildContext context) { + final coin = ref.watch(walletsChangeNotifierProvider + .select((value) => value.getManager(widget.walletId).coin)); + final query = MainDB.instance + .getTransactions(widget.walletId) + .filter() + .address((q) => q.valueEqualTo(address.value)); + + return ConditionalParent( + condition: !isDesktop, + builder: (child) => Background( + child: Scaffold( + backgroundColor: + Theme.of(context).extension<StackColors>()!.background, + appBar: AppBar( + backgroundColor: + Theme.of(context).extension<StackColors>()!.backgroundAppBar, + leading: AppBarBackButton( + onPressed: () { + Navigator.of(context).pop(); + }, + ), + titleSpacing: 0, + title: Text( + "Wallet addresses", + style: STextStyles.navBarTitle(context), + ), + ), + body: SafeArea( + child: LayoutBuilder( + builder: (builderContext, constraints) { + return SingleChildScrollView( + child: ConstrainedBox( + constraints: BoxConstraints( + minHeight: constraints.maxHeight, + ), + child: Padding( + padding: const EdgeInsets.all(16), + child: child, + ), + ), + ); + }, + ), + ), + ), + ), + child: StreamBuilder<AddressLabel?>( + stream: stream, + builder: (context, snapshot) { + if (snapshot.hasData) { + label = snapshot.data!; + } + + return Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Center( + child: RepaintBoundary( + key: _qrKey, + child: QrImage( + data: AddressUtils.buildUriString( + coin, + address.value, + {}, + ), + size: 220, + backgroundColor: + Theme.of(context).extension<StackColors>()!.background, + foregroundColor: Theme.of(context) + .extension<StackColors>()! + .accentColorDark, + ), + ), + ), + const SizedBox( + height: 16, + ), + _Item( + title: "Address", + data: address.value, + button: SimpleCopyButton( + data: address.value, + ), + ), + const SizedBox( + height: 12, + ), + _Item( + title: "Label", + data: label!.value, + button: SimpleEditButton( + editValue: label!.value, + editLabel: 'label', + onValueChanged: (value) { + MainDB.instance.putAddressLabel( + label!.copyWith( + label: value, + ), + ); + }, + ), + ), + const SizedBox( + height: 12, + ), + _Tags( + tags: label!.tags, + ), + if (address.derivationPath != null) + const SizedBox( + height: 12, + ), + if (address.derivationPath != null) + _Item( + title: "Derivation path", + data: address.derivationPath!.value, + button: Container(), + ), + const SizedBox( + height: 12, + ), + _Item( + title: "Type", + data: address.type.readableName, + button: Container(), + ), + const SizedBox( + height: 12, + ), + _Item( + title: "Sub type", + data: address.subType.prettyName, + button: Container(), + ), + const SizedBox( + height: 20, + ), + Text( + "Transactions", + textAlign: TextAlign.left, + style: STextStyles.itemSubtitle(context).copyWith( + color: Theme.of(context).extension<StackColors>()!.textDark3, + ), + ), + const SizedBox( + height: 12, + ), + if (query.countSync() == 0) const NoTransActionsFound(), + if (query.countSync() > 0) + RoundedWhiteContainer( + padding: EdgeInsets.zero, + child: Column( + mainAxisSize: MainAxisSize.min, + children: query + .findAllSync() + .map((e) => TransactionCard( + transaction: e, walletId: widget.walletId)) + .toList(), + ), + ), + ], + ); + }, + ), + ); + } +} + +class _Tags extends StatelessWidget { + const _Tags({ + Key? key, + required this.tags, + }) : super(key: key); + + final List<String>? tags; + + @override + Widget build(BuildContext context) { + return RoundedWhiteContainer( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + "Tags", + style: STextStyles.itemSubtitle(context), + ), + Container(), + // SimpleEditButton( + // onPressedOverride: () { + // // TODO edit tags + // }, + // ), + ], + ), + const SizedBox( + height: 8, + ), + tags != null && tags!.isNotEmpty + ? Wrap( + spacing: 10, + runSpacing: 10, + children: tags! + .map( + (e) => AddressTag( + tag: e, + ), + ) + .toList(), + ) + : Text( + "Tags will appear here", + style: STextStyles.w500_14(context).copyWith( + color: Theme.of(context) + .extension<StackColors>()! + .textSubtitle3, + ), + ), + ], + ), + ); + } +} + +class _Item extends StatelessWidget { + const _Item({ + Key? key, + required this.title, + required this.data, + required this.button, + }) : super(key: key); + + final String title; + final String data; + final Widget button; + + @override + Widget build(BuildContext context) { + return RoundedWhiteContainer( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + title, + style: STextStyles.itemSubtitle(context), + ), + button, + ], + ), + const SizedBox( + height: 5, + ), + data.isNotEmpty + ? SelectableText( + data, + style: STextStyles.w500_14(context), + ) + : Text( + "$title will appear here", + style: STextStyles.w500_14(context).copyWith( + color: Theme.of(context) + .extension<StackColors>()! + .textSubtitle3, + ), + ), + ], + ), + ); + } +} diff --git a/lib/pages/receive_view/addresses/address_tag.dart b/lib/pages/receive_view/addresses/address_tag.dart new file mode 100644 index 000000000..df03dc405 --- /dev/null +++ b/lib/pages/receive_view/addresses/address_tag.dart @@ -0,0 +1,26 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_native_splash/cli_commands.dart'; +import 'package:stackwallet/utilities/text_styles.dart'; +import 'package:stackwallet/widgets/rounded_container.dart'; + +class AddressTag extends StatelessWidget { + const AddressTag({Key? key, required this.tag}) : super(key: key); + + final String tag; + + @override + Widget build(BuildContext context) { + return RoundedContainer( + radiusMultiplier: 0.5, + padding: const EdgeInsets.symmetric( + vertical: 5, + horizontal: 7, + ), + color: Colors.black, + child: Text( + tag.capitalize(), + style: STextStyles.w500_14(context), + ), + ); + } +} diff --git a/lib/pages/receive_view/addresses/wallet_addresses_view.dart b/lib/pages/receive_view/addresses/wallet_addresses_view.dart index dad379988..be1ded23a 100644 --- a/lib/pages/receive_view/addresses/wallet_addresses_view.dart +++ b/lib/pages/receive_view/addresses/wallet_addresses_view.dart @@ -1,9 +1,11 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter_svg/svg.dart'; import 'package:isar/isar.dart'; import 'package:stackwallet/db/isar/main_db.dart'; import 'package:stackwallet/models/isar/models/isar_models.dart'; import 'package:stackwallet/pages/receive_view/addresses/address_card.dart'; +import 'package:stackwallet/pages/receive_view/addresses/address_details_view.dart'; import 'package:stackwallet/providers/global/wallets_provider.dart'; import 'package:stackwallet/utilities/constants.dart'; import 'package:stackwallet/utilities/text_styles.dart'; @@ -13,7 +15,12 @@ import 'package:stackwallet/widgets/background.dart'; import 'package:stackwallet/widgets/conditional_parent.dart'; import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart'; import 'package:stackwallet/widgets/loading_indicator.dart'; -import 'package:stackwallet/widgets/toggle.dart'; +import 'package:stackwallet/widgets/stack_text_field.dart'; +import 'package:tuple/tuple.dart'; + +import '../../../utilities/assets.dart'; +import '../../../widgets/icon_widgets/x_icon.dart'; +import '../../../widgets/textfield_icon_button.dart'; class WalletAddressesView extends ConsumerStatefulWidget { const WalletAddressesView({ @@ -33,7 +40,88 @@ class WalletAddressesView extends ConsumerStatefulWidget { class _WalletAddressesViewState extends ConsumerState<WalletAddressesView> { final bool isDesktop = Util.isDesktop; - bool _showChange = false; + String _searchString = ""; + + late final TextEditingController _searchController; + final searchFieldFocusNode = FocusNode(); + + Future<List<int>> _search(String term) async { + if (term.isEmpty) { + return MainDB.instance + .getAddresses(widget.walletId) + .filter() + .group((q) => q + .subTypeEqualTo(AddressSubType.change) + .or() + .subTypeEqualTo(AddressSubType.receiving) + .or() + .subTypeEqualTo(AddressSubType.paynymReceive) + .or() + .subTypeEqualTo(AddressSubType.paynymNotification)) + .and() + .not() + .typeEqualTo(AddressType.nonWallet) + .sortByDerivationIndex() + .idProperty() + .findAll(); + } + + final labels = await MainDB.instance + .getAddressLabels(widget.walletId) + .filter() + .group( + (q) => q + .valueContains(term, caseSensitive: false) + .or() + .addressStringContains(term, caseSensitive: false) + .or() + .group( + (q) => q + .tagsIsNotNull() + .and() + .tagsElementContains(term, caseSensitive: false), + ), + ) + .findAll(); + + if (labels.isEmpty) { + return []; + } + + return MainDB.instance + .getAddresses(widget.walletId) + .filter() + .anyOf<AddressLabel, Address>( + labels, (q, e) => q.valueEqualTo(e.addressString)) + .group((q) => q + .subTypeEqualTo(AddressSubType.change) + .or() + .subTypeEqualTo(AddressSubType.receiving) + .or() + .subTypeEqualTo(AddressSubType.paynymReceive) + .or() + .subTypeEqualTo(AddressSubType.paynymNotification)) + .and() + .not() + .typeEqualTo(AddressType.nonWallet) + .sortByDerivationIndex() + .idProperty() + .findAll(); + } + + @override + void initState() { + _searchController = TextEditingController(); + + super.initState(); + } + + @override + void dispose() { + _searchController.dispose(); + searchFieldFocusNode.dispose(); + super.dispose(); + } @override Widget build(BuildContext context) { @@ -68,26 +156,66 @@ class _WalletAddressesViewState extends ConsumerState<WalletAddressesView> { child: Column( children: [ SizedBox( - height: isDesktop ? 56 : 48, width: isDesktop ? 490 : null, - child: Toggle( - key: UniqueKey(), - onColor: Theme.of(context).extension<StackColors>()!.popupBG, - onText: "Receiving", - offColor: Theme.of(context) - .extension<StackColors>()! - .textFieldDefaultBG, - offText: "Change", - isOn: _showChange, - onValueChanged: (value) { - setState(() { - _showChange = value; - }); - }, - decoration: BoxDecoration( - color: Colors.transparent, - borderRadius: BorderRadius.circular( - Constants.size.circularBorderRadius, + child: ClipRRect( + borderRadius: BorderRadius.circular( + Constants.size.circularBorderRadius, + ), + child: TextField( + autocorrect: !isDesktop, + enableSuggestions: !isDesktop, + controller: _searchController, + focusNode: searchFieldFocusNode, + onChanged: (value) { + setState(() { + _searchString = value; + }); + }, + style: isDesktop + ? STextStyles.desktopTextExtraSmall(context).copyWith( + color: Theme.of(context) + .extension<StackColors>()! + .textFieldActiveText, + height: 1.8, + ) + : STextStyles.field(context), + decoration: standardInputDecoration( + "Search...", + searchFieldFocusNode, + context, + desktopMed: isDesktop, + ).copyWith( + prefixIcon: Padding( + padding: EdgeInsets.symmetric( + horizontal: isDesktop ? 12 : 10, + vertical: isDesktop ? 18 : 16, + ), + child: SvgPicture.asset( + Assets.svg.search, + width: isDesktop ? 20 : 16, + height: isDesktop ? 20 : 16, + ), + ), + suffixIcon: _searchController.text.isNotEmpty + ? Padding( + padding: const EdgeInsets.only(right: 0), + child: UnconstrainedBox( + child: Row( + children: [ + TextFieldIconButton( + child: const XIcon(), + onTap: () async { + setState(() { + _searchController.text = ""; + _searchString = ""; + }); + }, + ), + ], + ), + ), + ) + : null, ), ), ), @@ -97,23 +225,7 @@ class _WalletAddressesViewState extends ConsumerState<WalletAddressesView> { ), Expanded( child: FutureBuilder( - future: MainDB.instance - .getAddresses(widget.walletId) - .filter() - .group( - (q) => _showChange - ? q.subTypeEqualTo(AddressSubType.change) - : q - .subTypeEqualTo(AddressSubType.receiving) - .or() - .subTypeEqualTo(AddressSubType.paynymReceive), - ) - .and() - .not() - .typeEqualTo(AddressType.nonWallet) - .sortByDerivationIndex() - .idProperty() - .findAll(), + future: _search(_searchString), builder: (context, AsyncSnapshot<List<int>> snapshot) { if (snapshot.connectionState == ConnectionState.done && snapshot.data != null) { @@ -127,6 +239,15 @@ class _WalletAddressesViewState extends ConsumerState<WalletAddressesView> { walletId: widget.walletId, addressId: snapshot.data![index], coin: coin, + onPressed: () { + Navigator.of(context).pushNamed( + AddressDetailsView.routeName, + arguments: Tuple2( + snapshot.data![index], + widget.walletId, + ), + ); + }, ), ); } else { diff --git a/lib/pages/send_view/send_view.dart b/lib/pages/send_view/send_view.dart index c7c63bac7..508b9d6cc 100644 --- a/lib/pages/send_view/send_view.dart +++ b/lib/pages/send_view/send_view.dart @@ -588,7 +588,7 @@ class _SendViewState extends ConsumerState<SendView> { cryptoAmountController.text = _data!.amount!.toString(); } sendToController.text = _data!.contactLabel; - _address = _data!.address; + _address = _data!.address.trim(); _addressToggleFlag = true; } @@ -689,7 +689,7 @@ class _SendViewState extends ConsumerState<SendView> { // add listener for epic cash to strip http:// and https:// prefixes if the address also ocntains an @ symbol (indicating an epicbox address) if (coin == Coin.epicCash) { sendToController.addListener(() { - _address = sendToController.text; + _address = sendToController.text.trim(); if (_address != null && _address!.isNotEmpty) { _address = _address!.trim(); @@ -956,7 +956,7 @@ class _SendViewState extends ConsumerState<SendView> { selectAll: false, ), onChanged: (newValue) { - _address = newValue; + _address = newValue.trim(); _updatePreviewButtonState( _address, _amountToSend); @@ -1032,8 +1032,8 @@ class _SendViewState extends ConsumerState<SendView> { content); } sendToController.text = - content; - _address = content; + content.trim(); + _address = content.trim(); _updatePreviewButtonState( _address, @@ -1112,8 +1112,9 @@ class _SendViewState extends ConsumerState<SendView> { coin.uriScheme) { // auto fill address _address = - results["address"] ?? - ""; + (results["address"] ?? + "") + .trim(); sendToController.text = _address!; @@ -1168,8 +1169,9 @@ class _SendViewState extends ConsumerState<SendView> { .getManager(walletId) .validateAddress(qrResult .rawContent)) { - _address = - qrResult.rawContent; + _address = qrResult + .rawContent + .trim(); sendToController.text = _address ?? ""; diff --git a/lib/pages/send_view/sub_widgets/building_transaction_dialog.dart b/lib/pages/send_view/sub_widgets/building_transaction_dialog.dart index 6915493d5..8bd800cad 100644 --- a/lib/pages/send_view/sub_widgets/building_transaction_dialog.dart +++ b/lib/pages/send_view/sub_widgets/building_transaction_dialog.dart @@ -57,6 +57,11 @@ class _RestoringDialogState extends State<BuildingTransactionDialog> @override Widget build(BuildContext context) { + final isChans = Theme.of(context).extension<StackColors>()!.themeType == + ThemeType.chan || + Theme.of(context).extension<StackColors>()!.themeType == + ThemeType.darkChans; + if (Util.isDesktop) { return Column( mainAxisSize: MainAxisSize.min, @@ -68,15 +73,13 @@ class _RestoringDialogState extends State<BuildingTransactionDialog> const SizedBox( height: 40, ), - if (Theme.of(context).extension<StackColors>()!.themeType == - ThemeType.chan) + if (isChans) Image( image: AssetImage( Assets.gif.kiss(widget.coin), ), ), - if (Theme.of(context).extension<StackColors>()!.themeType != - ThemeType.chan) + if (!isChans) RotationTransition( turns: _spinAnimation, child: SvgPicture.asset( @@ -104,8 +107,7 @@ class _RestoringDialogState extends State<BuildingTransactionDialog> onWillPop: () async { return false; }, - child: Theme.of(context).extension<StackColors>()!.themeType == - ThemeType.chan + child: isChans ? StackDialogBase( child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, diff --git a/lib/pages/send_view/sub_widgets/sending_transaction_dialog.dart b/lib/pages/send_view/sub_widgets/sending_transaction_dialog.dart index 3d9928c34..7c318a517 100644 --- a/lib/pages/send_view/sub_widgets/sending_transaction_dialog.dart +++ b/lib/pages/send_view/sub_widgets/sending_transaction_dialog.dart @@ -51,6 +51,11 @@ class _RestoringDialogState extends State<SendingTransactionDialog> @override Widget build(BuildContext context) { + final isChans = Theme.of(context).extension<StackColors>()!.themeType == + ThemeType.chan || + Theme.of(context).extension<StackColors>()!.themeType == + ThemeType.darkChans; + if (Util.isDesktop) { return DesktopDialog( child: Padding( @@ -65,8 +70,7 @@ class _RestoringDialogState extends State<SendingTransactionDialog> const SizedBox( height: 40, ), - Theme.of(context).extension<StackColors>()!.themeType == - ThemeType.chan + isChans ? Image( image: AssetImage( Assets.gif.kiss(widget.coin), @@ -92,8 +96,7 @@ class _RestoringDialogState extends State<SendingTransactionDialog> onWillPop: () async { return false; }, - child: Theme.of(context).extension<StackColors>()!.themeType == - ThemeType.chan + child: isChans ? StackDialogBase( child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, diff --git a/lib/pages/settings_views/global_settings_view/appearance_settings_view.dart b/lib/pages/settings_views/global_settings_view/appearance_settings_view.dart index 8b4d5b1aa..adde8eb4a 100644 --- a/lib/pages/settings_views/global_settings_view/appearance_settings_view.dart +++ b/lib/pages/settings_views/global_settings_view/appearance_settings_view.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:stackwallet/db/hive/db.dart'; +import 'package:flutter_svg/flutter_svg.dart'; import 'package:stackwallet/providers/providers.dart'; import 'package:stackwallet/providers/ui/color_theme_provider.dart'; import 'package:stackwallet/utilities/assets.dart'; @@ -11,7 +12,10 @@ import 'package:stackwallet/utilities/theme/stack_colors.dart'; import 'package:stackwallet/widgets/background.dart'; import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart'; import 'package:stackwallet/widgets/custom_buttons/draggable_switch_button.dart'; +import 'package:stackwallet/widgets/expandable.dart'; +import 'package:stackwallet/widgets/rounded_container.dart'; import 'package:stackwallet/widgets/rounded_white_container.dart'; +import 'package:tuple/tuple.dart'; class AppearanceSettingsView extends ConsumerWidget { const AppearanceSettingsView({Key? key}) : super(key: key); @@ -101,43 +105,56 @@ class AppearanceSettingsView extends ConsumerWidget { const SizedBox( height: 10, ), - RoundedWhiteContainer( - padding: const EdgeInsets.all(0), - child: RawMaterialButton( - // splashColor: Theme.of(context).extension<StackColors>()!.highlight, + const SystemBrightnessToggle(), + if (!ref.watch( + prefsChangeNotifierProvider + .select((value) => value.enableSystemBrightness), + )) + const SizedBox( + height: 10, + ), + if (!ref.watch( + prefsChangeNotifierProvider + .select((value) => value.enableSystemBrightness), + )) + RoundedWhiteContainer( padding: const EdgeInsets.all(0), - materialTapTargetSize: - MaterialTapTargetSize.shrinkWrap, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular( - Constants.size.circularBorderRadius, + child: RawMaterialButton( + // splashColor: Theme.of(context).extension<StackColors>()!.highlight, + padding: const EdgeInsets.all(0), + materialTapTargetSize: + MaterialTapTargetSize.shrinkWrap, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular( + Constants.size.circularBorderRadius, + ), ), - ), - onPressed: null, - child: Padding( - padding: const EdgeInsets.all(12), - child: Row( - children: [ - Column( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Text( - "Choose Theme", - style: STextStyles.titleBold12(context), - textAlign: TextAlign.left, - ), - const Padding( - padding: EdgeInsets.all(10), - child: ThemeOptionsView(), - ), - ], - ), - ], + onPressed: null, + child: Padding( + padding: const EdgeInsets.all(12), + child: Row( + children: [ + Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Text( + "Choose Theme", + style: + STextStyles.titleBold12(context), + textAlign: TextAlign.left, + ), + const Padding( + padding: EdgeInsets.all(10), + child: ThemeOptionsView(), + ), + ], + ), + ], + ), ), ), ), - ), ], ), ), @@ -151,6 +168,238 @@ class AppearanceSettingsView extends ConsumerWidget { } } +class SystemBrightnessToggle extends ConsumerStatefulWidget { + const SystemBrightnessToggle({Key? key}) : super(key: key); + + @override + ConsumerState<SystemBrightnessToggle> createState() => + _SystemBrightnessToggleState(); +} + +class _SystemBrightnessToggleState + extends ConsumerState<SystemBrightnessToggle> { + final controller = ExpandableController(); + + void _toggle(bool enable) { + ref.read(prefsChangeNotifierProvider).enableSystemBrightness = enable; + + if (enable && controller.state == ExpandableState.collapsed) { + controller.toggle?.call(); + } else if (!enable && controller.state == ExpandableState.expanded) { + controller.toggle?.call(); + } + + if (enable) { + final ThemeType type; + switch (MediaQuery.of(context).platformBrightness) { + case Brightness.dark: + type = ref + .read(prefsChangeNotifierProvider.notifier) + .systemBrightnessDarkTheme; + break; + case Brightness.light: + type = ref + .read(prefsChangeNotifierProvider.notifier) + .systemBrightnessLightTheme; + break; + } + ref.read(colorThemeProvider.notifier).state = + StackColors.fromStackColorTheme( + type.colorTheme, + ); + } else { + ref.read(prefsChangeNotifierProvider.notifier).theme = + ref.read(colorThemeProvider.notifier).state.themeType; + } + } + + @override + void initState() { + if (ref.read(prefsChangeNotifierProvider).enableSystemBrightness) { + WidgetsBinding.instance.addPostFrameCallback((_) { + controller.toggle?.call(); + }); + } + super.initState(); + } + + @override + Widget build(BuildContext context) { + final enable = ref.watch( + prefsChangeNotifierProvider + .select((value) => value.enableSystemBrightness), + ); + + return RoundedWhiteContainer( + child: Expandable( + controller: controller, + expandOverride: () { + _toggle( + !ref.read(prefsChangeNotifierProvider).enableSystemBrightness); + }, + header: RawMaterialButton( + splashColor: Theme.of(context).extension<StackColors>()!.highlight, + materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular( + Constants.size.circularBorderRadius, + ), + ), + onPressed: null, + child: Padding( + padding: const EdgeInsets.symmetric(vertical: 8), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + "System brightness", + style: STextStyles.titleBold12(context), + textAlign: TextAlign.left, + ), + SizedBox( + key: Key("${enable}enableSystemBrightnessToggleKey"), + height: 20, + width: 40, + child: DraggableSwitchButton( + isOn: enable, + onValueChanged: _toggle, + ), + ) + ], + ), + ), + ), + body: Column( + children: [ + RoundedContainer( + color: Colors.transparent, + padding: EdgeInsets.zero, + onPressed: () async { + final result = await Navigator.of(context).pushNamed( + SystemBrightnessThemeSelectionView.routeName, + arguments: Tuple2( + "light", + ref + .read(prefsChangeNotifierProvider) + .systemBrightnessLightTheme), + ); + if (result is ThemeType) { + ref + .read(prefsChangeNotifierProvider) + .systemBrightnessLightTheme = result; + if (ref + .read(prefsChangeNotifierProvider) + .enableSystemBrightness) { + if (mounted && + MediaQuery.of(context).platformBrightness == + Brightness.light) { + ref.read(colorThemeProvider.notifier).state = + StackColors.fromStackColorTheme(result.colorTheme); + } + } + } + }, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "Light theme", + style: STextStyles.itemSubtitle(context), + ), + const SizedBox( + height: 2, + ), + Text( + ref + .watch( + prefsChangeNotifierProvider.select((value) => + value.systemBrightnessLightTheme), + ) + .prettyName, + style: STextStyles.itemSubtitle12(context), + ), + ], + ), + ), + SvgPicture.asset( + Assets.svg.chevronRight, + color: Theme.of(context).extension<StackColors>()!.textDark, + ), + ], + ), + ), + RoundedContainer( + color: Colors.transparent, + padding: EdgeInsets.zero, + onPressed: () async { + final result = await Navigator.of(context).pushNamed( + SystemBrightnessThemeSelectionView.routeName, + arguments: Tuple2( + "dark", + ref + .read(prefsChangeNotifierProvider) + .systemBrightnessDarkTheme), + ); + if (result is ThemeType) { + ref + .read(prefsChangeNotifierProvider) + .systemBrightnessDarkTheme = result; + if (ref + .read(prefsChangeNotifierProvider) + .enableSystemBrightness) { + if (mounted && + MediaQuery.of(context).platformBrightness == + Brightness.dark) { + ref.read(colorThemeProvider.notifier).state = + StackColors.fromStackColorTheme(result.colorTheme); + } + } + } + }, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "Dark theme", + style: STextStyles.itemSubtitle(context), + ), + const SizedBox( + height: 2, + ), + Text( + ref.watch( + prefsChangeNotifierProvider.select((value) => + value.systemBrightnessDarkTheme.prettyName), + ), + style: STextStyles.itemSubtitle12(context), + ), + ], + ), + ), + SvgPicture.asset( + Assets.svg.chevronRight, + color: Theme.of(context).extension<StackColors>()!.textDark, + ), + ], + ), + ) + ], + ), + ), + ); + } +} + class ThemeOptionsView extends ConsumerWidget { const ThemeOptionsView({Key? key}) : super(key: key); @@ -165,12 +414,9 @@ class ThemeOptionsView extends ConsumerWidget { ) : ThemeOption( onPressed: () { - DB.instance.put<dynamic>( - boxName: DB.boxNameTheme, - key: "colorScheme", - value: ThemeType.values[i ~/ 2].name, - ); - ref.read(colorThemeProvider.state).state = + ref.read(prefsChangeNotifierProvider.notifier).theme = + ThemeType.values[i ~/ 2]; + ref.read(colorThemeProvider.notifier).state = StackColors.fromStackColorTheme( ThemeType.values[i ~/ 2].colorTheme, ); @@ -178,12 +424,9 @@ class ThemeOptionsView extends ConsumerWidget { }, onChanged: (newValue) { if (newValue == ThemeType.values[i ~/ 2]) { - DB.instance.put<dynamic>( - boxName: DB.boxNameTheme, - key: "colorScheme", - value: ThemeType.values[i ~/ 2].name, - ); - ref.read(colorThemeProvider.state).state = + ref.read(prefsChangeNotifierProvider.notifier).theme = + ThemeType.values[i ~/ 2]; + ref.read(colorThemeProvider.notifier).state = StackColors.fromStackColorTheme( ThemeType.values[i ~/ 2].colorTheme, ); @@ -263,3 +506,124 @@ class ThemeOption extends StatelessWidget { ); } } + +class SystemBrightnessThemeSelectionView extends StatelessWidget { + const SystemBrightnessThemeSelectionView({ + Key? key, + required this.brightness, + required this.current, + }) : super(key: key); + + final String brightness; + final ThemeType current; + + static const String routeName = "/chooseSystemTheme"; + + @override + Widget build(BuildContext context) { + return Background( + child: Scaffold( + backgroundColor: Theme.of(context).extension<StackColors>()!.background, + appBar: AppBar( + leading: AppBarBackButton( + onPressed: () async { + Navigator.of(context).pop(); + }, + ), + title: Text( + "Choose $brightness theme", + style: STextStyles.navBarTitle(context), + ), + ), + body: Padding( + padding: const EdgeInsets.all(16), + child: LayoutBuilder( + builder: (context, constraints) { + return SingleChildScrollView( + child: ConstrainedBox( + constraints: BoxConstraints( + minHeight: constraints.maxHeight, + ), + child: IntrinsicHeight( + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + RoundedWhiteContainer( + padding: const EdgeInsets.all(0), + child: RawMaterialButton( + // splashColor: Theme.of(context).extension<StackColors>()!.highlight, + padding: const EdgeInsets.all(0), + materialTapTargetSize: + MaterialTapTargetSize.shrinkWrap, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular( + Constants.size.circularBorderRadius, + ), + ), + onPressed: null, + child: Padding( + padding: const EdgeInsets.all(12), + child: Row( + children: [ + Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.all(10), + child: Column( + children: [ + for (int i = 0; + i < + (2 * + ThemeType.values + .length) - + 1; + i++) + (i % 2 == 1) + ? const SizedBox( + height: 10, + ) + : ThemeOption( + onPressed: () { + Navigator.of(context) + .pop(ThemeType + .values[ + i ~/ 2]); + }, + onChanged: (newValue) { + if (newValue == + ThemeType.values[ + i ~/ 2]) { + Navigator.of(context) + .pop(ThemeType + .values[ + i ~/ 2]); + } + }, + value: ThemeType + .values[i ~/ 2], + groupValue: current, + ), + ], + ), + ), + ], + ), + ], + ), + ), + ), + ), + ], + ), + ), + ), + ); + }, + ), + ), + ), + ); + } +} diff --git a/lib/pages/settings_views/global_settings_view/startup_preferences/startup_preferences_view.dart b/lib/pages/settings_views/global_settings_view/startup_preferences/startup_preferences_view.dart index 186b9b293..c6e26c4b8 100644 --- a/lib/pages/settings_views/global_settings_view/startup_preferences/startup_preferences_view.dart +++ b/lib/pages/settings_views/global_settings_view/startup_preferences/startup_preferences_view.dart @@ -1,7 +1,9 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter_svg/flutter_svg.dart'; import 'package:stackwallet/pages/settings_views/global_settings_view/startup_preferences/startup_wallet_selection_view.dart'; -import 'package:stackwallet/providers/global/prefs_provider.dart'; +import 'package:stackwallet/providers/providers.dart'; +import 'package:stackwallet/utilities/assets.dart'; import 'package:stackwallet/utilities/constants.dart'; import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/theme/stack_colors.dart'; @@ -21,6 +23,31 @@ class StartupPreferencesView extends ConsumerStatefulWidget { class _StartupPreferencesViewState extends ConsumerState<StartupPreferencesView> { + bool safe = true; + + @override + void initState() { + final possibleWalletId = + ref.read(prefsChangeNotifierProvider).startupWalletId; + + // check if wallet exists (hasn't been deleted or otherwise missing) + if (possibleWalletId != null) { + try { + ref.read(walletsChangeNotifierProvider).getManager(possibleWalletId); + } catch (_) { + safe = false; + WidgetsBinding.instance.addPostFrameCallback((timeStamp) { + ref.read(prefsChangeNotifierProvider).startupWalletId = null; + setState(() { + safe = true; + }); + }); + } + } + + super.initState(); + } + @override Widget build(BuildContext context) { return Background( @@ -195,13 +222,73 @@ class _StartupPreferencesViewState context), textAlign: TextAlign.left, ), - Text( - "Select a specific wallet to load into on startup", - style: - STextStyles.itemSubtitle( - context), - textAlign: TextAlign.left, - ), + (safe && + ref.watch( + prefsChangeNotifierProvider + .select((value) => + value + .startupWalletId), + ) != + null) + ? Padding( + padding: + const EdgeInsets + .only(top: 12), + child: Row( + children: [ + SvgPicture.asset( + Assets.svg + .iconFor( + coin: ref + .watch( + walletsChangeNotifierProvider + .select( + (value) => + value.getManager( + ref.watch( + prefsChangeNotifierProvider.select((value) => + value.startupWalletId!), + ), + ), + ), + ) + .coin, + ), + ), + const SizedBox( + width: 10, + ), + Text( + ref + .watch( + walletsChangeNotifierProvider + .select( + (value) => + value + .getManager( + ref.watch( + prefsChangeNotifierProvider.select((value) => + value.startupWalletId!), + ), + ), + ), + ) + .walletName, + style: STextStyles + .itemSubtitle( + context), + ), + ], + ), + ) + : Text( + "Select a specific wallet to load into on startup", + style: STextStyles + .itemSubtitle( + context), + textAlign: + TextAlign.left, + ), ], ), ), diff --git a/lib/pages_desktop_specific/settings/settings_menu/appearance_settings.dart b/lib/pages_desktop_specific/settings/settings_menu/appearance_settings.dart index 014093f56..f3250fe23 100644 --- a/lib/pages_desktop_specific/settings/settings_menu/appearance_settings.dart +++ b/lib/pages_desktop_specific/settings/settings_menu/appearance_settings.dart @@ -112,6 +112,44 @@ class _AppearanceOptionSettings ], ), ), + // const Padding( + // padding: EdgeInsets.all(10.0), + // child: Divider( + // thickness: 0.5, + // ), + // ), + // Padding( + // padding: const EdgeInsets.all(10.0), + // child: Row( + // mainAxisAlignment: MainAxisAlignment.spaceBetween, + // children: [ + // Text( + // "System brightness", + // style: STextStyles.desktopTextExtraSmall(context) + // .copyWith( + // color: Theme.of(context) + // .extension<StackColors>()! + // .textDark), + // textAlign: TextAlign.left, + // ), + // SizedBox( + // height: 20, + // width: 40, + // child: DraggableSwitchButton( + // isOn: ref.watch( + // prefsChangeNotifierProvider.select( + // (value) => value.enableSystemBrightness), + // ), + // onValueChanged: (newValue) { + // ref + // .read(prefsChangeNotifierProvider) + // .enableSystemBrightness = newValue; + // }, + // ), + // ) + // ], + // ), + // ), const Padding( padding: EdgeInsets.all(10.0), child: Divider( @@ -166,6 +204,8 @@ class _ThemeToggle extends ConsumerState<ThemeToggle> { return Assets.svg.themeLight; case ThemeType.dark: return Assets.svg.themeDark; + case ThemeType.darkChans: + return Assets.svg.themeDarkChan; case ThemeType.oceanBreeze: return Assets.svg.themeOcean; case ThemeType.oledBlack: @@ -192,14 +232,12 @@ class _ThemeToggle extends ConsumerState<ThemeToggle> { cursor: SystemMouseCursors.click, child: GestureDetector( onTap: () { - if (ref.read(colorThemeProvider.state).state.themeType != + if (ref.read(colorThemeProvider.notifier).state.themeType != ThemeType.values[i]) { - DB.instance.put<dynamic>( - boxName: DB.boxNameTheme, - key: "colorScheme", - value: ThemeType.values[i].name, - ); - ref.read(colorThemeProvider.state).state = + ref.read(prefsChangeNotifierProvider.notifier).theme = + ThemeType.values[i]; + + ref.read(colorThemeProvider.notifier).state = StackColors.fromStackColorTheme( ThemeType.values[i].colorTheme); } @@ -215,7 +253,7 @@ class _ThemeToggle extends ConsumerState<ThemeToggle> { border: Border.all( width: 2.5, color: ref - .read(colorThemeProvider.state) + .read(colorThemeProvider.notifier) .state .themeType == ThemeType.values[i] diff --git a/lib/route_generator.dart b/lib/route_generator.dart index a6e69f8d6..7903b1796 100644 --- a/lib/route_generator.dart +++ b/lib/route_generator.dart @@ -51,6 +51,7 @@ import 'package:stackwallet/pages/paynym/add_new_paynym_follow_view.dart'; import 'package:stackwallet/pages/paynym/paynym_claim_view.dart'; import 'package:stackwallet/pages/paynym/paynym_home_view.dart'; import 'package:stackwallet/pages/pinpad_views/create_pin_view.dart'; +import 'package:stackwallet/pages/receive_view/addresses/address_details_view.dart'; import 'package:stackwallet/pages/receive_view/addresses/edit_address_label_view.dart'; import 'package:stackwallet/pages/receive_view/addresses/wallet_addresses_view.dart'; import 'package:stackwallet/pages/receive_view/generate_receiving_uri_qr_code_view.dart'; @@ -139,6 +140,7 @@ import 'package:stackwallet/services/event_bus/events/global/node_connection_sta import 'package:stackwallet/services/event_bus/events/global/wallet_sync_status_changed_event.dart'; import 'package:stackwallet/utilities/enums/add_wallet_type_enum.dart'; import 'package:stackwallet/utilities/enums/coin_enum.dart'; +import 'package:stackwallet/utilities/theme/color_theme.dart'; import 'package:tuple/tuple.dart'; class RouteGenerator { @@ -684,6 +686,21 @@ class RouteGenerator { } return _routeError("${settings.name} invalid args: ${args.toString()}"); + case SystemBrightnessThemeSelectionView.routeName: + if (args is Tuple2<String, ThemeType>) { + return getRoute( + shouldUseMaterialRoute: useMaterialPageRoute, + builder: (_) => SystemBrightnessThemeSelectionView( + brightness: args.item1, + current: args.item2, + ), + settings: RouteSettings( + name: settings.name, + ), + ); + } + return _routeError("${settings.name} invalid args: ${args.toString()}"); + case WalletNetworkSettingsView.routeName: if (args is Tuple3<String, WalletSyncStatus, NodeConnectionStatus>) { return getRoute( @@ -956,6 +973,21 @@ class RouteGenerator { } return _routeError("${settings.name} invalid args: ${args.toString()}"); + case AddressDetailsView.routeName: + if (args is Tuple2<Id, String>) { + return getRoute( + shouldUseMaterialRoute: useMaterialPageRoute, + builder: (_) => AddressDetailsView( + walletId: args.item2, + addressId: args.item1, + ), + settings: RouteSettings( + name: settings.name, + ), + ); + } + return _routeError("${settings.name} invalid args: ${args.toString()}"); + case SendView.routeName: if (args is Tuple2<String, Coin>) { return getRoute( diff --git a/lib/services/coins/bitcoin/bitcoin_wallet.dart b/lib/services/coins/bitcoin/bitcoin_wallet.dart index d3a1e8495..ed969bf5d 100644 --- a/lib/services/coins/bitcoin/bitcoin_wallet.dart +++ b/lib/services/coins/bitcoin/bitcoin_wallet.dart @@ -1842,6 +1842,7 @@ class BitcoinWallet extends CoinServiceAPI bool shouldBlock = false; String? blockReason; + String? label; if (storedTx?.subType == isar_models.TransactionSubType.bip47Notification) { @@ -1849,10 +1850,11 @@ class BitcoinWallet extends CoinServiceAPI shouldBlock = true; blockReason = "Incoming paynym notification transaction."; } else if (storedTx?.type == isar_models.TransactionType.outgoing) { - shouldBlock = true; + shouldBlock = false; blockReason = "Paynym notification change output. Incautious " "handling of change outputs from notification transactions " "may cause unintended loss of privacy."; + label = blockReason; } } @@ -1875,7 +1877,7 @@ class BitcoinWallet extends CoinServiceAPI txid: txn["txid"] as String, vout: vout, value: jsonUTXO["value"] as int, - name: "", + name: label ?? "", isBlocked: shouldBlock, blockedReason: blockReason, isCoinbase: txn["is_coinbase"] as bool? ?? false, diff --git a/lib/services/coins/dogecoin/dogecoin_wallet.dart b/lib/services/coins/dogecoin/dogecoin_wallet.dart index a86d6fcd6..1c21407c8 100644 --- a/lib/services/coins/dogecoin/dogecoin_wallet.dart +++ b/lib/services/coins/dogecoin/dogecoin_wallet.dart @@ -1587,6 +1587,7 @@ class DogecoinWallet extends CoinServiceAPI bool shouldBlock = false; String? blockReason; + String? label; if (storedTx?.subType == isar_models.TransactionSubType.bip47Notification) { @@ -1594,10 +1595,11 @@ class DogecoinWallet extends CoinServiceAPI shouldBlock = true; blockReason = "Incoming paynym notification transaction."; } else if (storedTx?.type == isar_models.TransactionType.outgoing) { - shouldBlock = true; + shouldBlock = false; blockReason = "Paynym notification change output. Incautious " "handling of change outputs from notification transactions " "may cause unintended loss of privacy."; + label = blockReason; } } @@ -1620,7 +1622,7 @@ class DogecoinWallet extends CoinServiceAPI txid: txn["txid"] as String, vout: vout, value: jsonUTXO["value"] as int, - name: "", + name: label ?? "", isBlocked: shouldBlock, blockedReason: blockReason, isCoinbase: txn["is_coinbase"] as bool? ?? false, diff --git a/lib/services/coins/firo/firo_wallet.dart b/lib/services/coins/firo/firo_wallet.dart index ca94db6e3..83d718fb0 100644 --- a/lib/services/coins/firo/firo_wallet.dart +++ b/lib/services/coins/firo/firo_wallet.dart @@ -2460,7 +2460,14 @@ class FiroWallet extends CoinServiceAPI with WalletCache, WalletDB, FiroHive { // Logging.instance.log("$value $tx $ltx"); if (!jindexes!.contains(value.index) && tx == null) { + if (!value.isUsed && + ltx != null && + ltx.isConfirmed(currentChainHeight, MINIMUM_CONFIRMATIONS)) { + // mint tx, add value to balance + intLelantusBalance += value.value; + } /* else { // This coin is not confirmed and may be replaced + }*/ } else if (jindexes.contains(value.index) && tx == null && !value.isUsed && @@ -2654,7 +2661,7 @@ class FiroWallet extends CoinServiceAPI with WalletCache, WalletDB, FiroHive { Future<List<Map<String, dynamic>>> createMintsFromAmount(int total) async { var tmpTotal = total; - var index = 0; + var index = 1; var mints = <Map<String, dynamic>>[]; final nextFreeMintIndex = firoGetMintIndex()!; while (tmpTotal > 0) { diff --git a/lib/utilities/assets.dart b/lib/utilities/assets.dart index 5d5f97feb..450474e25 100644 --- a/lib/utilities/assets.dart +++ b/lib/utilities/assets.dart @@ -27,6 +27,7 @@ abstract class Assets { if (Util.isDesktop) { assets.add(svg.themeChan); + assets.add(svg.themeDarkChan); } final futures = assets.map( @@ -71,6 +72,7 @@ class _BUY { switch (Theme.of(context).extension<StackColors>()!.themeType) { case ThemeType.dark: case ThemeType.oledBlack: + case ThemeType.darkChans: return "assets/svg/buy/Simplex-Nuvei-Logo-light.svg"; case ThemeType.fruitSorbet: @@ -102,6 +104,9 @@ class _SVG { // chan theme uses all the same assets as the light theme case ThemeType.chan: return "assets/svg/themed/${ThemeType.light.name}"; + case ThemeType.darkChans: + return "assets/svg/themed/${ThemeType.dark.name}"; + default: return "assets/svg/themed/${Theme.of(context).extension<StackColors>()!.themeType.name}"; } @@ -115,6 +120,7 @@ class _SVG { case ThemeType.chan: case ThemeType.dark: case ThemeType.oledBlack: + case ThemeType.darkChans: return null; case ThemeType.oceanBreeze: @@ -163,6 +169,7 @@ class _SVG { String get themeLight => "assets/svg/light-mode.svg"; String get themeDark => "assets/svg/dark-theme.svg"; String get themeChan => "assets/svg/chanstheme.svg"; + String get themeDarkChan => "assets/svg/darkChansTheme.svg"; String get circleSliders => "assets/svg/configuration.svg"; String get circlePlus => "assets/svg/plus-circle.svg"; @@ -414,6 +421,8 @@ class _ANIMATIONS { class _GIF { const _GIF(); + String get stacyPlain => "assets/gif/stacy-plain.gif"; + String plain(Coin coin) { return "assets/gif/coins/${coin.mainNetVersion.name}/plain.gif"; } diff --git a/lib/utilities/constants.dart b/lib/utilities/constants.dart index 242992233..c11dbcd01 100644 --- a/lib/utilities/constants.dart +++ b/lib/utilities/constants.dart @@ -42,7 +42,7 @@ abstract class Constants { // Enable Logger.print statements static const bool disableLogger = false; - static const int currentHiveDbVersion = 5; + static const int currentHiveDbVersion = 7; static const int rescanV1 = 1; diff --git a/lib/utilities/db_version_migration.dart b/lib/utilities/db_version_migration.dart index 97b3630df..44e3682c8 100644 --- a/lib/utilities/db_version_migration.dart +++ b/lib/utilities/db_version_migration.dart @@ -1,9 +1,11 @@ import 'package:hive/hive.dart'; import 'package:stackwallet/db/hive/db.dart'; import 'package:stackwallet/db/isar/main_db.dart'; +import 'package:isar/isar.dart'; import 'package:stackwallet/electrumx_rpc/electrumx.dart'; import 'package:stackwallet/models/exchange/change_now/exchange_transaction.dart'; import 'package:stackwallet/models/exchange/response_objects/trade.dart'; +import 'package:stackwallet/models/isar/models/blockchain_data/address.dart'; import 'package:stackwallet/models/isar/models/isar_models.dart' as isar_models; import 'package:stackwallet/models/models.dart'; import 'package:stackwallet/models/node_model.dart'; @@ -185,6 +187,97 @@ class DbVersionMigrator with WalletDB { // try to continue migrating return await migrate(5, secureStore: secureStore); + case 5: + // migrate + await Hive.openBox<dynamic>("theme"); + await Hive.openBox<dynamic>(DB.boxNamePrefs); + + final themeName = + DB.instance.get<dynamic>(boxName: "theme", key: "colorScheme") + as String? ?? + "light"; + + await DB.instance.put<dynamic>( + boxName: DB.boxNamePrefs, key: "theme", value: themeName); + + // update version + await DB.instance.put<dynamic>( + boxName: DB.boxNameDBInfo, key: "hive_data_version", value: 6); + + // try to continue migrating + return await migrate(6, secureStore: secureStore); + + case 6: + // migrate + await MainDB.instance.initMainDB(); + final count = await MainDB.instance.isar.addresses.count(); + // add change/receiving tags to address labels + for (var i = 0; i < count; i += 50) { + final addresses = await MainDB.instance.isar.addresses + .where() + .offset(i) + .limit(50) + .findAll(); + + final List<isar_models.AddressLabel> labels = []; + for (final address in addresses) { + List<String>? tags; + switch (address.subType) { + case AddressSubType.receiving: + tags = ["receiving"]; + break; + case AddressSubType.change: + tags = ["change"]; + break; + case AddressSubType.paynymNotification: + tags = ["paynym notification"]; + break; + case AddressSubType.paynymSend: + break; + case AddressSubType.paynymReceive: + tags = ["paynym receiving"]; + break; + case AddressSubType.unknown: + break; + case AddressSubType.nonWallet: + break; + } + + // update/create label if tags is not empty + if (tags != null) { + isar_models.AddressLabel? label = await MainDB + .instance.isar.addressLabels + .where() + .addressStringWalletIdEqualTo(address.value, address.walletId) + .findFirst(); + if (label == null) { + label = isar_models.AddressLabel( + walletId: address.walletId, + value: "", + addressString: address.value, + tags: tags, + ); + } else if (label.tags == null) { + label = label.copyWith(tags: tags); + } + labels.add(label); + } + } + + if (labels.isNotEmpty) { + await MainDB.instance.isar.writeTxn(() async { + await MainDB.instance.isar.addressLabels.putAll(labels); + }); + } + } + + // update version + await DB.instance.put<dynamic>( + boxName: DB.boxNameDBInfo, key: "hive_data_version", value: 7); + + // try to continue migrating + return await migrate(7, secureStore: secureStore); + default: // finally return return; diff --git a/lib/utilities/delete_everything.dart b/lib/utilities/delete_everything.dart index 446f43b3a..3c12fba85 100644 --- a/lib/utilities/delete_everything.dart +++ b/lib/utilities/delete_everything.dart @@ -21,7 +21,7 @@ Future<bool> deleteEverything() async { .deleteBoxFromDisk(boxName: DB.boxNameWalletsToDeleteOnStart); await DB.instance.deleteBoxFromDisk(boxName: DB.boxNamePriceCache); await DB.instance.deleteBoxFromDisk(boxName: DB.boxNameDBInfo); - await DB.instance.deleteBoxFromDisk(boxName: DB.boxNameTheme); + await DB.instance.deleteBoxFromDisk(boxName: "theme"); return true; } catch (e, s) { Logging.instance.log("$e $s", level: LogLevel.Error); diff --git a/lib/utilities/prefs.dart b/lib/utilities/prefs.dart index fc511ff10..7dd17e2ad 100644 --- a/lib/utilities/prefs.dart +++ b/lib/utilities/prefs.dart @@ -4,6 +4,7 @@ import 'package:stackwallet/utilities/constants.dart'; import 'package:stackwallet/utilities/enums/backup_frequency_type.dart'; import 'package:stackwallet/utilities/enums/languages_enum.dart'; import 'package:stackwallet/utilities/enums/sync_type_enum.dart'; +import 'package:stackwallet/utilities/theme/color_theme.dart'; import 'package:uuid/uuid.dart'; class Prefs extends ChangeNotifier { @@ -41,6 +42,10 @@ class Prefs extends ChangeNotifier { _userId = await _getUserId(); _signupEpoch = await _getSignupEpoch(); _enableCoinControl = await _getEnableCoinControl(); + _enableSystemBrightness = await _getEnableSystemBrightness(); + _theme = await _getTheme(); + _systemBrightnessLightTheme = await _getSystemBrightnessLightTheme(); + _systemBrightnessDarkTheme = await _getSystemBrightnessDarkTheme(); _initialized = true; } @@ -669,4 +674,96 @@ class Prefs extends ChangeNotifier { boxName: DB.boxNamePrefs, key: "enableCoinControl") as bool? ?? false; } + + // follow system brightness + + bool _enableSystemBrightness = false; + + bool get enableSystemBrightness => _enableSystemBrightness; + + set enableSystemBrightness(bool enableSystemBrightness) { + if (_enableSystemBrightness != enableSystemBrightness) { + DB.instance.put<dynamic>( + boxName: DB.boxNamePrefs, + key: "enableSystemBrightness", + value: enableSystemBrightness); + _enableSystemBrightness = enableSystemBrightness; + notifyListeners(); + } + } + + Future<bool> _getEnableSystemBrightness() async { + return await DB.instance.get<dynamic>( + boxName: DB.boxNamePrefs, key: "enableSystemBrightness") as bool? ?? + false; + } + + // system brightness light theme name + + ThemeType _theme = ThemeType.light; + + ThemeType get theme => _theme; + + set theme(ThemeType theme) { + if (this.theme != theme) { + DB.instance.put<dynamic>( + boxName: DB.boxNamePrefs, key: "theme", value: theme.name); + _theme = theme; + notifyListeners(); + } + } + + Future<ThemeType> _getTheme() async { + return ThemeTypeExt.fromName(await DB.instance + .get<dynamic>(boxName: DB.boxNamePrefs, key: "theme") as String? ?? + ThemeType.light.name); + } + + // system brightness light theme name + + ThemeType _systemBrightnessLightTheme = ThemeType.light; + + ThemeType get systemBrightnessLightTheme => _systemBrightnessLightTheme; + + set systemBrightnessLightTheme(ThemeType systemBrightnessLightTheme) { + if (this.systemBrightnessLightTheme != systemBrightnessLightTheme) { + DB.instance.put<dynamic>( + boxName: DB.boxNamePrefs, + key: "systemBrightnessLightTheme", + value: systemBrightnessLightTheme.name); + _systemBrightnessLightTheme = systemBrightnessLightTheme; + notifyListeners(); + } + } + + Future<ThemeType> _getSystemBrightnessLightTheme() async { + return ThemeTypeExt.fromName(await DB.instance.get<dynamic>( + boxName: DB.boxNamePrefs, + key: "systemBrightnessLightTheme") as String? ?? + ThemeType.light.name); + } + + // system brightness dark theme name + + ThemeType _systemBrightnessDarkTheme = ThemeType.dark; + + ThemeType get systemBrightnessDarkTheme => _systemBrightnessDarkTheme; + + set systemBrightnessDarkTheme(ThemeType systemBrightnessDarkTheme) { + if (this.systemBrightnessDarkTheme != systemBrightnessDarkTheme) { + DB.instance.put<dynamic>( + boxName: DB.boxNamePrefs, + key: "systemBrightnessDarkTheme", + value: systemBrightnessDarkTheme.name); + _systemBrightnessDarkTheme = systemBrightnessDarkTheme; + notifyListeners(); + } + } + + Future<ThemeType> _getSystemBrightnessDarkTheme() async { + return ThemeTypeExt.fromName(await DB.instance.get<dynamic>( + boxName: DB.boxNamePrefs, + key: "systemBrightnessDarkTheme") as String? ?? + ThemeType.dark.name); + } } diff --git a/lib/utilities/theme/color_theme.dart b/lib/utilities/theme/color_theme.dart index 99df536ac..fcdb6c8c7 100644 --- a/lib/utilities/theme/color_theme.dart +++ b/lib/utilities/theme/color_theme.dart @@ -6,6 +6,7 @@ import 'package:stackwallet/utilities/theme/fruit_sorbet_colors.dart'; import 'package:stackwallet/utilities/theme/light_colors.dart'; import 'package:stackwallet/utilities/theme/ocean_breeze_colors.dart'; import 'package:stackwallet/utilities/theme/oled_black_colors.dart'; +import 'package:stackwallet/utilities/theme/oled_chans_colors.dart'; import 'chan_colors.dart'; @@ -16,12 +17,36 @@ enum ThemeType { oledBlack, fruitSorbet, forest, - chan; + chan, + darkChans; } // adjust this file extension ThemeTypeExt on ThemeType { + static ThemeType fromName(String name) { + switch (name) { + case "light": + return ThemeType.light; + case "chan": + return ThemeType.chan; + case "dark": + return ThemeType.dark; + case "oceanBreeze": + return ThemeType.oceanBreeze; + case "oledBlack": + return ThemeType.oledBlack; + case "fruitSorbet": + return ThemeType.fruitSorbet; + case "forest": + return ThemeType.forest; + case "darkChans": + return ThemeType.darkChans; + default: + throw ArgumentError("Invalid theme name"); + } + } + StackColorTheme get colorTheme { switch (this) { case ThemeType.light: @@ -38,6 +63,8 @@ extension ThemeTypeExt on ThemeType { return FruitSorbetColors(); case ThemeType.forest: return ForestColors(); + case ThemeType.darkChans: + return DarkChansColors(); } } @@ -57,6 +84,8 @@ extension ThemeTypeExt on ThemeType { return "Fruit Sorbet"; case ThemeType.forest: return "Forest"; + case ThemeType.darkChans: + return "Dark Chans"; } } } diff --git a/lib/utilities/theme/oled_black_colors.dart b/lib/utilities/theme/oled_black_colors.dart index 71d4b2361..4f273eeff 100644 --- a/lib/utilities/theme/oled_black_colors.dart +++ b/lib/utilities/theme/oled_black_colors.dart @@ -326,7 +326,7 @@ class OledBlackColors extends StackColorTheme { Color get textConfirmTotalAmount => textFieldSuccessLabel; //const Color(0xFF144D35); @override - Color get textSelectedWordTableItem => const Color(0xFF143D8E); + Color get textSelectedWordTableItem => const Color(0xFFF26822); //rate type toggle @override diff --git a/lib/utilities/theme/oled_chans_colors.dart b/lib/utilities/theme/oled_chans_colors.dart new file mode 100644 index 000000000..83600d5d5 --- /dev/null +++ b/lib/utilities/theme/oled_chans_colors.dart @@ -0,0 +1,351 @@ +import 'package:flutter/material.dart'; +import 'package:stackwallet/utilities/theme/color_theme.dart'; + +class DarkChansColors extends StackColorTheme { + @override + ThemeType get themeType => ThemeType.darkChans; + @override + Brightness get brightness => Brightness.dark; + + @override + Color get background => const Color(0xFF2A2D34); + @override + Color get backgroundAppBar => background; + @override + Gradient? get gradientBackground => null; + + @override + Color get overlay => const Color(0xFF111215); + + @override + Color get accentColorBlue => const Color(0xFF4C86E9); + @override + Color get accentColorGreen => const Color(0xFF4CC0A0); + @override + Color get accentColorYellow => const Color(0xFFF7D65D); + @override + Color get accentColorRed => const Color(0xFFD34E50); + @override + Color get accentColorOrange => const Color(0xFFFEA68D); + @override + Color get accentColorDark => const Color(0xFFF3F3F3); + + @override + Color get shadow => const Color(0x0F2D3132); + + @override + Color get textDark => const Color(0xFFF3F3F3); + @override + Color get textDark2 => const Color(0xFFDBDBDB); + @override + Color get textDark3 => const Color(0xFFEEEFF1); + @override + Color get textSubtitle1 => const Color(0xFF9E9E9E); + @override + Color get textSubtitle2 => const Color(0xFF969696); + @override + Color get textSubtitle3 => const Color(0xFFA9ACAC); + @override + Color get textSubtitle4 => const Color(0xFF8E9192); + @override + Color get textSubtitle5 => const Color(0xFF747778); + @override + Color get textSubtitle6 => const Color(0xFF414141); + @override + Color get textWhite => const Color(0xFF232323); + @override + Color get textFavoriteCard => const Color(0xFF232323); + @override + Color get textError => const Color(0xFFF37475); + @override + Color get textRestore => overlay; + + // button background + @override + Color get buttonBackPrimary => const Color(0xFF4C86E9); + @override + Color get buttonBackSecondary => const Color(0xFF444E5C); + @override + Color get buttonBackPrimaryDisabled => const Color(0xFF38517C); + @override + Color get buttonBackSecondaryDisabled => const Color(0xFF3B3F46); + @override + Color get buttonBackBorder => const Color(0xFF4C86E9); + @override + Color get buttonBackBorderDisabled => const Color(0xFF314265); + @override + Color get buttonBackBorderSecondary => buttonBackSecondary; + @override + Color get buttonBackBorderSecondaryDisabled => buttonBackSecondaryDisabled; + + @override + Color get numberBackDefault => const Color(0xFF484B51); + @override + Color get numpadBackDefault => const Color(0xFF4C86E9); + @override + Color get bottomNavBack => const Color(0xFF3E4148); + + // button text/element + @override + Color get buttonTextPrimary => const Color(0xFFFFFFFF); + @override + Color get buttonTextSecondary => const Color(0xFFFFFFFF); + @override + Color get buttonTextPrimaryDisabled => const Color(0xFFFFFFFF); + @override + Color get buttonTextSecondaryDisabled => const Color(0xFF6A6C71); + @override + Color get buttonTextBorder => const Color(0xFF4C86E9); + @override + Color get buttonTextDisabled => const Color(0xFF314265); + @override + Color get buttonTextBorderless => const Color(0xFF4C86E9); + @override + Color get buttonTextBorderlessDisabled => const Color(0xFFB6B6B6); + @override + Color get numberTextDefault => const Color(0xFFFFFFFF); + @override + Color get numpadTextDefault => const Color(0xFFFFFFFF); + @override + Color get bottomNavText => const Color(0xFFFFFFFF); + @override + Color get customTextButtonEnabledText => buttonTextBorderless; + @override + Color get customTextButtonDisabledText => textSubtitle1; + + // switch + @override + Color get switchBGOn => const Color(0xFF4C86E9); + @override + Color get switchBGOff => const Color(0xFFC1D9FF); + @override + Color get switchBGDisabled => const Color(0xFFB5B7BA); + @override + Color get switchCircleOn => const Color(0xFFC9DDFF); + @override + Color get switchCircleOff => const Color(0xFFFFFFFF); + @override + Color get switchCircleDisabled => const Color(0xFFFFFFFF); + + // step indicator background + @override + Color get stepIndicatorBGCheck => const Color(0xFF4C86E9); + @override + Color get stepIndicatorBGNumber => const Color(0xFF4C86E9); + @override + Color get stepIndicatorBGInactive => const Color(0xFF3B3F46); + @override + Color get stepIndicatorBGLines => const Color(0xFF4C86E9); + @override + Color get stepIndicatorBGLinesInactive => const Color(0xFF3B3F46); + @override + Color get stepIndicatorIconText => const Color(0xFFFFFFFF); + @override + Color get stepIndicatorIconNumber => const Color(0xFFFFFFFF); + @override + Color get stepIndicatorIconInactive => const Color(0xFF747474); + + // checkbox + @override + Color get checkboxBGChecked => const Color(0xFF4C86E9); + @override + Color get checkboxBorderEmpty => const Color(0xFF8E9192); + @override + Color get checkboxBGDisabled => const Color(0xFFADC7EC); + @override + Color get checkboxIconChecked => const Color(0xFFFFFFFF); + @override + Color get checkboxIconDisabled => const Color(0xFFFFFFFF); + @override + Color get checkboxTextLabel => const Color(0xFFFFFFFF); + + // snack bar + @override + Color get snackBarBackSuccess => const Color(0xFF8EF5C3); + @override + Color get snackBarBackError => const Color(0xFFFFB4A9); + @override + Color get snackBarBackInfo => const Color(0xFFB4C4FF); + @override + Color get snackBarTextSuccess => const Color(0xFF003921); + @override + Color get snackBarTextError => const Color(0xFF690001); + @override + Color get snackBarTextInfo => const Color(0xFF00297A); + + // icons + @override + Color get bottomNavIconBack => const Color(0xFF7F8185); + @override + Color get bottomNavIconIcon => const Color(0xFFFFFFFF); + + @override + Color get topNavIconPrimary => const Color(0xFFFFFFFF); + @override + Color get topNavIconGreen => const Color(0xFF4CC0A0); + @override + Color get topNavIconYellow => const Color(0xFFF7D65D); + @override + Color get topNavIconRed => const Color(0xFFD34E50); + + @override + Color get settingsIconBack => const Color(0xFFE0E3E3); + @override + Color get settingsIconIcon => const Color(0xFF232323); + @override + Color get settingsIconBack2 => const Color(0xFF94D6C4); + @override + Color get settingsIconElement => const Color(0xFF00A578); + + // text field + @override + Color get textFieldActiveBG => const Color(0xFF4C5360); + @override + Color get textFieldDefaultBG => const Color(0xFF444953); + @override + Color get textFieldErrorBG => const Color(0xFFFFB4A9); + @override + Color get textFieldSuccessBG => const Color(0xFF8EF5C3); + @override + Color get textFieldErrorBorder => textFieldErrorBG; + @override + Color get textFieldSuccessBorder => textFieldSuccessBG; + + @override + Color get textFieldActiveSearchIconLeft => const Color(0xFFA9ACAC); + @override + Color get textFieldDefaultSearchIconLeft => const Color(0xFFA9ACAC); + @override + Color get textFieldErrorSearchIconLeft => const Color(0xFF690001); + @override + Color get textFieldSuccessSearchIconLeft => const Color(0xFF003921); + + @override + Color get textFieldActiveText => const Color(0xFFFFFFFF); + @override + Color get textFieldDefaultText => const Color(0xFFA9ACAC); + @override + Color get textFieldErrorText => const Color(0xFF000000); + @override + Color get textFieldSuccessText => const Color(0xFF000000); + + @override + Color get textFieldActiveLabel => const Color(0xFFA9ACAC); + @override + Color get textFieldErrorLabel => const Color(0xFF690001); + @override + Color get textFieldSuccessLabel => const Color(0xFF003921); + + @override + Color get textFieldActiveSearchIconRight => const Color(0xFFC4C7C7); + @override + Color get textFieldDefaultSearchIconRight => const Color(0xFF747778); + @override + Color get textFieldErrorSearchIconRight => const Color(0xFF690001); + @override + Color get textFieldSuccessSearchIconRight => const Color(0xFF003921); + + // settings item level2 + @override + Color get settingsItem2ActiveBG => const Color(0xFF484B51); + @override + Color get settingsItem2ActiveText => const Color(0xFFFFFFFF); + @override + Color get settingsItem2ActiveSub => const Color(0xFF9E9E9E); + + // radio buttons + @override + Color get radioButtonIconBorder => const Color(0xFF4C86E9); + @override + Color get radioButtonIconBorderDisabled => const Color(0xFF9E9E9E); + @override + Color get radioButtonBorderEnabled => const Color(0xFF4C86E9); + @override + Color get radioButtonBorderDisabled => const Color(0xFFCDCDCD); + @override + Color get radioButtonIconCircle => const Color(0xFF9E9E9E); + @override + Color get radioButtonIconEnabled => const Color(0xFF4C86E9); + @override + Color get radioButtonTextEnabled => const Color(0xFF44464E); + @override + Color get radioButtonTextDisabled => const Color(0xFF44464E); + @override + Color get radioButtonLabelEnabled => const Color(0xFF8E9192); + @override + Color get radioButtonLabelDisabled => const Color(0xFF8E9192); + + // info text + @override + Color get infoItemBG => const Color(0xFF333942); + @override + Color get infoItemLabel => const Color(0xFF9E9E9E); + @override + Color get infoItemText => const Color(0xFFFFFFFF); + @override + Color get infoItemIcons => const Color(0xFF4C86E9); + + // popup + @override + Color get popupBG => const Color(0xFF333942); + + // currency list + @override + Color get currencyListItemBG => const Color(0xFF484B51); + + // bottom nav + @override + Color get stackWalletBG => const Color(0xFF35383D); + @override + Color get stackWalletMid => const Color(0xFF292D34); + @override + Color get stackWalletBottom => const Color(0xFFFFFFFF); + @override + Color get bottomNavShadow => const Color(0xFF282E33); + + @override + Color get favoriteStarActive => accentColorYellow; + @override + Color get favoriteStarInactive => textSubtitle2; + + @override + Color get splash => const Color(0x358E9192); + @override + Color get highlight => const Color(0x44A9ACAC); + @override + Color get warningForeground => snackBarTextError; + @override + Color get warningBackground => const Color(0xFFFFB4A9); + @override + Color get loadingOverlayTextColor => const Color(0xFFF7F7F7); + @override + Color get myStackContactIconBG => const Color(0x88747778); + @override + Color get textConfirmTotalAmount => const Color(0xFF003921); + @override + Color get textSelectedWordTableItem => const Color(0xFF00297A); + + //rate type toggle + @override + Color get rateTypeToggleColorOn => textFieldDefaultBG; + @override + Color get rateTypeToggleColorOff => popupBG; + @override + Color get rateTypeToggleDesktopColorOn => textFieldDefaultBG; + @override + Color get rateTypeToggleDesktopColorOff => buttonBackSecondary; + + @override + BoxShadow get standardBoxShadow => BoxShadow( + color: shadow, + spreadRadius: 3, + blurRadius: 4, + ); + + @override + BoxShadow? get homeViewButtonBarBoxShadow => BoxShadow( + color: shadow, + spreadRadius: 3, + blurRadius: 4, + ); +} diff --git a/lib/widgets/custom_buttons/simple_edit_button.dart b/lib/widgets/custom_buttons/simple_edit_button.dart index 931de7aa4..3bebeb4d0 100644 --- a/lib/widgets/custom_buttons/simple_edit_button.dart +++ b/lib/widgets/custom_buttons/simple_edit_button.dart @@ -13,14 +13,23 @@ import '../icon_widgets/pencil_icon.dart'; class SimpleEditButton extends StatelessWidget { const SimpleEditButton({ Key? key, - required this.editValue, - required this.editLabel, - required this.onValueChanged, - }) : super(key: key); + this.editValue, + this.editLabel, + this.onValueChanged, + this.onPressedOverride, + }) : assert( + (editLabel != null && editValue != null && onValueChanged != null) || + (editLabel == null && + editValue == null && + onValueChanged == null && + onPressedOverride != null), + ), + super(key: key); - final String editValue; - final String editLabel; - final void Function(String) onValueChanged; + final String? editValue; + final String? editLabel; + final void Function(String)? onValueChanged; + final VoidCallback? onPressedOverride; @override Widget build(BuildContext context) { @@ -36,24 +45,25 @@ class SimpleEditButton extends StatelessWidget { shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(6), ), - onPressed: () async { - final result = await showDialog<String?>( - context: context, - builder: (context) { - return DesktopDialog( - maxWidth: 580, - maxHeight: 360, - child: SingleFieldEditView( - initialValue: editValue, - label: editLabel, - ), + onPressed: onPressedOverride ?? + () async { + final result = await showDialog<String?>( + context: context, + builder: (context) { + return DesktopDialog( + maxWidth: 580, + maxHeight: 360, + child: SingleFieldEditView( + initialValue: editValue!, + label: editLabel!, + ), + ); + }, ); + if (result is String && result != editValue!) { + onValueChanged?.call(result); + } }, - ); - if (result is String && result != editValue) { - onValueChanged(result); - } - }, child: Padding( padding: const EdgeInsets.all(5), child: PencilIcon( @@ -66,18 +76,19 @@ class SimpleEditButton extends StatelessWidget { ); } else { return GestureDetector( - onTap: () async { - final result = await Navigator.of(context).pushNamed( - SingleFieldEditView.routeName, - arguments: Tuple2( - editValue, - editLabel, - ), - ); - if (result is String && result != editValue) { - onValueChanged(result); - } - }, + onTap: onPressedOverride ?? + () async { + final result = await Navigator.of(context).pushNamed( + SingleFieldEditView.routeName, + arguments: Tuple2( + editValue!, + editLabel!, + ), + ); + if (result is String && result != editValue!) { + onValueChanged?.call(result); + } + }, child: Row( children: [ SvgPicture.asset( diff --git a/lib/widgets/rounded_white_container.dart b/lib/widgets/rounded_white_container.dart index 2ade9b729..8208d69ca 100644 --- a/lib/widgets/rounded_white_container.dart +++ b/lib/widgets/rounded_white_container.dart @@ -12,6 +12,7 @@ class RoundedWhiteContainer extends StatelessWidget { this.height, this.borderColor, this.boxShadow, + this.onPressed, }) : super(key: key); final Widget? child; @@ -21,6 +22,7 @@ class RoundedWhiteContainer extends StatelessWidget { final double? height; final Color? borderColor; final List<BoxShadow>? boxShadow; + final VoidCallback? onPressed; @override Widget build(BuildContext context) { @@ -32,6 +34,7 @@ class RoundedWhiteContainer extends StatelessWidget { height: height, borderColor: borderColor, boxShadow: boxShadow, + onPressed: onPressed, child: child, ); } diff --git a/pubspec.yaml b/pubspec.yaml index 570b85cdf..1db8de99b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -11,7 +11,7 @@ description: Stack Wallet # 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.6.3+145 +version: 1.6.4+146 environment: sdk: ">=2.17.0 <3.0.0" @@ -347,6 +347,7 @@ flutter: - assets/svg/fruit-sorbet-theme.svg - assets/svg/forest-theme.svg - assets/svg/chanstheme.svg + - assets/svg/darkChansTheme.svg # light theme specific - assets/svg/themed/light/ @@ -374,6 +375,9 @@ flutter: # basic - assets/lottie/test2.json + # gifs + - assets/gif/ + # coin gifs - assets/gif/coins/bitcoin/ - assets/gif/coins/bitcoincash/ diff --git a/test/cached_electrumx_test.mocks.dart b/test/cached_electrumx_test.mocks.dart index ca8544cc4..6f96a5875 100644 --- a/test/cached_electrumx_test.mocks.dart +++ b/test/cached_electrumx_test.mocks.dart @@ -4,7 +4,7 @@ // ignore_for_file: no_leading_underscores_for_library_prefixes import 'dart:async' as _i4; -import 'dart:ui' as _i8; +import 'dart:ui' as _i9; import 'package:decimal/decimal.dart' as _i2; import 'package:mockito/mockito.dart' as _i1; @@ -12,6 +12,7 @@ import 'package:stackwallet/electrumx_rpc/electrumx.dart' as _i3; import 'package:stackwallet/utilities/enums/backup_frequency_type.dart' as _i7; import 'package:stackwallet/utilities/enums/sync_type_enum.dart' as _i6; import 'package:stackwallet/utilities/prefs.dart' as _i5; +import 'package:stackwallet/utilities/theme/color_theme.dart' as _i8; // ignore_for_file: type=lint // ignore_for_file: avoid_redundant_argument_values @@ -665,6 +666,61 @@ class MockPrefs extends _i1.Mock implements _i5.Prefs { returnValueForMissingStub: null, ); @override + bool get enableSystemBrightness => (super.noSuchMethod( + Invocation.getter(#enableSystemBrightness), + returnValue: false, + ) as bool); + @override + set enableSystemBrightness(bool? enableSystemBrightness) => + super.noSuchMethod( + Invocation.setter( + #enableSystemBrightness, + enableSystemBrightness, + ), + returnValueForMissingStub: null, + ); + @override + _i8.ThemeType get theme => (super.noSuchMethod( + Invocation.getter(#theme), + returnValue: _i8.ThemeType.light, + ) as _i8.ThemeType); + @override + set theme(_i8.ThemeType? theme) => super.noSuchMethod( + Invocation.setter( + #theme, + theme, + ), + returnValueForMissingStub: null, + ); + @override + _i8.ThemeType get systemBrightnessLightTheme => (super.noSuchMethod( + Invocation.getter(#systemBrightnessLightTheme), + returnValue: _i8.ThemeType.light, + ) as _i8.ThemeType); + @override + set systemBrightnessLightTheme(_i8.ThemeType? systemBrightnessLightTheme) => + super.noSuchMethod( + Invocation.setter( + #systemBrightnessLightTheme, + systemBrightnessLightTheme, + ), + returnValueForMissingStub: null, + ); + @override + _i8.ThemeType get systemBrightnessDarkTheme => (super.noSuchMethod( + Invocation.getter(#systemBrightnessDarkTheme), + returnValue: _i8.ThemeType.light, + ) as _i8.ThemeType); + @override + set systemBrightnessDarkTheme(_i8.ThemeType? systemBrightnessDarkTheme) => + super.noSuchMethod( + Invocation.setter( + #systemBrightnessDarkTheme, + systemBrightnessDarkTheme, + ), + returnValueForMissingStub: null, + ); + @override bool get hasListeners => (super.noSuchMethod( Invocation.getter(#hasListeners), returnValue: false, @@ -714,7 +770,7 @@ class MockPrefs extends _i1.Mock implements _i5.Prefs { returnValueForMissingStub: _i4.Future<void>.value(), ) as _i4.Future<void>); @override - void addListener(_i8.VoidCallback? listener) => super.noSuchMethod( + void addListener(_i9.VoidCallback? listener) => super.noSuchMethod( Invocation.method( #addListener, [listener], @@ -722,7 +778,7 @@ class MockPrefs extends _i1.Mock implements _i5.Prefs { returnValueForMissingStub: null, ); @override - void removeListener(_i8.VoidCallback? listener) => super.noSuchMethod( + void removeListener(_i9.VoidCallback? listener) => super.noSuchMethod( Invocation.method( #removeListener, [listener], diff --git a/test/electrumx_test.mocks.dart b/test/electrumx_test.mocks.dart index b7147a3b8..e18e0aedf 100644 --- a/test/electrumx_test.mocks.dart +++ b/test/electrumx_test.mocks.dart @@ -4,13 +4,14 @@ // ignore_for_file: no_leading_underscores_for_library_prefixes import 'dart:async' as _i3; -import 'dart:ui' as _i7; +import 'dart:ui' as _i8; import 'package:mockito/mockito.dart' as _i1; import 'package:stackwallet/electrumx_rpc/rpc.dart' as _i2; import 'package:stackwallet/utilities/enums/backup_frequency_type.dart' as _i6; import 'package:stackwallet/utilities/enums/sync_type_enum.dart' as _i5; import 'package:stackwallet/utilities/prefs.dart' as _i4; +import 'package:stackwallet/utilities/theme/color_theme.dart' as _i7; // ignore_for_file: type=lint // ignore_for_file: avoid_redundant_argument_values @@ -386,6 +387,61 @@ class MockPrefs extends _i1.Mock implements _i4.Prefs { returnValueForMissingStub: null, ); @override + bool get enableSystemBrightness => (super.noSuchMethod( + Invocation.getter(#enableSystemBrightness), + returnValue: false, + ) as bool); + @override + set enableSystemBrightness(bool? enableSystemBrightness) => + super.noSuchMethod( + Invocation.setter( + #enableSystemBrightness, + enableSystemBrightness, + ), + returnValueForMissingStub: null, + ); + @override + _i7.ThemeType get theme => (super.noSuchMethod( + Invocation.getter(#theme), + returnValue: _i7.ThemeType.light, + ) as _i7.ThemeType); + @override + set theme(_i7.ThemeType? theme) => super.noSuchMethod( + Invocation.setter( + #theme, + theme, + ), + returnValueForMissingStub: null, + ); + @override + _i7.ThemeType get systemBrightnessLightTheme => (super.noSuchMethod( + Invocation.getter(#systemBrightnessLightTheme), + returnValue: _i7.ThemeType.light, + ) as _i7.ThemeType); + @override + set systemBrightnessLightTheme(_i7.ThemeType? systemBrightnessLightTheme) => + super.noSuchMethod( + Invocation.setter( + #systemBrightnessLightTheme, + systemBrightnessLightTheme, + ), + returnValueForMissingStub: null, + ); + @override + _i7.ThemeType get systemBrightnessDarkTheme => (super.noSuchMethod( + Invocation.getter(#systemBrightnessDarkTheme), + returnValue: _i7.ThemeType.light, + ) as _i7.ThemeType); + @override + set systemBrightnessDarkTheme(_i7.ThemeType? systemBrightnessDarkTheme) => + super.noSuchMethod( + Invocation.setter( + #systemBrightnessDarkTheme, + systemBrightnessDarkTheme, + ), + returnValueForMissingStub: null, + ); + @override bool get hasListeners => (super.noSuchMethod( Invocation.getter(#hasListeners), returnValue: false, @@ -435,7 +491,7 @@ class MockPrefs extends _i1.Mock implements _i4.Prefs { returnValueForMissingStub: _i3.Future<void>.value(), ) as _i3.Future<void>); @override - void addListener(_i7.VoidCallback? listener) => super.noSuchMethod( + void addListener(_i8.VoidCallback? listener) => super.noSuchMethod( Invocation.method( #addListener, [listener], @@ -443,7 +499,7 @@ class MockPrefs extends _i1.Mock implements _i4.Prefs { returnValueForMissingStub: null, ); @override - void removeListener(_i7.VoidCallback? listener) => super.noSuchMethod( + void removeListener(_i8.VoidCallback? listener) => super.noSuchMethod( Invocation.method( #removeListener, [listener], diff --git a/test/pages/send_view/send_view_test.mocks.dart b/test/pages/send_view/send_view_test.mocks.dart index 77f714322..149d690b1 100644 --- a/test/pages/send_view/send_view_test.mocks.dart +++ b/test/pages/send_view/send_view_test.mocks.dart @@ -13,7 +13,7 @@ import 'package:bitcoindart/bitcoindart.dart' as _i14; import 'package:flutter/foundation.dart' as _i4; import 'package:flutter_riverpod/flutter_riverpod.dart' as _i5; import 'package:mockito/mockito.dart' as _i1; -import 'package:stackwallet/db/isar/main_db.dart' as _i13; +import 'package:stackwallet/db/main_db.dart' as _i13; import 'package:stackwallet/electrumx_rpc/cached_electrumx.dart' as _i11; import 'package:stackwallet/electrumx_rpc/electrumx.dart' as _i10; import 'package:stackwallet/models/balance.dart' as _i12; @@ -37,6 +37,7 @@ import 'package:stackwallet/utilities/enums/sync_type_enum.dart' as _i31; import 'package:stackwallet/utilities/flutter_secure_storage_interface.dart' as _i7; import 'package:stackwallet/utilities/prefs.dart' as _i23; +import 'package:stackwallet/utilities/theme/color_theme.dart' as _i33; import 'package:tuple/tuple.dart' as _i15; // ignore_for_file: type=lint @@ -1640,25 +1641,6 @@ class MockBitcoinWallet extends _i1.Mock implements _i26.BitcoinWallet { returnValueForMissingStub: _i22.Future<void>.value(), ) as _i22.Future<void>); @override - List<String> getWalletTokenContractAddresses() => (super.noSuchMethod( - Invocation.method( - #getWalletTokenContractAddresses, - [], - ), - returnValue: <String>[], - ) as List<String>); - @override - _i22.Future<void> updateWalletTokenContractAddresses( - List<String>? contractAddresses) => - (super.noSuchMethod( - Invocation.method( - #updateWalletTokenContractAddresses, - [contractAddresses], - ), - returnValue: _i22.Future<void>.value(), - returnValueForMissingStub: _i22.Future<void>.value(), - ) as _i22.Future<void>); - @override void initWalletDB({_i13.MainDB? mockableOverride}) => super.noSuchMethod( Invocation.method( #initWalletDB, @@ -2566,6 +2548,61 @@ class MockPrefs extends _i1.Mock implements _i23.Prefs { returnValueForMissingStub: null, ); @override + bool get enableSystemBrightness => (super.noSuchMethod( + Invocation.getter(#enableSystemBrightness), + returnValue: false, + ) as bool); + @override + set enableSystemBrightness(bool? enableSystemBrightness) => + super.noSuchMethod( + Invocation.setter( + #enableSystemBrightness, + enableSystemBrightness, + ), + returnValueForMissingStub: null, + ); + @override + _i33.ThemeType get theme => (super.noSuchMethod( + Invocation.getter(#theme), + returnValue: _i33.ThemeType.light, + ) as _i33.ThemeType); + @override + set theme(_i33.ThemeType? theme) => super.noSuchMethod( + Invocation.setter( + #theme, + theme, + ), + returnValueForMissingStub: null, + ); + @override + _i33.ThemeType get systemBrightnessLightTheme => (super.noSuchMethod( + Invocation.getter(#systemBrightnessLightTheme), + returnValue: _i33.ThemeType.light, + ) as _i33.ThemeType); + @override + set systemBrightnessLightTheme(_i33.ThemeType? systemBrightnessLightTheme) => + super.noSuchMethod( + Invocation.setter( + #systemBrightnessLightTheme, + systemBrightnessLightTheme, + ), + returnValueForMissingStub: null, + ); + @override + _i33.ThemeType get systemBrightnessDarkTheme => (super.noSuchMethod( + Invocation.getter(#systemBrightnessDarkTheme), + returnValue: _i33.ThemeType.light, + ) as _i33.ThemeType); + @override + set systemBrightnessDarkTheme(_i33.ThemeType? systemBrightnessDarkTheme) => + super.noSuchMethod( + Invocation.setter( + #systemBrightnessDarkTheme, + systemBrightnessDarkTheme, + ), + returnValueForMissingStub: null, + ); + @override bool get hasListeners => (super.noSuchMethod( Invocation.getter(#hasListeners), returnValue: false, @@ -2800,11 +2837,6 @@ class MockManager extends _i1.Mock implements _i6.Manager { returnValue: false, ) as bool); @override - bool get hasTokenSupport => (super.noSuchMethod( - Invocation.getter(#hasTokenSupport), - returnValue: false, - ) as bool); - @override bool get hasWhirlpoolSupport => (super.noSuchMethod( Invocation.getter(#hasWhirlpoolSupport), returnValue: false, diff --git a/test/screen_tests/address_book_view/subviews/add_address_book_view_screen_test.mocks.dart b/test/screen_tests/address_book_view/subviews/add_address_book_view_screen_test.mocks.dart index 7d01dfbba..a36548d2d 100644 --- a/test/screen_tests/address_book_view/subviews/add_address_book_view_screen_test.mocks.dart +++ b/test/screen_tests/address_book_view/subviews/add_address_book_view_screen_test.mocks.dart @@ -378,11 +378,6 @@ class MockManager extends _i1.Mock implements _i11.Manager { returnValue: false, ) as bool); @override - bool get hasTokenSupport => (super.noSuchMethod( - Invocation.getter(#hasTokenSupport), - returnValue: false, - ) as bool); - @override bool get hasWhirlpoolSupport => (super.noSuchMethod( Invocation.getter(#hasWhirlpoolSupport), returnValue: false, diff --git a/test/screen_tests/address_book_view/subviews/address_book_entry_details_view_screen_test.mocks.dart b/test/screen_tests/address_book_view/subviews/address_book_entry_details_view_screen_test.mocks.dart index e82f51d64..b78f3f23e 100644 --- a/test/screen_tests/address_book_view/subviews/address_book_entry_details_view_screen_test.mocks.dart +++ b/test/screen_tests/address_book_view/subviews/address_book_entry_details_view_screen_test.mocks.dart @@ -339,11 +339,6 @@ class MockManager extends _i1.Mock implements _i9.Manager { returnValue: false, ) as bool); @override - bool get hasTokenSupport => (super.noSuchMethod( - Invocation.getter(#hasTokenSupport), - returnValue: false, - ) as bool); - @override bool get hasWhirlpoolSupport => (super.noSuchMethod( Invocation.getter(#hasWhirlpoolSupport), returnValue: false, diff --git a/test/screen_tests/address_book_view/subviews/edit_address_book_entry_view_screen_test.mocks.dart b/test/screen_tests/address_book_view/subviews/edit_address_book_entry_view_screen_test.mocks.dart index d150ff23d..68697c039 100644 --- a/test/screen_tests/address_book_view/subviews/edit_address_book_entry_view_screen_test.mocks.dart +++ b/test/screen_tests/address_book_view/subviews/edit_address_book_entry_view_screen_test.mocks.dart @@ -337,11 +337,6 @@ class MockManager extends _i1.Mock implements _i9.Manager { returnValue: false, ) as bool); @override - bool get hasTokenSupport => (super.noSuchMethod( - Invocation.getter(#hasTokenSupport), - returnValue: false, - ) as bool); - @override bool get hasWhirlpoolSupport => (super.noSuchMethod( Invocation.getter(#hasWhirlpoolSupport), returnValue: false, diff --git a/test/screen_tests/exchange/exchange_view_test.mocks.dart b/test/screen_tests/exchange/exchange_view_test.mocks.dart index b692ea887..d926e9e5b 100644 --- a/test/screen_tests/exchange/exchange_view_test.mocks.dart +++ b/test/screen_tests/exchange/exchange_view_test.mocks.dart @@ -3,35 +3,37 @@ // Do not manually edit this file. // ignore_for_file: no_leading_underscores_for_library_prefixes -import 'dart:async' as _i6; -import 'dart:ui' as _i7; +import 'dart:async' as _i7; +import 'dart:ui' as _i8; -import 'package:decimal/decimal.dart' as _i14; -import 'package:http/http.dart' as _i12; +import 'package:decimal/decimal.dart' as _i15; +import 'package:http/http.dart' as _i13; import 'package:mockito/mockito.dart' as _i1; import 'package:stackwallet/models/exchange/change_now/cn_exchange_estimate.dart' - as _i17; -import 'package:stackwallet/models/exchange/change_now/exchange_transaction.dart' - as _i19; -import 'package:stackwallet/models/exchange/change_now/exchange_transaction_status.dart' - as _i20; -import 'package:stackwallet/models/exchange/response_objects/estimate.dart' - as _i16; -import 'package:stackwallet/models/exchange/response_objects/fixed_rate_market.dart' as _i18; +import 'package:stackwallet/models/exchange/change_now/exchange_transaction.dart' + as _i20; +import 'package:stackwallet/models/exchange/change_now/exchange_transaction_status.dart' + as _i21; +import 'package:stackwallet/models/exchange/response_objects/estimate.dart' + as _i17; +import 'package:stackwallet/models/exchange/response_objects/fixed_rate_market.dart' + as _i19; import 'package:stackwallet/models/exchange/response_objects/range.dart' - as _i15; -import 'package:stackwallet/models/exchange/response_objects/trade.dart' as _i9; -import 'package:stackwallet/models/isar/exchange_cache/currency.dart' as _i13; -import 'package:stackwallet/models/isar/exchange_cache/pair.dart' as _i21; + as _i16; +import 'package:stackwallet/models/exchange/response_objects/trade.dart' + as _i10; +import 'package:stackwallet/models/isar/exchange_cache/currency.dart' as _i14; +import 'package:stackwallet/models/isar/exchange_cache/pair.dart' as _i22; import 'package:stackwallet/services/exchange/change_now/change_now_api.dart' - as _i11; + as _i12; import 'package:stackwallet/services/exchange/exchange_response.dart' as _i2; -import 'package:stackwallet/services/trade_notes_service.dart' as _i10; -import 'package:stackwallet/services/trade_service.dart' as _i8; +import 'package:stackwallet/services/trade_notes_service.dart' as _i11; +import 'package:stackwallet/services/trade_service.dart' as _i9; import 'package:stackwallet/utilities/enums/backup_frequency_type.dart' as _i5; import 'package:stackwallet/utilities/enums/sync_type_enum.dart' as _i4; import 'package:stackwallet/utilities/prefs.dart' as _i3; +import 'package:stackwallet/utilities/theme/color_theme.dart' as _i6; // ignore_for_file: type=lint // ignore_for_file: avoid_redundant_argument_values @@ -335,56 +337,111 @@ class MockPrefs extends _i1.Mock implements _i3.Prefs { returnValueForMissingStub: null, ); @override + bool get enableSystemBrightness => (super.noSuchMethod( + Invocation.getter(#enableSystemBrightness), + returnValue: false, + ) as bool); + @override + set enableSystemBrightness(bool? enableSystemBrightness) => + super.noSuchMethod( + Invocation.setter( + #enableSystemBrightness, + enableSystemBrightness, + ), + returnValueForMissingStub: null, + ); + @override + _i6.ThemeType get theme => (super.noSuchMethod( + Invocation.getter(#theme), + returnValue: _i6.ThemeType.light, + ) as _i6.ThemeType); + @override + set theme(_i6.ThemeType? theme) => super.noSuchMethod( + Invocation.setter( + #theme, + theme, + ), + returnValueForMissingStub: null, + ); + @override + _i6.ThemeType get systemBrightnessLightTheme => (super.noSuchMethod( + Invocation.getter(#systemBrightnessLightTheme), + returnValue: _i6.ThemeType.light, + ) as _i6.ThemeType); + @override + set systemBrightnessLightTheme(_i6.ThemeType? systemBrightnessLightTheme) => + super.noSuchMethod( + Invocation.setter( + #systemBrightnessLightTheme, + systemBrightnessLightTheme, + ), + returnValueForMissingStub: null, + ); + @override + _i6.ThemeType get systemBrightnessDarkTheme => (super.noSuchMethod( + Invocation.getter(#systemBrightnessDarkTheme), + returnValue: _i6.ThemeType.light, + ) as _i6.ThemeType); + @override + set systemBrightnessDarkTheme(_i6.ThemeType? systemBrightnessDarkTheme) => + super.noSuchMethod( + Invocation.setter( + #systemBrightnessDarkTheme, + systemBrightnessDarkTheme, + ), + returnValueForMissingStub: null, + ); + @override bool get hasListeners => (super.noSuchMethod( Invocation.getter(#hasListeners), returnValue: false, ) as bool); @override - _i6.Future<void> init() => (super.noSuchMethod( + _i7.Future<void> init() => (super.noSuchMethod( Invocation.method( #init, [], ), - returnValue: _i6.Future<void>.value(), - returnValueForMissingStub: _i6.Future<void>.value(), - ) as _i6.Future<void>); + returnValue: _i7.Future<void>.value(), + returnValueForMissingStub: _i7.Future<void>.value(), + ) as _i7.Future<void>); @override - _i6.Future<void> incrementCurrentNotificationIndex() => (super.noSuchMethod( + _i7.Future<void> incrementCurrentNotificationIndex() => (super.noSuchMethod( Invocation.method( #incrementCurrentNotificationIndex, [], ), - returnValue: _i6.Future<void>.value(), - returnValueForMissingStub: _i6.Future<void>.value(), - ) as _i6.Future<void>); + returnValue: _i7.Future<void>.value(), + returnValueForMissingStub: _i7.Future<void>.value(), + ) as _i7.Future<void>); @override - _i6.Future<bool> isExternalCallsSet() => (super.noSuchMethod( + _i7.Future<bool> isExternalCallsSet() => (super.noSuchMethod( Invocation.method( #isExternalCallsSet, [], ), - returnValue: _i6.Future<bool>.value(false), - ) as _i6.Future<bool>); + returnValue: _i7.Future<bool>.value(false), + ) as _i7.Future<bool>); @override - _i6.Future<void> saveUserID(String? userId) => (super.noSuchMethod( + _i7.Future<void> saveUserID(String? userId) => (super.noSuchMethod( Invocation.method( #saveUserID, [userId], ), - returnValue: _i6.Future<void>.value(), - returnValueForMissingStub: _i6.Future<void>.value(), - ) as _i6.Future<void>); + returnValue: _i7.Future<void>.value(), + returnValueForMissingStub: _i7.Future<void>.value(), + ) as _i7.Future<void>); @override - _i6.Future<void> saveSignupEpoch(int? signupEpoch) => (super.noSuchMethod( + _i7.Future<void> saveSignupEpoch(int? signupEpoch) => (super.noSuchMethod( Invocation.method( #saveSignupEpoch, [signupEpoch], ), - returnValue: _i6.Future<void>.value(), - returnValueForMissingStub: _i6.Future<void>.value(), - ) as _i6.Future<void>); + returnValue: _i7.Future<void>.value(), + returnValueForMissingStub: _i7.Future<void>.value(), + ) as _i7.Future<void>); @override - void addListener(_i7.VoidCallback? listener) => super.noSuchMethod( + void addListener(_i8.VoidCallback? listener) => super.noSuchMethod( Invocation.method( #addListener, [listener], @@ -392,7 +449,7 @@ class MockPrefs extends _i1.Mock implements _i3.Prefs { returnValueForMissingStub: null, ); @override - void removeListener(_i7.VoidCallback? listener) => super.noSuchMethod( + void removeListener(_i8.VoidCallback? listener) => super.noSuchMethod( Invocation.method( #removeListener, [listener], @@ -420,29 +477,29 @@ class MockPrefs extends _i1.Mock implements _i3.Prefs { /// A class which mocks [TradesService]. /// /// See the documentation for Mockito's code generation for more information. -class MockTradesService extends _i1.Mock implements _i8.TradesService { +class MockTradesService extends _i1.Mock implements _i9.TradesService { MockTradesService() { _i1.throwOnMissingStub(this); } @override - List<_i9.Trade> get trades => (super.noSuchMethod( + List<_i10.Trade> get trades => (super.noSuchMethod( Invocation.getter(#trades), - returnValue: <_i9.Trade>[], - ) as List<_i9.Trade>); + returnValue: <_i10.Trade>[], + ) as List<_i10.Trade>); @override bool get hasListeners => (super.noSuchMethod( Invocation.getter(#hasListeners), returnValue: false, ) as bool); @override - _i9.Trade? get(String? tradeId) => (super.noSuchMethod(Invocation.method( + _i10.Trade? get(String? tradeId) => (super.noSuchMethod(Invocation.method( #get, [tradeId], - )) as _i9.Trade?); + )) as _i10.Trade?); @override - _i6.Future<void> add({ - required _i9.Trade? trade, + _i7.Future<void> add({ + required _i10.Trade? trade, required bool? shouldNotifyListeners, }) => (super.noSuchMethod( @@ -454,12 +511,12 @@ class MockTradesService extends _i1.Mock implements _i8.TradesService { #shouldNotifyListeners: shouldNotifyListeners, }, ), - returnValue: _i6.Future<void>.value(), - returnValueForMissingStub: _i6.Future<void>.value(), - ) as _i6.Future<void>); + returnValue: _i7.Future<void>.value(), + returnValueForMissingStub: _i7.Future<void>.value(), + ) as _i7.Future<void>); @override - _i6.Future<void> edit({ - required _i9.Trade? trade, + _i7.Future<void> edit({ + required _i10.Trade? trade, required bool? shouldNotifyListeners, }) => (super.noSuchMethod( @@ -471,12 +528,12 @@ class MockTradesService extends _i1.Mock implements _i8.TradesService { #shouldNotifyListeners: shouldNotifyListeners, }, ), - returnValue: _i6.Future<void>.value(), - returnValueForMissingStub: _i6.Future<void>.value(), - ) as _i6.Future<void>); + returnValue: _i7.Future<void>.value(), + returnValueForMissingStub: _i7.Future<void>.value(), + ) as _i7.Future<void>); @override - _i6.Future<void> delete({ - required _i9.Trade? trade, + _i7.Future<void> delete({ + required _i10.Trade? trade, required bool? shouldNotifyListeners, }) => (super.noSuchMethod( @@ -488,11 +545,11 @@ class MockTradesService extends _i1.Mock implements _i8.TradesService { #shouldNotifyListeners: shouldNotifyListeners, }, ), - returnValue: _i6.Future<void>.value(), - returnValueForMissingStub: _i6.Future<void>.value(), - ) as _i6.Future<void>); + returnValue: _i7.Future<void>.value(), + returnValueForMissingStub: _i7.Future<void>.value(), + ) as _i7.Future<void>); @override - _i6.Future<void> deleteByUuid({ + _i7.Future<void> deleteByUuid({ required String? uuid, required bool? shouldNotifyListeners, }) => @@ -505,11 +562,11 @@ class MockTradesService extends _i1.Mock implements _i8.TradesService { #shouldNotifyListeners: shouldNotifyListeners, }, ), - returnValue: _i6.Future<void>.value(), - returnValueForMissingStub: _i6.Future<void>.value(), - ) as _i6.Future<void>); + returnValue: _i7.Future<void>.value(), + returnValueForMissingStub: _i7.Future<void>.value(), + ) as _i7.Future<void>); @override - void addListener(_i7.VoidCallback? listener) => super.noSuchMethod( + void addListener(_i8.VoidCallback? listener) => super.noSuchMethod( Invocation.method( #addListener, [listener], @@ -517,7 +574,7 @@ class MockTradesService extends _i1.Mock implements _i8.TradesService { returnValueForMissingStub: null, ); @override - void removeListener(_i7.VoidCallback? listener) => super.noSuchMethod( + void removeListener(_i8.VoidCallback? listener) => super.noSuchMethod( Invocation.method( #removeListener, [listener], @@ -545,7 +602,7 @@ class MockTradesService extends _i1.Mock implements _i8.TradesService { /// A class which mocks [TradeNotesService]. /// /// See the documentation for Mockito's code generation for more information. -class MockTradeNotesService extends _i1.Mock implements _i10.TradeNotesService { +class MockTradeNotesService extends _i1.Mock implements _i11.TradeNotesService { MockTradeNotesService() { _i1.throwOnMissingStub(this); } @@ -570,7 +627,7 @@ class MockTradeNotesService extends _i1.Mock implements _i10.TradeNotesService { returnValue: '', ) as String); @override - _i6.Future<void> set({ + _i7.Future<void> set({ required String? tradeId, required String? note, }) => @@ -583,21 +640,21 @@ class MockTradeNotesService extends _i1.Mock implements _i10.TradeNotesService { #note: note, }, ), - returnValue: _i6.Future<void>.value(), - returnValueForMissingStub: _i6.Future<void>.value(), - ) as _i6.Future<void>); + returnValue: _i7.Future<void>.value(), + returnValueForMissingStub: _i7.Future<void>.value(), + ) as _i7.Future<void>); @override - _i6.Future<void> delete({required String? tradeId}) => (super.noSuchMethod( + _i7.Future<void> delete({required String? tradeId}) => (super.noSuchMethod( Invocation.method( #delete, [], {#tradeId: tradeId}, ), - returnValue: _i6.Future<void>.value(), - returnValueForMissingStub: _i6.Future<void>.value(), - ) as _i6.Future<void>); + returnValue: _i7.Future<void>.value(), + returnValueForMissingStub: _i7.Future<void>.value(), + ) as _i7.Future<void>); @override - void addListener(_i7.VoidCallback? listener) => super.noSuchMethod( + void addListener(_i8.VoidCallback? listener) => super.noSuchMethod( Invocation.method( #addListener, [listener], @@ -605,7 +662,7 @@ class MockTradeNotesService extends _i1.Mock implements _i10.TradeNotesService { returnValueForMissingStub: null, ); @override - void removeListener(_i7.VoidCallback? listener) => super.noSuchMethod( + void removeListener(_i8.VoidCallback? listener) => super.noSuchMethod( Invocation.method( #removeListener, [listener], @@ -633,13 +690,13 @@ class MockTradeNotesService extends _i1.Mock implements _i10.TradeNotesService { /// A class which mocks [ChangeNowAPI]. /// /// See the documentation for Mockito's code generation for more information. -class MockChangeNowAPI extends _i1.Mock implements _i11.ChangeNowAPI { +class MockChangeNowAPI extends _i1.Mock implements _i12.ChangeNowAPI { MockChangeNowAPI() { _i1.throwOnMissingStub(this); } @override - set client(_i12.Client? _client) => super.noSuchMethod( + set client(_i13.Client? _client) => super.noSuchMethod( Invocation.setter( #client, _client, @@ -647,7 +704,7 @@ class MockChangeNowAPI extends _i1.Mock implements _i11.ChangeNowAPI { returnValueForMissingStub: null, ); @override - _i6.Future<_i2.ExchangeResponse<List<_i13.Currency>>> getAvailableCurrencies({ + _i7.Future<_i2.ExchangeResponse<List<_i14.Currency>>> getAvailableCurrencies({ bool? fixedRate, bool? active, }) => @@ -661,8 +718,8 @@ class MockChangeNowAPI extends _i1.Mock implements _i11.ChangeNowAPI { }, ), returnValue: - _i6.Future<_i2.ExchangeResponse<List<_i13.Currency>>>.value( - _FakeExchangeResponse_0<List<_i13.Currency>>( + _i7.Future<_i2.ExchangeResponse<List<_i14.Currency>>>.value( + _FakeExchangeResponse_0<List<_i14.Currency>>( this, Invocation.method( #getAvailableCurrencies, @@ -673,26 +730,9 @@ class MockChangeNowAPI extends _i1.Mock implements _i11.ChangeNowAPI { }, ), )), - ) as _i6.Future<_i2.ExchangeResponse<List<_i13.Currency>>>); + ) as _i7.Future<_i2.ExchangeResponse<List<_i14.Currency>>>); @override - _i6.Future<_i2.ExchangeResponse<List<_i13.Currency>>> getCurrenciesV2() => - (super.noSuchMethod( - Invocation.method( - #getCurrenciesV2, - [], - ), - returnValue: - _i6.Future<_i2.ExchangeResponse<List<_i13.Currency>>>.value( - _FakeExchangeResponse_0<List<_i13.Currency>>( - this, - Invocation.method( - #getCurrenciesV2, - [], - ), - )), - ) as _i6.Future<_i2.ExchangeResponse<List<_i13.Currency>>>); - @override - _i6.Future<_i2.ExchangeResponse<List<_i13.Currency>>> getPairedCurrencies({ + _i7.Future<_i2.ExchangeResponse<List<_i14.Currency>>> getPairedCurrencies({ required String? ticker, bool? fixedRate, }) => @@ -706,8 +746,8 @@ class MockChangeNowAPI extends _i1.Mock implements _i11.ChangeNowAPI { }, ), returnValue: - _i6.Future<_i2.ExchangeResponse<List<_i13.Currency>>>.value( - _FakeExchangeResponse_0<List<_i13.Currency>>( + _i7.Future<_i2.ExchangeResponse<List<_i14.Currency>>>.value( + _FakeExchangeResponse_0<List<_i14.Currency>>( this, Invocation.method( #getPairedCurrencies, @@ -718,9 +758,9 @@ class MockChangeNowAPI extends _i1.Mock implements _i11.ChangeNowAPI { }, ), )), - ) as _i6.Future<_i2.ExchangeResponse<List<_i13.Currency>>>); + ) as _i7.Future<_i2.ExchangeResponse<List<_i14.Currency>>>); @override - _i6.Future<_i2.ExchangeResponse<_i14.Decimal>> getMinimalExchangeAmount({ + _i7.Future<_i2.ExchangeResponse<_i15.Decimal>> getMinimalExchangeAmount({ required String? fromTicker, required String? toTicker, String? apiKey, @@ -735,8 +775,8 @@ class MockChangeNowAPI extends _i1.Mock implements _i11.ChangeNowAPI { #apiKey: apiKey, }, ), - returnValue: _i6.Future<_i2.ExchangeResponse<_i14.Decimal>>.value( - _FakeExchangeResponse_0<_i14.Decimal>( + returnValue: _i7.Future<_i2.ExchangeResponse<_i15.Decimal>>.value( + _FakeExchangeResponse_0<_i15.Decimal>( this, Invocation.method( #getMinimalExchangeAmount, @@ -748,9 +788,9 @@ class MockChangeNowAPI extends _i1.Mock implements _i11.ChangeNowAPI { }, ), )), - ) as _i6.Future<_i2.ExchangeResponse<_i14.Decimal>>); + ) as _i7.Future<_i2.ExchangeResponse<_i15.Decimal>>); @override - _i6.Future<_i2.ExchangeResponse<_i15.Range>> getRange({ + _i7.Future<_i2.ExchangeResponse<_i16.Range>> getRange({ required String? fromTicker, required String? toTicker, required bool? isFixedRate, @@ -767,8 +807,8 @@ class MockChangeNowAPI extends _i1.Mock implements _i11.ChangeNowAPI { #apiKey: apiKey, }, ), - returnValue: _i6.Future<_i2.ExchangeResponse<_i15.Range>>.value( - _FakeExchangeResponse_0<_i15.Range>( + returnValue: _i7.Future<_i2.ExchangeResponse<_i16.Range>>.value( + _FakeExchangeResponse_0<_i16.Range>( this, Invocation.method( #getRange, @@ -781,12 +821,12 @@ class MockChangeNowAPI extends _i1.Mock implements _i11.ChangeNowAPI { }, ), )), - ) as _i6.Future<_i2.ExchangeResponse<_i15.Range>>); + ) as _i7.Future<_i2.ExchangeResponse<_i16.Range>>); @override - _i6.Future<_i2.ExchangeResponse<_i16.Estimate>> getEstimatedExchangeAmount({ + _i7.Future<_i2.ExchangeResponse<_i17.Estimate>> getEstimatedExchangeAmount({ required String? fromTicker, required String? toTicker, - required _i14.Decimal? fromAmount, + required _i15.Decimal? fromAmount, String? apiKey, }) => (super.noSuchMethod( @@ -800,8 +840,8 @@ class MockChangeNowAPI extends _i1.Mock implements _i11.ChangeNowAPI { #apiKey: apiKey, }, ), - returnValue: _i6.Future<_i2.ExchangeResponse<_i16.Estimate>>.value( - _FakeExchangeResponse_0<_i16.Estimate>( + returnValue: _i7.Future<_i2.ExchangeResponse<_i17.Estimate>>.value( + _FakeExchangeResponse_0<_i17.Estimate>( this, Invocation.method( #getEstimatedExchangeAmount, @@ -814,13 +854,13 @@ class MockChangeNowAPI extends _i1.Mock implements _i11.ChangeNowAPI { }, ), )), - ) as _i6.Future<_i2.ExchangeResponse<_i16.Estimate>>); + ) as _i7.Future<_i2.ExchangeResponse<_i17.Estimate>>); @override - _i6.Future<_i2.ExchangeResponse<_i16.Estimate>> + _i7.Future<_i2.ExchangeResponse<_i17.Estimate>> getEstimatedExchangeAmountFixedRate({ required String? fromTicker, required String? toTicker, - required _i14.Decimal? fromAmount, + required _i15.Decimal? fromAmount, required bool? reversed, bool? useRateId = true, String? apiKey, @@ -838,8 +878,8 @@ class MockChangeNowAPI extends _i1.Mock implements _i11.ChangeNowAPI { #apiKey: apiKey, }, ), - returnValue: _i6.Future<_i2.ExchangeResponse<_i16.Estimate>>.value( - _FakeExchangeResponse_0<_i16.Estimate>( + returnValue: _i7.Future<_i2.ExchangeResponse<_i17.Estimate>>.value( + _FakeExchangeResponse_0<_i17.Estimate>( this, Invocation.method( #getEstimatedExchangeAmountFixedRate, @@ -854,17 +894,17 @@ class MockChangeNowAPI extends _i1.Mock implements _i11.ChangeNowAPI { }, ), )), - ) as _i6.Future<_i2.ExchangeResponse<_i16.Estimate>>); + ) as _i7.Future<_i2.ExchangeResponse<_i17.Estimate>>); @override - _i6.Future<_i2.ExchangeResponse<_i17.CNExchangeEstimate>> + _i7.Future<_i2.ExchangeResponse<_i18.CNExchangeEstimate>> getEstimatedExchangeAmountV2({ required String? fromTicker, required String? toTicker, - required _i17.CNEstimateType? fromOrTo, - required _i14.Decimal? amount, + required _i18.CNEstimateType? fromOrTo, + required _i15.Decimal? amount, String? fromNetwork, String? toNetwork, - _i17.CNFlowType? flow = _i17.CNFlowType.standard, + _i18.CNFlowType? flow = _i18.CNFlowType.standard, String? apiKey, }) => (super.noSuchMethod( @@ -883,8 +923,8 @@ class MockChangeNowAPI extends _i1.Mock implements _i11.ChangeNowAPI { }, ), returnValue: - _i6.Future<_i2.ExchangeResponse<_i17.CNExchangeEstimate>>.value( - _FakeExchangeResponse_0<_i17.CNExchangeEstimate>( + _i7.Future<_i2.ExchangeResponse<_i18.CNExchangeEstimate>>.value( + _FakeExchangeResponse_0<_i18.CNExchangeEstimate>( this, Invocation.method( #getEstimatedExchangeAmountV2, @@ -901,18 +941,18 @@ class MockChangeNowAPI extends _i1.Mock implements _i11.ChangeNowAPI { }, ), )), - ) as _i6.Future<_i2.ExchangeResponse<_i17.CNExchangeEstimate>>); + ) as _i7.Future<_i2.ExchangeResponse<_i18.CNExchangeEstimate>>); @override - _i6.Future<_i2.ExchangeResponse<List<_i18.FixedRateMarket>>> + _i7.Future<_i2.ExchangeResponse<List<_i19.FixedRateMarket>>> getAvailableFixedRateMarkets({String? apiKey}) => (super.noSuchMethod( Invocation.method( #getAvailableFixedRateMarkets, [], {#apiKey: apiKey}, ), - returnValue: _i6.Future< - _i2.ExchangeResponse<List<_i18.FixedRateMarket>>>.value( - _FakeExchangeResponse_0<List<_i18.FixedRateMarket>>( + returnValue: _i7.Future< + _i2.ExchangeResponse<List<_i19.FixedRateMarket>>>.value( + _FakeExchangeResponse_0<List<_i19.FixedRateMarket>>( this, Invocation.method( #getAvailableFixedRateMarkets, @@ -920,14 +960,14 @@ class MockChangeNowAPI extends _i1.Mock implements _i11.ChangeNowAPI { {#apiKey: apiKey}, ), )), - ) as _i6.Future<_i2.ExchangeResponse<List<_i18.FixedRateMarket>>>); + ) as _i7.Future<_i2.ExchangeResponse<List<_i19.FixedRateMarket>>>); @override - _i6.Future<_i2.ExchangeResponse<_i19.ExchangeTransaction>> + _i7.Future<_i2.ExchangeResponse<_i20.ExchangeTransaction>> createStandardExchangeTransaction({ required String? fromTicker, required String? toTicker, required String? receivingAddress, - required _i14.Decimal? amount, + required _i15.Decimal? amount, String? extraId = r'', String? userId = r'', String? contactEmail = r'', @@ -952,9 +992,9 @@ class MockChangeNowAPI extends _i1.Mock implements _i11.ChangeNowAPI { #apiKey: apiKey, }, ), - returnValue: _i6.Future< - _i2.ExchangeResponse<_i19.ExchangeTransaction>>.value( - _FakeExchangeResponse_0<_i19.ExchangeTransaction>( + returnValue: _i7.Future< + _i2.ExchangeResponse<_i20.ExchangeTransaction>>.value( + _FakeExchangeResponse_0<_i20.ExchangeTransaction>( this, Invocation.method( #createStandardExchangeTransaction, @@ -973,14 +1013,14 @@ class MockChangeNowAPI extends _i1.Mock implements _i11.ChangeNowAPI { }, ), )), - ) as _i6.Future<_i2.ExchangeResponse<_i19.ExchangeTransaction>>); + ) as _i7.Future<_i2.ExchangeResponse<_i20.ExchangeTransaction>>); @override - _i6.Future<_i2.ExchangeResponse<_i19.ExchangeTransaction>> + _i7.Future<_i2.ExchangeResponse<_i20.ExchangeTransaction>> createFixedRateExchangeTransaction({ required String? fromTicker, required String? toTicker, required String? receivingAddress, - required _i14.Decimal? amount, + required _i15.Decimal? amount, required String? rateId, required bool? reversed, String? extraId = r'', @@ -1009,9 +1049,9 @@ class MockChangeNowAPI extends _i1.Mock implements _i11.ChangeNowAPI { #apiKey: apiKey, }, ), - returnValue: _i6.Future< - _i2.ExchangeResponse<_i19.ExchangeTransaction>>.value( - _FakeExchangeResponse_0<_i19.ExchangeTransaction>( + returnValue: _i7.Future< + _i2.ExchangeResponse<_i20.ExchangeTransaction>>.value( + _FakeExchangeResponse_0<_i20.ExchangeTransaction>( this, Invocation.method( #createFixedRateExchangeTransaction, @@ -1032,9 +1072,9 @@ class MockChangeNowAPI extends _i1.Mock implements _i11.ChangeNowAPI { }, ), )), - ) as _i6.Future<_i2.ExchangeResponse<_i19.ExchangeTransaction>>); + ) as _i7.Future<_i2.ExchangeResponse<_i20.ExchangeTransaction>>); @override - _i6.Future<_i2.ExchangeResponse<_i20.ExchangeTransactionStatus>> + _i7.Future<_i2.ExchangeResponse<_i21.ExchangeTransactionStatus>> getTransactionStatus({ required String? id, String? apiKey, @@ -1048,9 +1088,9 @@ class MockChangeNowAPI extends _i1.Mock implements _i11.ChangeNowAPI { #apiKey: apiKey, }, ), - returnValue: _i6.Future< - _i2.ExchangeResponse<_i20.ExchangeTransactionStatus>>.value( - _FakeExchangeResponse_0<_i20.ExchangeTransactionStatus>( + returnValue: _i7.Future< + _i2.ExchangeResponse<_i21.ExchangeTransactionStatus>>.value( + _FakeExchangeResponse_0<_i21.ExchangeTransactionStatus>( this, Invocation.method( #getTransactionStatus, @@ -1061,10 +1101,10 @@ class MockChangeNowAPI extends _i1.Mock implements _i11.ChangeNowAPI { }, ), )), - ) as _i6 - .Future<_i2.ExchangeResponse<_i20.ExchangeTransactionStatus>>); + ) as _i7 + .Future<_i2.ExchangeResponse<_i21.ExchangeTransactionStatus>>); @override - _i6.Future<_i2.ExchangeResponse<List<_i21.Pair>>> + _i7.Future<_i2.ExchangeResponse<List<_i22.Pair>>> getAvailableFloatingRatePairs({bool? includePartners = false}) => (super.noSuchMethod( Invocation.method( @@ -1073,8 +1113,8 @@ class MockChangeNowAPI extends _i1.Mock implements _i11.ChangeNowAPI { {#includePartners: includePartners}, ), returnValue: - _i6.Future<_i2.ExchangeResponse<List<_i21.Pair>>>.value( - _FakeExchangeResponse_0<List<_i21.Pair>>( + _i7.Future<_i2.ExchangeResponse<List<_i22.Pair>>>.value( + _FakeExchangeResponse_0<List<_i22.Pair>>( this, Invocation.method( #getAvailableFloatingRatePairs, @@ -1082,5 +1122,5 @@ class MockChangeNowAPI extends _i1.Mock implements _i11.ChangeNowAPI { {#includePartners: includePartners}, ), )), - ) as _i6.Future<_i2.ExchangeResponse<List<_i21.Pair>>>); + ) as _i7.Future<_i2.ExchangeResponse<List<_i22.Pair>>>); } diff --git a/test/screen_tests/lockscreen_view_screen_test.mocks.dart b/test/screen_tests/lockscreen_view_screen_test.mocks.dart index 1a535475b..439ecd5c9 100644 --- a/test/screen_tests/lockscreen_view_screen_test.mocks.dart +++ b/test/screen_tests/lockscreen_view_screen_test.mocks.dart @@ -646,11 +646,6 @@ class MockManager extends _i1.Mock implements _i12.Manager { returnValue: false, ) as bool); @override - bool get hasTokenSupport => (super.noSuchMethod( - Invocation.getter(#hasTokenSupport), - returnValue: false, - ) as bool); - @override bool get hasWhirlpoolSupport => (super.noSuchMethod( Invocation.getter(#hasWhirlpoolSupport), returnValue: false, diff --git a/test/screen_tests/main_view_tests/main_view_screen_testA_test.mocks.dart b/test/screen_tests/main_view_tests/main_view_screen_testA_test.mocks.dart index 4833c56ee..d624d4171 100644 --- a/test/screen_tests/main_view_tests/main_view_screen_testA_test.mocks.dart +++ b/test/screen_tests/main_view_tests/main_view_screen_testA_test.mocks.dart @@ -433,11 +433,6 @@ class MockManager extends _i1.Mock implements _i9.Manager { returnValue: false, ) as bool); @override - bool get hasTokenSupport => (super.noSuchMethod( - Invocation.getter(#hasTokenSupport), - returnValue: false, - ) as bool); - @override bool get hasWhirlpoolSupport => (super.noSuchMethod( Invocation.getter(#hasWhirlpoolSupport), returnValue: false, diff --git a/test/screen_tests/main_view_tests/main_view_screen_testB_test.mocks.dart b/test/screen_tests/main_view_tests/main_view_screen_testB_test.mocks.dart index 33c356d74..70c08470b 100644 --- a/test/screen_tests/main_view_tests/main_view_screen_testB_test.mocks.dart +++ b/test/screen_tests/main_view_tests/main_view_screen_testB_test.mocks.dart @@ -433,11 +433,6 @@ class MockManager extends _i1.Mock implements _i9.Manager { returnValue: false, ) as bool); @override - bool get hasTokenSupport => (super.noSuchMethod( - Invocation.getter(#hasTokenSupport), - returnValue: false, - ) as bool); - @override bool get hasWhirlpoolSupport => (super.noSuchMethod( Invocation.getter(#hasWhirlpoolSupport), returnValue: false, diff --git a/test/screen_tests/main_view_tests/main_view_screen_testC_test.mocks.dart b/test/screen_tests/main_view_tests/main_view_screen_testC_test.mocks.dart index b19d16114..1f2176350 100644 --- a/test/screen_tests/main_view_tests/main_view_screen_testC_test.mocks.dart +++ b/test/screen_tests/main_view_tests/main_view_screen_testC_test.mocks.dart @@ -433,11 +433,6 @@ class MockManager extends _i1.Mock implements _i9.Manager { returnValue: false, ) as bool); @override - bool get hasTokenSupport => (super.noSuchMethod( - Invocation.getter(#hasTokenSupport), - returnValue: false, - ) as bool); - @override bool get hasWhirlpoolSupport => (super.noSuchMethod( Invocation.getter(#hasWhirlpoolSupport), returnValue: false, diff --git a/test/screen_tests/onboarding/backup_key_view_screen_test.mocks.dart b/test/screen_tests/onboarding/backup_key_view_screen_test.mocks.dart index 34a6a36fe..7377d155e 100644 --- a/test/screen_tests/onboarding/backup_key_view_screen_test.mocks.dart +++ b/test/screen_tests/onboarding/backup_key_view_screen_test.mocks.dart @@ -208,11 +208,6 @@ class MockManager extends _i1.Mock implements _i5.Manager { returnValue: false, ) as bool); @override - bool get hasTokenSupport => (super.noSuchMethod( - Invocation.getter(#hasTokenSupport), - returnValue: false, - ) as bool); - @override bool get hasWhirlpoolSupport => (super.noSuchMethod( Invocation.getter(#hasWhirlpoolSupport), returnValue: false, diff --git a/test/screen_tests/onboarding/backup_key_warning_view_screen_test.mocks.dart b/test/screen_tests/onboarding/backup_key_warning_view_screen_test.mocks.dart index f3967ade5..2b31cb96c 100644 --- a/test/screen_tests/onboarding/backup_key_warning_view_screen_test.mocks.dart +++ b/test/screen_tests/onboarding/backup_key_warning_view_screen_test.mocks.dart @@ -431,11 +431,6 @@ class MockManager extends _i1.Mock implements _i9.Manager { returnValue: false, ) as bool); @override - bool get hasTokenSupport => (super.noSuchMethod( - Invocation.getter(#hasTokenSupport), - returnValue: false, - ) as bool); - @override bool get hasWhirlpoolSupport => (super.noSuchMethod( Invocation.getter(#hasWhirlpoolSupport), returnValue: false, diff --git a/test/screen_tests/onboarding/create_pin_view_screen_test.mocks.dart b/test/screen_tests/onboarding/create_pin_view_screen_test.mocks.dart index f1d3b0c4b..54eec30cf 100644 --- a/test/screen_tests/onboarding/create_pin_view_screen_test.mocks.dart +++ b/test/screen_tests/onboarding/create_pin_view_screen_test.mocks.dart @@ -646,11 +646,6 @@ class MockManager extends _i1.Mock implements _i12.Manager { returnValue: false, ) as bool); @override - bool get hasTokenSupport => (super.noSuchMethod( - Invocation.getter(#hasTokenSupport), - returnValue: false, - ) as bool); - @override bool get hasWhirlpoolSupport => (super.noSuchMethod( Invocation.getter(#hasWhirlpoolSupport), returnValue: false, diff --git a/test/screen_tests/onboarding/restore_wallet_view_screen_test.mocks.dart b/test/screen_tests/onboarding/restore_wallet_view_screen_test.mocks.dart index 20ac25812..e92f4d289 100644 --- a/test/screen_tests/onboarding/restore_wallet_view_screen_test.mocks.dart +++ b/test/screen_tests/onboarding/restore_wallet_view_screen_test.mocks.dart @@ -487,11 +487,6 @@ class MockManager extends _i1.Mock implements _i12.Manager { returnValue: false, ) as bool); @override - bool get hasTokenSupport => (super.noSuchMethod( - Invocation.getter(#hasTokenSupport), - returnValue: false, - ) as bool); - @override bool get hasWhirlpoolSupport => (super.noSuchMethod( Invocation.getter(#hasWhirlpoolSupport), returnValue: false, diff --git a/test/screen_tests/onboarding/verify_backup_key_view_screen_test.mocks.dart b/test/screen_tests/onboarding/verify_backup_key_view_screen_test.mocks.dart index 93d4f4874..13a6568c8 100644 --- a/test/screen_tests/onboarding/verify_backup_key_view_screen_test.mocks.dart +++ b/test/screen_tests/onboarding/verify_backup_key_view_screen_test.mocks.dart @@ -208,11 +208,6 @@ class MockManager extends _i1.Mock implements _i5.Manager { returnValue: false, ) as bool); @override - bool get hasTokenSupport => (super.noSuchMethod( - Invocation.getter(#hasTokenSupport), - returnValue: false, - ) as bool); - @override bool get hasWhirlpoolSupport => (super.noSuchMethod( Invocation.getter(#hasWhirlpoolSupport), returnValue: false, diff --git a/test/screen_tests/settings_view/settings_subviews/currency_view_screen_test.mocks.dart b/test/screen_tests/settings_view/settings_subviews/currency_view_screen_test.mocks.dart index cfe9cd50e..82f4bcd3e 100644 --- a/test/screen_tests/settings_view/settings_subviews/currency_view_screen_test.mocks.dart +++ b/test/screen_tests/settings_view/settings_subviews/currency_view_screen_test.mocks.dart @@ -208,11 +208,6 @@ class MockManager extends _i1.Mock implements _i5.Manager { returnValue: false, ) as bool); @override - bool get hasTokenSupport => (super.noSuchMethod( - Invocation.getter(#hasTokenSupport), - returnValue: false, - ) as bool); - @override bool get hasWhirlpoolSupport => (super.noSuchMethod( Invocation.getter(#hasWhirlpoolSupport), returnValue: false, diff --git a/test/screen_tests/settings_view/settings_subviews/network_settings_subviews/add_custom_node_view_screen_test.mocks.dart b/test/screen_tests/settings_view/settings_subviews/network_settings_subviews/add_custom_node_view_screen_test.mocks.dart index 8e5c07700..fc4171b63 100644 --- a/test/screen_tests/settings_view/settings_subviews/network_settings_subviews/add_custom_node_view_screen_test.mocks.dart +++ b/test/screen_tests/settings_view/settings_subviews/network_settings_subviews/add_custom_node_view_screen_test.mocks.dart @@ -423,11 +423,6 @@ class MockManager extends _i1.Mock implements _i11.Manager { returnValue: false, ) as bool); @override - bool get hasTokenSupport => (super.noSuchMethod( - Invocation.getter(#hasTokenSupport), - returnValue: false, - ) as bool); - @override bool get hasWhirlpoolSupport => (super.noSuchMethod( Invocation.getter(#hasWhirlpoolSupport), returnValue: false, diff --git a/test/screen_tests/settings_view/settings_subviews/network_settings_subviews/node_details_view_screen_test.mocks.dart b/test/screen_tests/settings_view/settings_subviews/network_settings_subviews/node_details_view_screen_test.mocks.dart index c3d4a7279..f990ec83a 100644 --- a/test/screen_tests/settings_view/settings_subviews/network_settings_subviews/node_details_view_screen_test.mocks.dart +++ b/test/screen_tests/settings_view/settings_subviews/network_settings_subviews/node_details_view_screen_test.mocks.dart @@ -423,11 +423,6 @@ class MockManager extends _i1.Mock implements _i11.Manager { returnValue: false, ) as bool); @override - bool get hasTokenSupport => (super.noSuchMethod( - Invocation.getter(#hasTokenSupport), - returnValue: false, - ) as bool); - @override bool get hasWhirlpoolSupport => (super.noSuchMethod( Invocation.getter(#hasWhirlpoolSupport), returnValue: false, diff --git a/test/screen_tests/settings_view/settings_subviews/wallet_backup_view_screen_test.mocks.dart b/test/screen_tests/settings_view/settings_subviews/wallet_backup_view_screen_test.mocks.dart index 8efc17d42..44dd68cee 100644 --- a/test/screen_tests/settings_view/settings_subviews/wallet_backup_view_screen_test.mocks.dart +++ b/test/screen_tests/settings_view/settings_subviews/wallet_backup_view_screen_test.mocks.dart @@ -208,11 +208,6 @@ class MockManager extends _i1.Mock implements _i5.Manager { returnValue: false, ) as bool); @override - bool get hasTokenSupport => (super.noSuchMethod( - Invocation.getter(#hasTokenSupport), - returnValue: false, - ) as bool); - @override bool get hasWhirlpoolSupport => (super.noSuchMethod( Invocation.getter(#hasWhirlpoolSupport), returnValue: false, diff --git a/test/screen_tests/settings_view/settings_subviews/wallet_settings_subviews/rescan_warning_view_screen_test.mocks.dart b/test/screen_tests/settings_view/settings_subviews/wallet_settings_subviews/rescan_warning_view_screen_test.mocks.dart index 5f5c9ee97..a7764e149 100644 --- a/test/screen_tests/settings_view/settings_subviews/wallet_settings_subviews/rescan_warning_view_screen_test.mocks.dart +++ b/test/screen_tests/settings_view/settings_subviews/wallet_settings_subviews/rescan_warning_view_screen_test.mocks.dart @@ -208,11 +208,6 @@ class MockManager extends _i1.Mock implements _i5.Manager { returnValue: false, ) as bool); @override - bool get hasTokenSupport => (super.noSuchMethod( - Invocation.getter(#hasTokenSupport), - returnValue: false, - ) as bool); - @override bool get hasWhirlpoolSupport => (super.noSuchMethod( Invocation.getter(#hasWhirlpoolSupport), returnValue: false, diff --git a/test/screen_tests/settings_view/settings_subviews/wallet_settings_subviews/wallet_delete_mnemonic_view_screen_test.mocks.dart b/test/screen_tests/settings_view/settings_subviews/wallet_settings_subviews/wallet_delete_mnemonic_view_screen_test.mocks.dart index c39df921e..4c7dbfd7a 100644 --- a/test/screen_tests/settings_view/settings_subviews/wallet_settings_subviews/wallet_delete_mnemonic_view_screen_test.mocks.dart +++ b/test/screen_tests/settings_view/settings_subviews/wallet_settings_subviews/wallet_delete_mnemonic_view_screen_test.mocks.dart @@ -431,11 +431,6 @@ class MockManager extends _i1.Mock implements _i9.Manager { returnValue: false, ) as bool); @override - bool get hasTokenSupport => (super.noSuchMethod( - Invocation.getter(#hasTokenSupport), - returnValue: false, - ) as bool); - @override bool get hasWhirlpoolSupport => (super.noSuchMethod( Invocation.getter(#hasWhirlpoolSupport), returnValue: false, diff --git a/test/screen_tests/settings_view/settings_subviews/wallet_settings_view_screen_test.mocks.dart b/test/screen_tests/settings_view/settings_subviews/wallet_settings_view_screen_test.mocks.dart index 6f3828684..e736cfdd8 100644 --- a/test/screen_tests/settings_view/settings_subviews/wallet_settings_view_screen_test.mocks.dart +++ b/test/screen_tests/settings_view/settings_subviews/wallet_settings_view_screen_test.mocks.dart @@ -688,11 +688,6 @@ class MockManager extends _i1.Mock implements _i15.Manager { returnValue: false, ) as bool); @override - bool get hasTokenSupport => (super.noSuchMethod( - Invocation.getter(#hasTokenSupport), - returnValue: false, - ) as bool); - @override bool get hasWhirlpoolSupport => (super.noSuchMethod( Invocation.getter(#hasWhirlpoolSupport), returnValue: false, diff --git a/test/screen_tests/settings_view/settings_view_screen_test.mocks.dart b/test/screen_tests/settings_view/settings_view_screen_test.mocks.dart index ea371aad5..be1b24bcb 100644 --- a/test/screen_tests/settings_view/settings_view_screen_test.mocks.dart +++ b/test/screen_tests/settings_view/settings_view_screen_test.mocks.dart @@ -431,11 +431,6 @@ class MockManager extends _i1.Mock implements _i9.Manager { returnValue: false, ) as bool); @override - bool get hasTokenSupport => (super.noSuchMethod( - Invocation.getter(#hasTokenSupport), - returnValue: false, - ) as bool); - @override bool get hasWhirlpoolSupport => (super.noSuchMethod( Invocation.getter(#hasWhirlpoolSupport), returnValue: false, diff --git a/test/screen_tests/transaction_subviews/transaction_search_results_view_screen_test.mocks.dart b/test/screen_tests/transaction_subviews/transaction_search_results_view_screen_test.mocks.dart index 9b4056348..7cf8968b1 100644 --- a/test/screen_tests/transaction_subviews/transaction_search_results_view_screen_test.mocks.dart +++ b/test/screen_tests/transaction_subviews/transaction_search_results_view_screen_test.mocks.dart @@ -210,11 +210,6 @@ class MockManager extends _i1.Mock implements _i5.Manager { returnValue: false, ) as bool); @override - bool get hasTokenSupport => (super.noSuchMethod( - Invocation.getter(#hasTokenSupport), - returnValue: false, - ) as bool); - @override bool get hasWhirlpoolSupport => (super.noSuchMethod( Invocation.getter(#hasWhirlpoolSupport), returnValue: false, diff --git a/test/screen_tests/wallet_view/confirm_send_view_screen_test.mocks.dart b/test/screen_tests/wallet_view/confirm_send_view_screen_test.mocks.dart index b0e4bcc7d..81980dca0 100644 --- a/test/screen_tests/wallet_view/confirm_send_view_screen_test.mocks.dart +++ b/test/screen_tests/wallet_view/confirm_send_view_screen_test.mocks.dart @@ -209,11 +209,6 @@ class MockManager extends _i1.Mock implements _i5.Manager { returnValue: false, ) as bool); @override - bool get hasTokenSupport => (super.noSuchMethod( - Invocation.getter(#hasTokenSupport), - returnValue: false, - ) as bool); - @override bool get hasWhirlpoolSupport => (super.noSuchMethod( Invocation.getter(#hasWhirlpoolSupport), returnValue: false, diff --git a/test/screen_tests/wallet_view/receive_view_screen_test.mocks.dart b/test/screen_tests/wallet_view/receive_view_screen_test.mocks.dart index 6c02b46e1..3055cf6c6 100644 --- a/test/screen_tests/wallet_view/receive_view_screen_test.mocks.dart +++ b/test/screen_tests/wallet_view/receive_view_screen_test.mocks.dart @@ -208,11 +208,6 @@ class MockManager extends _i1.Mock implements _i5.Manager { returnValue: false, ) as bool); @override - bool get hasTokenSupport => (super.noSuchMethod( - Invocation.getter(#hasTokenSupport), - returnValue: false, - ) as bool); - @override bool get hasWhirlpoolSupport => (super.noSuchMethod( Invocation.getter(#hasWhirlpoolSupport), returnValue: false, diff --git a/test/screen_tests/wallet_view/send_view_screen_test.mocks.dart b/test/screen_tests/wallet_view/send_view_screen_test.mocks.dart index b3fcf528f..533578e6c 100644 --- a/test/screen_tests/wallet_view/send_view_screen_test.mocks.dart +++ b/test/screen_tests/wallet_view/send_view_screen_test.mocks.dart @@ -250,11 +250,6 @@ class MockManager extends _i1.Mock implements _i8.Manager { returnValue: false, ) as bool); @override - bool get hasTokenSupport => (super.noSuchMethod( - Invocation.getter(#hasTokenSupport), - returnValue: false, - ) as bool); - @override bool get hasWhirlpoolSupport => (super.noSuchMethod( Invocation.getter(#hasWhirlpoolSupport), returnValue: false, diff --git a/test/screen_tests/wallet_view/wallet_view_screen_test.mocks.dart b/test/screen_tests/wallet_view/wallet_view_screen_test.mocks.dart index 5cbb93bc1..f71a62d92 100644 --- a/test/screen_tests/wallet_view/wallet_view_screen_test.mocks.dart +++ b/test/screen_tests/wallet_view/wallet_view_screen_test.mocks.dart @@ -210,11 +210,6 @@ class MockManager extends _i1.Mock implements _i5.Manager { returnValue: false, ) as bool); @override - bool get hasTokenSupport => (super.noSuchMethod( - Invocation.getter(#hasTokenSupport), - returnValue: false, - ) as bool); - @override bool get hasWhirlpoolSupport => (super.noSuchMethod( Invocation.getter(#hasWhirlpoolSupport), returnValue: false, diff --git a/test/widget_tests/managed_favorite_test.mocks.dart b/test/widget_tests/managed_favorite_test.mocks.dart index 5abf517b7..f8bda0845 100644 --- a/test/widget_tests/managed_favorite_test.mocks.dart +++ b/test/widget_tests/managed_favorite_test.mocks.dart @@ -13,7 +13,7 @@ import 'package:bitcoindart/bitcoindart.dart' as _i13; import 'package:flutter/foundation.dart' as _i4; import 'package:flutter_riverpod/flutter_riverpod.dart' as _i5; import 'package:mockito/mockito.dart' as _i1; -import 'package:stackwallet/db/isar/main_db.dart' as _i12; +import 'package:stackwallet/db/main_db.dart' as _i12; import 'package:stackwallet/electrumx_rpc/cached_electrumx.dart' as _i10; import 'package:stackwallet/electrumx_rpc/electrumx.dart' as _i9; import 'package:stackwallet/models/balance.dart' as _i11; @@ -1432,25 +1432,6 @@ class MockBitcoinWallet extends _i1.Mock implements _i25.BitcoinWallet { returnValueForMissingStub: _i22.Future<void>.value(), ) as _i22.Future<void>); @override - List<String> getWalletTokenContractAddresses() => (super.noSuchMethod( - Invocation.method( - #getWalletTokenContractAddresses, - [], - ), - returnValue: <String>[], - ) as List<String>); - @override - _i22.Future<void> updateWalletTokenContractAddresses( - List<String>? contractAddresses) => - (super.noSuchMethod( - Invocation.method( - #updateWalletTokenContractAddresses, - [contractAddresses], - ), - returnValue: _i22.Future<void>.value(), - returnValueForMissingStub: _i22.Future<void>.value(), - ) as _i22.Future<void>); - @override void initWalletDB({_i12.MainDB? mockableOverride}) => super.noSuchMethod( Invocation.method( #initWalletDB, @@ -2430,11 +2411,6 @@ class MockManager extends _i1.Mock implements _i6.Manager { returnValue: false, ) as bool); @override - bool get hasTokenSupport => (super.noSuchMethod( - Invocation.getter(#hasTokenSupport), - returnValue: false, - ) as bool); - @override bool get hasWhirlpoolSupport => (super.noSuchMethod( Invocation.getter(#hasWhirlpoolSupport), returnValue: false, diff --git a/test/widget_tests/node_options_sheet_test.mocks.dart b/test/widget_tests/node_options_sheet_test.mocks.dart index 862afbb16..84f013ddb 100644 --- a/test/widget_tests/node_options_sheet_test.mocks.dart +++ b/test/widget_tests/node_options_sheet_test.mocks.dart @@ -9,7 +9,7 @@ import 'dart:ui' as _i13; import 'package:flutter/foundation.dart' as _i4; import 'package:flutter_riverpod/flutter_riverpod.dart' as _i5; import 'package:mockito/mockito.dart' as _i1; -import 'package:stackwallet/models/node_model.dart' as _i16; +import 'package:stackwallet/models/node_model.dart' as _i17; import 'package:stackwallet/services/coins/manager.dart' as _i6; import 'package:stackwallet/services/node_service.dart' as _i3; import 'package:stackwallet/services/wallets.dart' as _i8; @@ -20,6 +20,7 @@ import 'package:stackwallet/utilities/enums/sync_type_enum.dart' as _i14; import 'package:stackwallet/utilities/flutter_secure_storage_interface.dart' as _i7; import 'package:stackwallet/utilities/prefs.dart' as _i12; +import 'package:stackwallet/utilities/theme/color_theme.dart' as _i16; import 'package:tuple/tuple.dart' as _i10; // ignore_for_file: type=lint @@ -574,6 +575,61 @@ class MockPrefs extends _i1.Mock implements _i12.Prefs { returnValueForMissingStub: null, ); @override + bool get enableSystemBrightness => (super.noSuchMethod( + Invocation.getter(#enableSystemBrightness), + returnValue: false, + ) as bool); + @override + set enableSystemBrightness(bool? enableSystemBrightness) => + super.noSuchMethod( + Invocation.setter( + #enableSystemBrightness, + enableSystemBrightness, + ), + returnValueForMissingStub: null, + ); + @override + _i16.ThemeType get theme => (super.noSuchMethod( + Invocation.getter(#theme), + returnValue: _i16.ThemeType.light, + ) as _i16.ThemeType); + @override + set theme(_i16.ThemeType? theme) => super.noSuchMethod( + Invocation.setter( + #theme, + theme, + ), + returnValueForMissingStub: null, + ); + @override + _i16.ThemeType get systemBrightnessLightTheme => (super.noSuchMethod( + Invocation.getter(#systemBrightnessLightTheme), + returnValue: _i16.ThemeType.light, + ) as _i16.ThemeType); + @override + set systemBrightnessLightTheme(_i16.ThemeType? systemBrightnessLightTheme) => + super.noSuchMethod( + Invocation.setter( + #systemBrightnessLightTheme, + systemBrightnessLightTheme, + ), + returnValueForMissingStub: null, + ); + @override + _i16.ThemeType get systemBrightnessDarkTheme => (super.noSuchMethod( + Invocation.getter(#systemBrightnessDarkTheme), + returnValue: _i16.ThemeType.light, + ) as _i16.ThemeType); + @override + set systemBrightnessDarkTheme(_i16.ThemeType? systemBrightnessDarkTheme) => + super.noSuchMethod( + Invocation.setter( + #systemBrightnessDarkTheme, + systemBrightnessDarkTheme, + ), + returnValueForMissingStub: null, + ); + @override bool get hasListeners => (super.noSuchMethod( Invocation.getter(#hasListeners), returnValue: false, @@ -673,15 +729,15 @@ class MockNodeService extends _i1.Mock implements _i3.NodeService { ), ) as _i7.SecureStorageInterface); @override - List<_i16.NodeModel> get primaryNodes => (super.noSuchMethod( + List<_i17.NodeModel> get primaryNodes => (super.noSuchMethod( Invocation.getter(#primaryNodes), - returnValue: <_i16.NodeModel>[], - ) as List<_i16.NodeModel>); + returnValue: <_i17.NodeModel>[], + ) as List<_i17.NodeModel>); @override - List<_i16.NodeModel> get nodes => (super.noSuchMethod( + List<_i17.NodeModel> get nodes => (super.noSuchMethod( Invocation.getter(#nodes), - returnValue: <_i16.NodeModel>[], - ) as List<_i16.NodeModel>); + returnValue: <_i17.NodeModel>[], + ) as List<_i17.NodeModel>); @override bool get hasListeners => (super.noSuchMethod( Invocation.getter(#hasListeners), @@ -699,7 +755,7 @@ class MockNodeService extends _i1.Mock implements _i3.NodeService { @override _i11.Future<void> setPrimaryNodeFor({ required _i9.Coin? coin, - required _i16.NodeModel? node, + required _i17.NodeModel? node, bool? shouldNotifyListeners = false, }) => (super.noSuchMethod( @@ -716,40 +772,40 @@ class MockNodeService extends _i1.Mock implements _i3.NodeService { returnValueForMissingStub: _i11.Future<void>.value(), ) as _i11.Future<void>); @override - _i16.NodeModel? getPrimaryNodeFor({required _i9.Coin? coin}) => + _i17.NodeModel? getPrimaryNodeFor({required _i9.Coin? coin}) => (super.noSuchMethod(Invocation.method( #getPrimaryNodeFor, [], {#coin: coin}, - )) as _i16.NodeModel?); + )) as _i17.NodeModel?); @override - List<_i16.NodeModel> getNodesFor(_i9.Coin? coin) => (super.noSuchMethod( + List<_i17.NodeModel> getNodesFor(_i9.Coin? coin) => (super.noSuchMethod( Invocation.method( #getNodesFor, [coin], ), - returnValue: <_i16.NodeModel>[], - ) as List<_i16.NodeModel>); + returnValue: <_i17.NodeModel>[], + ) as List<_i17.NodeModel>); @override - _i16.NodeModel? getNodeById({required String? id}) => + _i17.NodeModel? getNodeById({required String? id}) => (super.noSuchMethod(Invocation.method( #getNodeById, [], {#id: id}, - )) as _i16.NodeModel?); + )) as _i17.NodeModel?); @override - List<_i16.NodeModel> failoverNodesFor({required _i9.Coin? coin}) => + List<_i17.NodeModel> failoverNodesFor({required _i9.Coin? coin}) => (super.noSuchMethod( Invocation.method( #failoverNodesFor, [], {#coin: coin}, ), - returnValue: <_i16.NodeModel>[], - ) as List<_i16.NodeModel>); + returnValue: <_i17.NodeModel>[], + ) as List<_i17.NodeModel>); @override _i11.Future<void> add( - _i16.NodeModel? node, + _i17.NodeModel? node, String? password, bool? shouldNotifyListeners, ) => @@ -801,7 +857,7 @@ class MockNodeService extends _i1.Mock implements _i3.NodeService { ) as _i11.Future<void>); @override _i11.Future<void> edit( - _i16.NodeModel? editedNode, + _i17.NodeModel? editedNode, String? password, bool? shouldNotifyListeners, ) => diff --git a/test/widget_tests/table_view/table_view_row_test.mocks.dart b/test/widget_tests/table_view/table_view_row_test.mocks.dart index cc022b12e..84cfac4c8 100644 --- a/test/widget_tests/table_view/table_view_row_test.mocks.dart +++ b/test/widget_tests/table_view/table_view_row_test.mocks.dart @@ -13,7 +13,7 @@ import 'package:bitcoindart/bitcoindart.dart' as _i13; import 'package:flutter/foundation.dart' as _i4; import 'package:flutter_riverpod/flutter_riverpod.dart' as _i5; import 'package:mockito/mockito.dart' as _i1; -import 'package:stackwallet/db/isar/main_db.dart' as _i12; +import 'package:stackwallet/db/main_db.dart' as _i12; import 'package:stackwallet/electrumx_rpc/cached_electrumx.dart' as _i10; import 'package:stackwallet/electrumx_rpc/electrumx.dart' as _i9; import 'package:stackwallet/models/balance.dart' as _i11; @@ -1419,25 +1419,6 @@ class MockBitcoinWallet extends _i1.Mock implements _i24.BitcoinWallet { returnValueForMissingStub: _i21.Future<void>.value(), ) as _i21.Future<void>); @override - List<String> getWalletTokenContractAddresses() => (super.noSuchMethod( - Invocation.method( - #getWalletTokenContractAddresses, - [], - ), - returnValue: <String>[], - ) as List<String>); - @override - _i21.Future<void> updateWalletTokenContractAddresses( - List<String>? contractAddresses) => - (super.noSuchMethod( - Invocation.method( - #updateWalletTokenContractAddresses, - [contractAddresses], - ), - returnValue: _i21.Future<void>.value(), - returnValueForMissingStub: _i21.Future<void>.value(), - ) as _i21.Future<void>); - @override void initWalletDB({_i12.MainDB? mockableOverride}) => super.noSuchMethod( Invocation.method( #initWalletDB, @@ -2155,11 +2136,6 @@ class MockManager extends _i1.Mock implements _i6.Manager { returnValue: false, ) as bool); @override - bool get hasTokenSupport => (super.noSuchMethod( - Invocation.getter(#hasTokenSupport), - returnValue: false, - ) as bool); - @override bool get hasWhirlpoolSupport => (super.noSuchMethod( Invocation.getter(#hasWhirlpoolSupport), returnValue: false, diff --git a/test/widget_tests/transaction_card_test.mocks.dart b/test/widget_tests/transaction_card_test.mocks.dart index ba9b854b5..51afbec22 100644 --- a/test/widget_tests/transaction_card_test.mocks.dart +++ b/test/widget_tests/transaction_card_test.mocks.dart @@ -10,7 +10,7 @@ import 'package:decimal/decimal.dart' as _i14; import 'package:flutter/foundation.dart' as _i4; import 'package:flutter_riverpod/flutter_riverpod.dart' as _i5; import 'package:mockito/mockito.dart' as _i1; -import 'package:stackwallet/db/isar/main_db.dart' as _i13; +import 'package:stackwallet/db/main_db.dart' as _i13; import 'package:stackwallet/electrumx_rpc/cached_electrumx.dart' as _i12; import 'package:stackwallet/electrumx_rpc/electrumx.dart' as _i11; import 'package:stackwallet/models/balance.dart' as _i9; @@ -22,8 +22,8 @@ import 'package:stackwallet/services/coins/firo/firo_wallet.dart' as _i22; import 'package:stackwallet/services/coins/manager.dart' as _i6; import 'package:stackwallet/services/locale_service.dart' as _i24; import 'package:stackwallet/services/node_service.dart' as _i3; -import 'package:stackwallet/services/notes_service.dart' as _i28; -import 'package:stackwallet/services/price_service.dart' as _i27; +import 'package:stackwallet/services/notes_service.dart' as _i29; +import 'package:stackwallet/services/price_service.dart' as _i28; import 'package:stackwallet/services/transaction_notification_tracker.dart' as _i10; import 'package:stackwallet/services/wallets.dart' as _i16; @@ -32,6 +32,7 @@ import 'package:stackwallet/utilities/enums/backup_frequency_type.dart' as _i26; import 'package:stackwallet/utilities/enums/coin_enum.dart' as _i17; import 'package:stackwallet/utilities/enums/sync_type_enum.dart' as _i25; import 'package:stackwallet/utilities/prefs.dart' as _i19; +import 'package:stackwallet/utilities/theme/color_theme.dart' as _i27; import 'package:tuple/tuple.dart' as _i15; // ignore_for_file: type=lint @@ -555,11 +556,6 @@ class MockManager extends _i1.Mock implements _i6.Manager { returnValue: false, ) as bool); @override - bool get hasTokenSupport => (super.noSuchMethod( - Invocation.getter(#hasTokenSupport), - returnValue: false, - ) as bool); - @override bool get hasWhirlpoolSupport => (super.noSuchMethod( Invocation.getter(#hasWhirlpoolSupport), returnValue: false, @@ -1960,25 +1956,6 @@ class MockFiroWallet extends _i1.Mock implements _i22.FiroWallet { returnValueForMissingStub: _i18.Future<void>.value(), ) as _i18.Future<void>); @override - List<String> getWalletTokenContractAddresses() => (super.noSuchMethod( - Invocation.method( - #getWalletTokenContractAddresses, - [], - ), - returnValue: <String>[], - ) as List<String>); - @override - _i18.Future<void> updateWalletTokenContractAddresses( - List<String>? contractAddresses) => - (super.noSuchMethod( - Invocation.method( - #updateWalletTokenContractAddresses, - [contractAddresses], - ), - returnValue: _i18.Future<void>.value(), - returnValueForMissingStub: _i18.Future<void>.value(), - ) as _i18.Future<void>); - @override void initWalletDB({_i13.MainDB? mockableOverride}) => super.noSuchMethod( Invocation.method( #initWalletDB, @@ -2368,6 +2345,61 @@ class MockPrefs extends _i1.Mock implements _i19.Prefs { returnValueForMissingStub: null, ); @override + bool get enableSystemBrightness => (super.noSuchMethod( + Invocation.getter(#enableSystemBrightness), + returnValue: false, + ) as bool); + @override + set enableSystemBrightness(bool? enableSystemBrightness) => + super.noSuchMethod( + Invocation.setter( + #enableSystemBrightness, + enableSystemBrightness, + ), + returnValueForMissingStub: null, + ); + @override + _i27.ThemeType get theme => (super.noSuchMethod( + Invocation.getter(#theme), + returnValue: _i27.ThemeType.light, + ) as _i27.ThemeType); + @override + set theme(_i27.ThemeType? theme) => super.noSuchMethod( + Invocation.setter( + #theme, + theme, + ), + returnValueForMissingStub: null, + ); + @override + _i27.ThemeType get systemBrightnessLightTheme => (super.noSuchMethod( + Invocation.getter(#systemBrightnessLightTheme), + returnValue: _i27.ThemeType.light, + ) as _i27.ThemeType); + @override + set systemBrightnessLightTheme(_i27.ThemeType? systemBrightnessLightTheme) => + super.noSuchMethod( + Invocation.setter( + #systemBrightnessLightTheme, + systemBrightnessLightTheme, + ), + returnValueForMissingStub: null, + ); + @override + _i27.ThemeType get systemBrightnessDarkTheme => (super.noSuchMethod( + Invocation.getter(#systemBrightnessDarkTheme), + returnValue: _i27.ThemeType.light, + ) as _i27.ThemeType); + @override + set systemBrightnessDarkTheme(_i27.ThemeType? systemBrightnessDarkTheme) => + super.noSuchMethod( + Invocation.setter( + #systemBrightnessDarkTheme, + systemBrightnessDarkTheme, + ), + returnValueForMissingStub: null, + ); + @override bool get hasListeners => (super.noSuchMethod( Invocation.getter(#hasListeners), returnValue: false, @@ -2453,7 +2485,7 @@ class MockPrefs extends _i1.Mock implements _i19.Prefs { /// A class which mocks [PriceService]. /// /// See the documentation for Mockito's code generation for more information. -class MockPriceService extends _i1.Mock implements _i27.PriceService { +class MockPriceService extends _i1.Mock implements _i28.PriceService { MockPriceService() { _i1.throwOnMissingStub(this); } @@ -2500,21 +2532,6 @@ class MockPriceService extends _i1.Mock implements _i27.PriceService { ), ) as _i15.Tuple2<_i14.Decimal, double>); @override - _i15.Tuple2<_i14.Decimal, double> getTokenPrice(String? contractAddress) => - (super.noSuchMethod( - Invocation.method( - #getTokenPrice, - [contractAddress], - ), - returnValue: _FakeTuple2_13<_i14.Decimal, double>( - this, - Invocation.method( - #getTokenPrice, - [contractAddress], - ), - ), - ) as _i15.Tuple2<_i14.Decimal, double>); - @override _i18.Future<void> updatePrice() => (super.noSuchMethod( Invocation.method( #updatePrice, @@ -2576,7 +2593,7 @@ class MockPriceService extends _i1.Mock implements _i27.PriceService { /// A class which mocks [NotesService]. /// /// See the documentation for Mockito's code generation for more information. -class MockNotesService extends _i1.Mock implements _i28.NotesService { +class MockNotesService extends _i1.Mock implements _i29.NotesService { MockNotesService() { _i1.throwOnMissingStub(this); } diff --git a/test/widget_tests/wallet_info_row/sub_widgets/wallet_info_row_balance_future_test.mocks.dart b/test/widget_tests/wallet_info_row/sub_widgets/wallet_info_row_balance_future_test.mocks.dart index 5c2641dbb..028cd047e 100644 --- a/test/widget_tests/wallet_info_row/sub_widgets/wallet_info_row_balance_future_test.mocks.dart +++ b/test/widget_tests/wallet_info_row/sub_widgets/wallet_info_row_balance_future_test.mocks.dart @@ -13,7 +13,7 @@ import 'package:bitcoindart/bitcoindart.dart' as _i13; import 'package:flutter/foundation.dart' as _i4; import 'package:flutter_riverpod/flutter_riverpod.dart' as _i5; import 'package:mockito/mockito.dart' as _i1; -import 'package:stackwallet/db/isar/main_db.dart' as _i12; +import 'package:stackwallet/db/main_db.dart' as _i12; import 'package:stackwallet/electrumx_rpc/cached_electrumx.dart' as _i10; import 'package:stackwallet/electrumx_rpc/electrumx.dart' as _i9; import 'package:stackwallet/models/balance.dart' as _i11; @@ -1431,25 +1431,6 @@ class MockBitcoinWallet extends _i1.Mock implements _i25.BitcoinWallet { returnValueForMissingStub: _i22.Future<void>.value(), ) as _i22.Future<void>); @override - List<String> getWalletTokenContractAddresses() => (super.noSuchMethod( - Invocation.method( - #getWalletTokenContractAddresses, - [], - ), - returnValue: <String>[], - ) as List<String>); - @override - _i22.Future<void> updateWalletTokenContractAddresses( - List<String>? contractAddresses) => - (super.noSuchMethod( - Invocation.method( - #updateWalletTokenContractAddresses, - [contractAddresses], - ), - returnValue: _i22.Future<void>.value(), - returnValueForMissingStub: _i22.Future<void>.value(), - ) as _i22.Future<void>); - @override void initWalletDB({_i12.MainDB? mockableOverride}) => super.noSuchMethod( Invocation.method( #initWalletDB, @@ -2367,11 +2348,6 @@ class MockManager extends _i1.Mock implements _i6.Manager { returnValue: false, ) as bool); @override - bool get hasTokenSupport => (super.noSuchMethod( - Invocation.getter(#hasTokenSupport), - returnValue: false, - ) as bool); - @override bool get hasWhirlpoolSupport => (super.noSuchMethod( Invocation.getter(#hasWhirlpoolSupport), returnValue: false, diff --git a/test/widget_tests/wallet_info_row/wallet_info_row_test.mocks.dart b/test/widget_tests/wallet_info_row/wallet_info_row_test.mocks.dart index 1f786dbab..8b75cb42e 100644 --- a/test/widget_tests/wallet_info_row/wallet_info_row_test.mocks.dart +++ b/test/widget_tests/wallet_info_row/wallet_info_row_test.mocks.dart @@ -13,7 +13,7 @@ import 'package:bitcoindart/bitcoindart.dart' as _i13; import 'package:flutter/foundation.dart' as _i4; import 'package:flutter_riverpod/flutter_riverpod.dart' as _i5; import 'package:mockito/mockito.dart' as _i1; -import 'package:stackwallet/db/isar/main_db.dart' as _i12; +import 'package:stackwallet/db/main_db.dart' as _i12; import 'package:stackwallet/electrumx_rpc/cached_electrumx.dart' as _i10; import 'package:stackwallet/electrumx_rpc/electrumx.dart' as _i9; import 'package:stackwallet/models/balance.dart' as _i11; @@ -1431,25 +1431,6 @@ class MockBitcoinWallet extends _i1.Mock implements _i25.BitcoinWallet { returnValueForMissingStub: _i22.Future<void>.value(), ) as _i22.Future<void>); @override - List<String> getWalletTokenContractAddresses() => (super.noSuchMethod( - Invocation.method( - #getWalletTokenContractAddresses, - [], - ), - returnValue: <String>[], - ) as List<String>); - @override - _i22.Future<void> updateWalletTokenContractAddresses( - List<String>? contractAddresses) => - (super.noSuchMethod( - Invocation.method( - #updateWalletTokenContractAddresses, - [contractAddresses], - ), - returnValue: _i22.Future<void>.value(), - returnValueForMissingStub: _i22.Future<void>.value(), - ) as _i22.Future<void>); - @override void initWalletDB({_i12.MainDB? mockableOverride}) => super.noSuchMethod( Invocation.method( #initWalletDB, @@ -2367,11 +2348,6 @@ class MockManager extends _i1.Mock implements _i6.Manager { returnValue: false, ) as bool); @override - bool get hasTokenSupport => (super.noSuchMethod( - Invocation.getter(#hasTokenSupport), - returnValue: false, - ) as bool); - @override bool get hasWhirlpoolSupport => (super.noSuchMethod( Invocation.getter(#hasWhirlpoolSupport), returnValue: false,