Merge pull request #534 from cypherstack/ui-fixes

Clean up and fixes for bugs found while porting themes to Duo
This commit is contained in:
julian-CStack 2023-05-15 14:21:32 -06:00 committed by GitHub
commit de3e527f95
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
45 changed files with 1058 additions and 715 deletions

View file

@ -178,9 +178,6 @@ void main() async {
}
}
//Add Themes directory - TODO
// await StackFileSystem.applicationThemesDirectory();
monero.onStartup();
wownero.onStartup();

View file

@ -794,6 +794,15 @@ class StackTheme {
Color? _bottomNavIconIcon;
final int bottomNavIconIconInt;
// ==== bottomNavIconIcon highlighted =====================================================
@ignore
Color get bottomNavIconIconHighlighted =>
_bottomNavIconIconHighlighted ??= Color(bottomNavIconIconHighlightedInt);
@ignore
Color? _bottomNavIconIconHighlighted;
final int bottomNavIconIconHighlightedInt;
// ==== topNavIconPrimary =====================================================
@ignore
@ -1556,6 +1565,7 @@ class StackTheme {
required this.snackBarTextInfoInt,
required this.bottomNavIconBackInt,
required this.bottomNavIconIconInt,
required this.bottomNavIconIconHighlightedInt,
required this.topNavIconPrimaryInt,
required this.topNavIconGreenInt,
required this.topNavIconYellowInt,
@ -1795,6 +1805,8 @@ class StackTheme {
parseColor(json["colors"]["bottom_nav_icon_back"] as String),
bottomNavIconIconInt:
parseColor(json["colors"]["bottom_nav_icon_icon"] as String),
bottomNavIconIconHighlightedInt: parseColor(
json["colors"]["bottom_nav_icon_icon_highlighted"] as String),
topNavIconPrimaryInt:
parseColor(json["colors"]["top_nav_icon_primary"] as String),
topNavIconGreenInt:

File diff suppressed because it is too large Load diff

View file

@ -1,7 +1,14 @@
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_svg/svg.dart';
import 'package:stackwallet/models/isar/stack_theme.dart';
import 'package:stackwallet/models/notification_model.dart';
import 'package:stackwallet/themes/coin_icon_provider.dart';
import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/themes/theme_providers.dart';
import 'package:stackwallet/utilities/enums/coin_enum.dart';
import 'package:stackwallet/utilities/format.dart';
import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/utilities/util.dart';
@ -9,7 +16,7 @@ import 'package:stackwallet/widgets/conditional_parent.dart';
import 'package:stackwallet/widgets/rounded_container.dart';
import 'package:stackwallet/widgets/rounded_white_container.dart';
class NotificationCard extends StatelessWidget {
class NotificationCard extends ConsumerWidget {
const NotificationCard({
Key? key,
required this.notification,
@ -25,8 +32,17 @@ class NotificationCard extends StatelessWidget {
static const double mobileIconSize = 24;
static const double desktopIconSize = 30;
String coinIconPath(ThemeAssets assets, WidgetRef ref) {
try {
final coin = coinFromPrettyName(notification.coinName);
return ref.read(coinIconProvider(coin));
} catch (_) {
return notification.iconAssetName;
}
}
@override
Widget build(BuildContext context) {
Widget build(BuildContext context, WidgetRef ref) {
final isDesktop = Util.isDesktop;
return Stack(
@ -41,8 +57,14 @@ class NotificationCard extends StatelessWidget {
child: Row(
children: [
notification.changeNowId == null
? SvgPicture.asset(
notification.iconAssetName,
? SvgPicture.file(
File(
coinIconPath(
ref.watch(
themeProvider.select((value) => value.assets),
),
ref),
),
width: isDesktop ? desktopIconSize : mobileIconSize,
height: isDesktop ? desktopIconSize : mobileIconSize,
)
@ -53,8 +75,14 @@ class NotificationCard extends StatelessWidget {
color: Colors.transparent,
borderRadius: BorderRadius.circular(24),
),
child: SvgPicture.asset(
notification.iconAssetName,
child: SvgPicture.file(
File(
coinIconPath(
ref.watch(
themeProvider.select((value) => value.assets),
),
ref),
),
color: Theme.of(context)
.extension<StackColors>()!
.accentColorDark,

View file

@ -1,9 +1,11 @@
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_svg/svg.dart';
import 'package:stackwallet/providers/global/prefs_provider.dart';
import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/themes/coin_image_provider.dart';
import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/utilities/constants.dart';
import 'package:stackwallet/utilities/enums/coin_enum.dart';
import 'package:stackwallet/utilities/text_styles.dart';
@ -87,8 +89,10 @@ class CoinSelectSheet extends StatelessWidget {
padding: const EdgeInsets.all(12),
child: Row(
children: [
SvgPicture.asset(
ref.watch(coinImageProvider(coin)),
SvgPicture.file(
File(
ref.watch(coinImageProvider(coin)),
),
height: 20,
width: 20,
),

View file

@ -1,3 +1,5 @@
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
@ -13,8 +15,8 @@ import 'package:stackwallet/providers/global/address_book_service_provider.dart'
import 'package:stackwallet/providers/providers.dart';
import 'package:stackwallet/providers/ui/address_book_providers/address_entry_data_provider.dart';
import 'package:stackwallet/services/coins/manager.dart';
import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/themes/coin_icon_provider.dart';
import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/utilities/assets.dart';
import 'package:stackwallet/utilities/clipboard_interface.dart';
import 'package:stackwallet/utilities/enums/coin_enum.dart';
@ -334,8 +336,10 @@ class _ContactDetailsViewState extends ConsumerState<ContactDetailsView> {
padding: const EdgeInsets.all(12),
child: Row(
children: [
SvgPicture.asset(
ref.watch(coinIconProvider(e.coin)),
SvgPicture.file(
File(
ref.watch(coinIconProvider(e.coin)),
),
height: 24,
),
const SizedBox(

View file

@ -1,3 +1,5 @@
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
@ -9,8 +11,8 @@ import 'package:stackwallet/pages/exchange_view/exchange_step_views/step_2_view.
import 'package:stackwallet/pages/send_view/send_view.dart';
import 'package:stackwallet/providers/global/address_book_service_provider.dart';
import 'package:stackwallet/providers/providers.dart';
import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/themes/coin_icon_provider.dart';
import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/themes/theme_providers.dart';
import 'package:stackwallet/utilities/assets.dart';
import 'package:stackwallet/utilities/clipboard_interface.dart';
@ -110,11 +112,13 @@ class ContactPopUp extends ConsumerWidget {
),
child: contact.id == "default"
? Center(
child: SvgPicture.asset(
ref.watch(
themeProvider.select(
(value) =>
value.assets.stackIcon,
child: SvgPicture.file(
File(
ref.watch(
themeProvider.select(
(value) => value
.assets.stackIcon,
),
),
),
width: 20,
@ -211,9 +215,11 @@ class ContactPopUp extends ConsumerWidget {
const SizedBox(
height: 2,
),
SvgPicture.asset(
ref.watch(
coinIconProvider(e.coin),
SvgPicture.file(
File(
ref.watch(
coinIconProvider(e.coin),
),
),
height: 24,
),

View file

@ -1,3 +1,5 @@
import 'dart:io';
import 'package:dropdown_button2/dropdown_button2.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
@ -7,8 +9,8 @@ import 'package:stackwallet/pages/address_book_views/subviews/coin_select_sheet.
import 'package:stackwallet/providers/providers.dart';
// import 'package:stackwallet/providers/global/should_show_lockscreen_on_resume_state_provider.dart';
import 'package:stackwallet/providers/ui/address_book_providers/address_entry_data_provider.dart';
import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/themes/coin_icon_provider.dart';
import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/utilities/address_utils.dart';
import 'package:stackwallet/utilities/assets.dart';
import 'package:stackwallet/utilities/barcode_scanner_interface.dart';
@ -141,8 +143,10 @@ class _NewContactAddressEntryFormState
padding: const EdgeInsets.symmetric(vertical: 4),
child: Row(
children: [
SvgPicture.asset(
ref.watch(coinIconProvider(coin)),
SvgPicture.file(
File(
ref.watch(coinIconProvider(coin)),
),
height: 24,
width: 24,
),
@ -211,15 +215,17 @@ class _NewContactAddressEntryFormState
)
: Row(
children: [
SvgPicture.asset(
ref.watch(
coinIconProvider(
ref.watch(
addressEntryDataProvider(widget.id)
.select(
(value) => value.coin,
),
)!,
SvgPicture.file(
File(
ref.watch(
coinIconProvider(
ref.watch(
addressEntryDataProvider(widget.id)
.select(
(value) => value.coin,
),
)!,
),
),
),
height: 20,

View file

@ -144,7 +144,7 @@ class _ReceiveViewState extends ConsumerState<ReceiveView> {
aspectRatio: 1,
child: AppBarIconButton(
semanticsLabel:
"Address List Pop-up Button. Opens A Pop-up For Adress List Button.",
"Address List Pop-up Button. Opens A Pop-up For Address List Button.",
key: const Key("walletNetworkSettingsAddNewNodeViewButton"),
size: 36,
shadows: const [],

View file

@ -191,7 +191,8 @@ class GlobalSettingsView extends StatelessWidget {
title: "Appearance",
onPressed: () {
Navigator.of(context).pushNamed(
AppearanceSettingsView.routeName);
AppearanceSettingsView.routeName,
);
},
),
if (Platform.isIOS)

View file

@ -1,3 +1,5 @@
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_svg/svg.dart';
@ -6,8 +8,8 @@ import 'package:stackwallet/pages/settings_views/global_settings_view/stack_back
import 'package:stackwallet/pages/settings_views/global_settings_view/stack_backup_views/sub_widgets/restoring_item_card.dart';
import 'package:stackwallet/providers/stack_restore/stack_restoring_ui_state_provider.dart';
import 'package:stackwallet/route_generator.dart';
import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/themes/coin_icon_provider.dart';
import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/utilities/assets.dart';
import 'package:stackwallet/utilities/enums/coin_enum.dart';
import 'package:stackwallet/utilities/enums/stack_restoring_status.dart';
@ -81,8 +83,10 @@ class _RestoringWalletCardState extends ConsumerState<RestoringWalletCard> {
.extension<StackColors>()!
.colorForCoin(coin),
child: Center(
child: SvgPicture.asset(
ref.watch(coinIconProvider(coin)),
child: SvgPicture.file(
File(
ref.watch(coinIconProvider(coin)),
),
height: 20,
width: 20,
),
@ -222,9 +226,11 @@ class _RestoringWalletCardState extends ConsumerState<RestoringWalletCard> {
.extension<StackColors>()!
.colorForCoin(coin),
child: Center(
child: SvgPicture.asset(
ref.watch(
coinIconProvider(coin),
child: SvgPicture.file(
File(
ref.watch(
coinIconProvider(coin),
),
),
height: 20,
width: 20,

View file

@ -1,10 +1,12 @@
import 'dart:io';
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/providers.dart';
import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/themes/coin_icon_provider.dart';
import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/utilities/constants.dart';
import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/widgets/background.dart';
@ -236,22 +238,24 @@ class _StartupPreferencesViewState
.only(top: 12),
child: Row(
children: [
SvgPicture.asset(
ref.watch(
coinIconProvider(
ref
.watch(
walletsChangeNotifierProvider
.select(
(value) =>
value.getManager(
ref.watch(
prefsChangeNotifierProvider.select((value) => value.startupWalletId!),
SvgPicture.file(
File(
ref.watch(
coinIconProvider(
ref
.watch(
walletsChangeNotifierProvider
.select(
(value) =>
value.getManager(
ref.watch(
prefsChangeNotifierProvider.select((value) => value.startupWalletId!),
),
),
),
),
)
.coin,
)
.coin,
),
),
),
),

View file

@ -1,9 +1,11 @@
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_svg/svg.dart';
import 'package:stackwallet/providers/providers.dart';
import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/themes/coin_icon_provider.dart';
import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/utilities/constants.dart';
import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/widgets/background.dart';
@ -102,9 +104,11 @@ class _StartupWalletSelectionViewState
),
child: Padding(
padding: const EdgeInsets.all(4),
child: SvgPicture.asset(
ref.watch(
coinIconProvider(manager.coin),
child: SvgPicture.file(
File(
ref.watch(
coinIconProvider(manager.coin),
),
),
width: 20,
height: 20,

View file

@ -1,9 +1,11 @@
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_svg/svg.dart';
import 'package:stackwallet/providers/providers.dart';
import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/themes/coin_icon_provider.dart';
import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/utilities/constants.dart';
import 'package:stackwallet/utilities/enums/coin_enum.dart';
import 'package:stackwallet/utilities/enums/sync_type_enum.dart';
@ -116,9 +118,11 @@ class WalletSyncingOptionsView extends ConsumerWidget {
),
child: Padding(
padding: const EdgeInsets.all(4),
child: SvgPicture.asset(
ref.watch(
coinIconProvider(manager.coin),
child: SvgPicture.file(
File(
ref.watch(
coinIconProvider(manager.coin),
),
),
width: 20,
height: 20,

View file

@ -8,7 +8,6 @@ import 'package:qr_flutter/qr_flutter.dart';
import 'package:stackwallet/notifications/show_flush_bar.dart';
import 'package:stackwallet/providers/global/wallets_provider.dart';
import 'package:stackwallet/services/coins/manager.dart';
import 'package:stackwallet/services/mixins/xpubable.dart';
import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/utilities/assets.dart';
import 'package:stackwallet/utilities/clipboard_interface.dart';
@ -177,7 +176,7 @@ class _XPubViewState extends ConsumerState<XPubView> {
child: child,
),
child: FutureBuilder(
future: (manager.wallet as XPubAble).xpub,
future: manager.xpub,
builder: (context, AsyncSnapshot<String> snapshot) {
if (snapshot.connectionState == ConnectionState.done &&
snapshot.hasData) {

View file

@ -33,7 +33,7 @@ import 'package:stackwallet/widgets/rounded_white_container.dart';
import 'package:tuple/tuple.dart';
/// [eventBus] should only be set during testing
class WalletSettingsView extends StatefulWidget {
class WalletSettingsView extends ConsumerStatefulWidget {
const WalletSettingsView({
Key? key,
required this.walletId,
@ -52,10 +52,10 @@ class WalletSettingsView extends StatefulWidget {
final EventBus? eventBus;
@override
State<WalletSettingsView> createState() => _WalletSettingsViewState();
ConsumerState<WalletSettingsView> createState() => _WalletSettingsViewState();
}
class _WalletSettingsViewState extends State<WalletSettingsView> {
class _WalletSettingsViewState extends ConsumerState<WalletSettingsView> {
late final String walletId;
late final Coin coin;
late String xpub;
@ -74,7 +74,7 @@ class _WalletSettingsViewState extends State<WalletSettingsView> {
walletId = widget.walletId;
coin = widget.coin;
xPubEnabled =
coin != Coin.monero && coin != Coin.wownero && coin != Coin.epicCash;
ref.read(walletsChangeNotifierProvider).getManager(walletId).hasXPub;
xpub = "";
_currentSyncStatus = widget.initialSyncStatus;

View file

@ -23,19 +23,6 @@ class TxIcon extends ConsumerWidget {
static const Size size = Size(32, 32);
// String _getBundleAssetName(
// bool isCancelled, bool isReceived, bool isPending, BuildContext context) {
// if (!isReceived && transaction.subType == TransactionSubType.mint) {
// if (isCancelled) {
// return Assets.svg.anonymizeFailed;
// }
// if (isPending) {
// return Assets.svg.anonymizePending;
// }
// return Assets.svg.anonymize;
// }
// }
String _getAssetName(
bool isCancelled, bool isReceived, bool isPending, ThemeAssets assets) {
if (!isReceived && transaction.subType == TransactionSubType.mint) {

View file

@ -1,7 +1,10 @@
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:isar/isar.dart';
import 'package:stackwallet/db/isar/main_db.dart';
import 'package:stackwallet/models/contact.dart';
import 'package:stackwallet/models/isar/models/isar_models.dart';
import 'package:stackwallet/pages/address_book_views/subviews/add_new_contact_address_view.dart';
@ -24,8 +27,6 @@ import 'package:stackwallet/widgets/rounded_white_container.dart';
import 'package:stackwallet/widgets/transaction_card.dart';
import 'package:tuple/tuple.dart';
import '../../../db/isar/main_db.dart';
class DesktopContactDetails extends ConsumerStatefulWidget {
const DesktopContactDetails({
Key? key,
@ -119,10 +120,12 @@ class _DesktopContactDetailsState extends ConsumerState<DesktopContactDetails> {
),
child: contact.id == "default"
? Center(
child: SvgPicture.asset(
ref.watch(
themeProvider.select(
(value) => value.assets.stackIcon,
child: SvgPicture.file(
File(
ref.watch(
themeProvider.select(
(value) => value.assets.stackIcon,
),
),
),
width: 32,

View file

@ -1,3 +1,5 @@
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_svg/svg.dart';
@ -6,8 +8,8 @@ import 'package:stackwallet/db/isar/main_db.dart';
import 'package:stackwallet/models/isar/models/blockchain_data/utxo.dart';
import 'package:stackwallet/pages_desktop_specific/coin_control/utxo_row.dart';
import 'package:stackwallet/providers/global/wallets_provider.dart';
import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/themes/coin_icon_provider.dart';
import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/utilities/amount/amount.dart';
import 'package:stackwallet/utilities/assets.dart';
import 'package:stackwallet/utilities/constants.dart';
@ -359,8 +361,10 @@ class _DesktopCoinControlUseDialogState
color: Colors.transparent,
child: Row(
children: [
SvgPicture.asset(
ref.watch(coinIconProvider(coin)),
SvgPicture.file(
File(
ref.watch(coinIconProvider(coin)),
),
width: 24,
height: 24,
),

View file

@ -1,3 +1,5 @@
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_svg/svg.dart';
@ -7,8 +9,8 @@ import 'package:stackwallet/models/isar/models/blockchain_data/utxo.dart';
import 'package:stackwallet/pages_desktop_specific/coin_control/freeze_button.dart';
import 'package:stackwallet/pages_desktop_specific/coin_control/utxo_row.dart';
import 'package:stackwallet/providers/global/wallets_provider.dart';
import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/themes/coin_icon_provider.dart';
import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/utilities/assets.dart';
import 'package:stackwallet/utilities/constants.dart';
import 'package:stackwallet/utilities/enums/coin_enum.dart';
@ -343,8 +345,10 @@ class _DesktopCoinControlViewState
color: Colors.transparent,
child: Row(
children: [
SvgPicture.asset(
ref.watch(coinIconProvider(coin)),
SvgPicture.file(
File(
ref.watch(coinIconProvider(coin)),
),
width: 24,
height: 24,
),

View file

@ -1,4 +1,5 @@
import 'dart:async';
import 'dart:io';
import 'package:decimal/decimal.dart';
import 'package:flutter/material.dart';
@ -522,10 +523,14 @@ class _DesktopTradeRowCardState extends ConsumerState<DesktopTradeRowCard> {
borderRadius: BorderRadius.circular(32),
),
child: Center(
child: SvgPicture.asset(
_fetchIconAssetForStatus(
trade.status,
ref.watch(themeProvider.select((value) => value.assets)),
child: SvgPicture.file(
File(
_fetchIconAssetForStatus(
trade.status,
ref.watch(
themeProvider.select((value) => value.assets),
),
),
),
width: 32,
height: 32,

View file

@ -1,3 +1,5 @@
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_svg/svg.dart';
@ -81,28 +83,36 @@ class DesktopNotificationsIcon extends ConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
return SvgPicture.asset(
ref.watch(notificationsProvider
.select((value) => value.hasUnreadNotifications))
? ref.watch(
themeProvider.select(
(value) => value.assets.bellNew,
return ref.watch(notificationsProvider
.select((value) => value.hasUnreadNotifications))
? SvgPicture.file(
File(
ref.watch(
themeProvider.select(
(value) => value.assets.bellNew,
),
),
)
: Assets.svg.bell,
width: 20,
height: 20,
color: ref.watch(notificationsProvider
.select((value) => value.hasUnreadNotifications))
? null
: DesktopMenuItemId.notifications ==
ref.watch(currentDesktopMenuItemProvider.state).state
? Theme.of(context).extension<StackColors>()!.accentColorDark
: Theme.of(context)
.extension<StackColors>()!
.accentColorDark
.withOpacity(0.8),
);
),
width: 20,
height: 20,
)
: SvgPicture.asset(
Assets.svg.bell,
width: 20,
height: 20,
color: ref.watch(notificationsProvider
.select((value) => value.hasUnreadNotifications))
? null
: DesktopMenuItemId.notifications ==
ref.watch(currentDesktopMenuItemProvider.state).state
? Theme.of(context)
.extension<StackColors>()!
.accentColorDark
: Theme.of(context)
.extension<StackColors>()!
.accentColorDark
.withOpacity(0.8),
);
}
}

View file

@ -1,3 +1,5 @@
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_svg/flutter_svg.dart';
@ -53,10 +55,12 @@ class DesktopMyStackTitle extends ConsumerWidget {
SizedBox(
width: 32,
height: 32,
child: SvgPicture.asset(
ref.watch(
themeProvider.select(
(value) => value.assets.stackIcon,
child: SvgPicture.file(
File(
ref.watch(
themeProvider.select(
(value) => value.assets.stackIcon,
),
),
),
),

View file

@ -1,3 +1,5 @@
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_svg/svg.dart';
@ -10,8 +12,8 @@ import 'package:stackwallet/providers/global/price_provider.dart';
import 'package:stackwallet/providers/global/wallets_provider.dart';
import 'package:stackwallet/providers/wallet/public_private_balance_state_provider.dart';
import 'package:stackwallet/services/coins/firo/firo_wallet.dart';
import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/themes/coin_icon_provider.dart';
import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/utilities/amount/amount.dart';
import 'package:stackwallet/utilities/barcode_scanner_interface.dart';
import 'package:stackwallet/utilities/clipboard_interface.dart';
@ -81,8 +83,10 @@ class _DesktopPaynymSendDialogState
// Theme.of(context).extension<StackColors>()!.textSubtitle4,
child: Row(
children: [
SvgPicture.asset(
ref.watch(coinIconProvider(coin)),
SvgPicture.file(
File(
ref.watch(coinIconProvider(coin)),
),
width: 36,
height: 36,
),

View file

@ -1,10 +1,12 @@
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_svg/svg.dart';
import 'package:stackwallet/pages/wallets_view/wallets_overview.dart';
import 'package:stackwallet/providers/providers.dart';
import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/themes/coin_icon_provider.dart';
import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/utilities/amount/amount.dart';
import 'package:stackwallet/utilities/enums/coin_enum.dart';
import 'package:stackwallet/utilities/text_styles.dart';
@ -141,8 +143,10 @@ class _DesktopWalletSummaryRowState
flex: 4,
child: Row(
children: [
SvgPicture.asset(
ref.watch(coinIconProvider(widget.coin)),
SvgPicture.file(
File(
ref.watch(coinIconProvider(widget.coin)),
),
width: 28,
height: 28,
),

View file

@ -94,10 +94,12 @@ class _ForgotPasswordDesktopViewState
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
SvgPicture.asset(
ref.watch(
themeProvider.select(
(value) => value.assets.stackIcon,
SvgPicture.file(
File(
ref.watch(
themeProvider.select(
(value) => value.assets.stackIcon,
),
),
),
width: 100,

View file

@ -1,4 +1,5 @@
import 'dart:async';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
@ -166,10 +167,12 @@ class _DesktopLoginViewState extends ConsumerState<DesktopLoginView> {
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
SvgPicture.asset(
ref.watch(
themeProvider.select(
(value) => value.assets.stackIcon,
SvgPicture.file(
File(
ref.watch(
themeProvider.select(
(value) => value.assets.stackIcon,
),
),
),
width: 100,

View file

@ -1,3 +1,5 @@
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_svg/svg.dart';
@ -47,10 +49,12 @@ class _ForgotPasswordDesktopViewState
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
SvgPicture.asset(
ref.watch(
themeProvider.select(
(value) => value.assets.stackIcon,
SvgPicture.file(
File(
ref.watch(
themeProvider.select(
(value) => value.assets.stackIcon,
),
),
),
width: 100,

View file

@ -6,8 +6,8 @@ import 'package:flutter_svg/svg.dart';
import 'package:stackwallet/pages/settings_views/global_settings_view/manage_nodes_views/coin_nodes_view.dart';
import 'package:stackwallet/providers/providers.dart';
import 'package:stackwallet/route_generator.dart';
import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/themes/coin_icon_provider.dart';
import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/utilities/assets.dart';
import 'package:stackwallet/utilities/constants.dart';
import 'package:stackwallet/utilities/enums/coin_enum.dart';
@ -250,8 +250,10 @@ class _NodesSettings extends ConsumerState<NodesSettings> {
children: [
Row(
children: [
SvgPicture.asset(
ref.watch(coinIconProvider(coin)),
SvgPicture.file(
File(
ref.watch(coinIconProvider(coin)),
),
width: 24,
height: 24,
),

View file

@ -53,11 +53,11 @@ import 'package:uuid/uuid.dart';
const int MINIMUM_CONFIRMATIONS = 1;
final Amount DUST_LIMIT = Amount(
rawValue: BigInt.from(294),
fractionDigits: Coin.particl.decimals,
fractionDigits: Coin.bitcoin.decimals,
);
final Amount DUST_LIMIT_P2PKH = Amount(
rawValue: BigInt.from(546),
fractionDigits: Coin.particl.decimals,
fractionDigits: Coin.bitcoin.decimals,
);
const String GENESIS_HASH_MAINNET =

View file

@ -71,7 +71,6 @@ String constructDerivePath({
case 0x80: // bch mainnet wif
switch (derivePathType) {
case DerivePathType.bip44:
case DerivePathType.bip49:
coinType = 145; // bch mainnet
break;
case DerivePathType.bch44: // bitcoin.com wallet specific
@ -95,9 +94,6 @@ String constructDerivePath({
case DerivePathType.bch44:
purpose = 44;
break;
case DerivePathType.bip49:
purpose = 49;
break;
default:
throw Exception("DerivePathType $derivePathType not supported");
}
@ -283,10 +279,6 @@ class BitcoinCashWallet extends CoinServiceAPI
return DerivePathType.bip44;
}
if (decodeBase58[0] == _network.scriptHash) {
// P2SH
return DerivePathType.bip49;
}
throw ArgumentError('Invalid version or Network mismatch');
} else {
try {
@ -419,15 +411,6 @@ class BitcoinCashWallet extends CoinServiceAPI
addrType = isar_models.AddressType.p2pkh;
addressString = bitbox.Address.toCashAddress(addressString);
break;
case DerivePathType.bip49:
addressString = P2SH(
data: PaymentData(
redeem: P2WPKH(data: data, network: _network).data),
network: _network)
.data
.address!;
addrType = isar_models.AddressType.p2sh;
break;
default:
throw Exception("DerivePathType $type not supported");
}
@ -518,7 +501,6 @@ class BitcoinCashWallet extends CoinServiceAPI
final deriveTypes = [
DerivePathType.bip44,
DerivePathType.bip49,
];
if (coin != Coin.bitcoincashTestnet) {
@ -1397,10 +1379,6 @@ class BitcoinCashWallet extends CoinServiceAPI
// P2PKH
_generateAddressForChain(0, 0, DerivePathType.bip44),
_generateAddressForChain(1, 0, DerivePathType.bip44),
// P2SH
_generateAddressForChain(0, 0, DerivePathType.bip49),
_generateAddressForChain(1, 0, DerivePathType.bip49),
]);
await db.putAddresses(initialAddresses);
@ -1408,7 +1386,7 @@ class BitcoinCashWallet extends CoinServiceAPI
Logging.instance.log("_generateNewWalletFinished", level: LogLevel.Info);
}
/// Generates a new internal or external chain address for the wallet using a BIP44 or BIP49 derivation path.
/// Generates a new internal or external chain address for the wallet using a BIP44 derivation path.
/// [chain] - Use 0 for receiving (external), 1 for change (internal). Should not be any other value!
/// [index] - This can be any integer >= 0
Future<isar_models.Address> _generateAddressForChain(
@ -1449,17 +1427,6 @@ class BitcoinCashWallet extends CoinServiceAPI
addrType = isar_models.AddressType.p2pkh;
address = bitbox.Address.toCashAddress(address);
break;
case DerivePathType.bip49:
address = P2SH(
data: PaymentData(
redeem: P2WPKH(data: data, network: _network).data),
network: _network)
.data
.address!;
addrType = isar_models.AddressType.p2sh;
break;
case DerivePathType.bip84:
throw UnsupportedError("bip84 not supported by BCH");
default:
throw Exception("DerivePathType $derivePathType not supported");
}
@ -1502,13 +1469,6 @@ class BitcoinCashWallet extends CoinServiceAPI
coinType = coin == Coin.bitcoincash ? "0" : "1";
purpose = "44";
break;
case DerivePathType.bip49:
type = isar_models.AddressType.p2sh;
coinType = coin == Coin.bitcoincash ? "145" : "1";
purpose = "49";
break;
case DerivePathType.bip84:
throw UnsupportedError("bip84 not supported by BCH");
default:
throw Exception("DerivePathType $derivePathType not supported");
}
@ -1537,9 +1497,6 @@ class BitcoinCashWallet extends CoinServiceAPI
case DerivePathType.bch44:
key = "${walletId}_${chainId}DerivationsBch44P2PKH";
break;
case DerivePathType.bip49:
key = "${walletId}_${chainId}DerivationsP2SH";
break;
default:
throw UnsupportedError(
"${derivePathType.name} not supported by ${coin.prettyName}");
@ -2721,20 +2678,6 @@ class BitcoinCashWallet extends CoinServiceAPI
redeemScript = null;
break;
case DerivePathType.bip49:
final p2wpkh = P2WPKH(
data: PaymentData(
pubkey: Format.stringToUint8List(pubKey),
),
network: _network,
).data;
redeemScript = p2wpkh.output;
data = P2SH(
data: PaymentData(redeem: p2wpkh),
network: _network,
).data;
break;
default:
throw Exception("DerivePathType unsupported");
}

View file

@ -12,8 +12,8 @@ import 'package:stackwallet/services/event_bus/events/global/updated_in_backgrou
import 'package:stackwallet/services/event_bus/global_event_bus.dart';
import 'package:stackwallet/services/mixins/coin_control_interface.dart';
import 'package:stackwallet/services/mixins/paynym_wallet_interface.dart';
import 'package:stackwallet/utilities/amount/amount.dart';
import 'package:stackwallet/services/mixins/xpubable.dart';
import 'package:stackwallet/utilities/amount/amount.dart';
import 'package:stackwallet/utilities/enums/coin_enum.dart';
import 'package:stackwallet/utilities/logger.dart';
@ -252,7 +252,8 @@ class Manager with ChangeNotifier {
);
}
bool get hasXPub => _currentWallet is XPubAble;
// TODO: re enable once xpubs have been redone
bool get hasXPub => false; //_currentWallet is XPubAble;
Future<String> get xpub async {
if (!hasXPub) {

View file

@ -103,6 +103,7 @@ class StackColors extends ThemeExtension<StackColors> {
// icons
final Color bottomNavIconBack;
final Color bottomNavIconIcon;
final Color bottomNavIconIconHighlighted;
final Color topNavIconPrimary;
final Color topNavIconGreen;
final Color topNavIconYellow;
@ -281,6 +282,7 @@ class StackColors extends ThemeExtension<StackColors> {
required this.snackBarTextInfo,
required this.bottomNavIconBack,
required this.bottomNavIconIcon,
required this.bottomNavIconIconHighlighted,
required this.topNavIconPrimary,
required this.topNavIconGreen,
required this.topNavIconYellow,
@ -441,6 +443,7 @@ class StackColors extends ThemeExtension<StackColors> {
snackBarTextInfo: colorTheme.snackBarTextInfo,
bottomNavIconBack: colorTheme.bottomNavIconBack,
bottomNavIconIcon: colorTheme.bottomNavIconIcon,
bottomNavIconIconHighlighted: colorTheme.bottomNavIconIconHighlighted,
topNavIconPrimary: colorTheme.topNavIconPrimary,
topNavIconGreen: colorTheme.topNavIconGreen,
topNavIconYellow: colorTheme.topNavIconYellow,
@ -603,6 +606,7 @@ class StackColors extends ThemeExtension<StackColors> {
Color? snackBarTextInfo,
Color? bottomNavIconBack,
Color? bottomNavIconIcon,
Color? bottomNavIconIconHighlighted,
Color? topNavIconPrimary,
Color? topNavIconGreen,
Color? topNavIconYellow,
@ -776,6 +780,8 @@ class StackColors extends ThemeExtension<StackColors> {
snackBarTextInfo: snackBarTextInfo ?? this.snackBarTextInfo,
bottomNavIconBack: bottomNavIconBack ?? this.bottomNavIconBack,
bottomNavIconIcon: bottomNavIconIcon ?? this.bottomNavIconIcon,
bottomNavIconIconHighlighted:
bottomNavIconIconHighlighted ?? this.bottomNavIconIconHighlighted,
topNavIconPrimary: topNavIconPrimary ?? this.topNavIconPrimary,
topNavIconGreen: topNavIconGreen ?? this.topNavIconGreen,
topNavIconYellow: topNavIconYellow ?? this.topNavIconYellow,
@ -1279,6 +1285,11 @@ class StackColors extends ThemeExtension<StackColors> {
other.bottomNavIconIcon,
t,
)!,
bottomNavIconIconHighlighted: Color.lerp(
bottomNavIconIconHighlighted,
other.bottomNavIconIconHighlighted,
t,
)!,
topNavIconPrimary: Color.lerp(
topNavIconPrimary,
other.topNavIconPrimary,

View file

@ -42,7 +42,7 @@ abstract class Constants {
// Enable Logger.print statements
static const bool disableLogger = false;
static const int currentHiveDbVersion = 8;
static const int currentHiveDbVersion = 9;
static const int rescanV1 = 1;

View file

@ -290,6 +290,37 @@ class DbVersionMigrator with WalletDB {
// try to continue migrating
return await migrate(8, secureStore: secureStore);
case 8:
// migrate
await Hive.openBox<dynamic>(DB.boxNameAllWalletsData);
final walletsService =
WalletsService(secureStorageInterface: secureStore);
final walletInfoList = await walletsService.walletNames;
await MainDB.instance.initMainDB();
for (final walletId in walletInfoList.keys) {
final info = walletInfoList[walletId]!;
if (info.coin == Coin.bitcoincash ||
info.coin == Coin.bitcoincashTestnet) {
final ids = await MainDB.instance
.getAddresses(walletId)
.filter()
.typeEqualTo(isar_models.AddressType.p2sh)
.idProperty()
.findAll();
await MainDB.instance.isar.writeTxn(() async {
await MainDB.instance.isar.addresses.deleteAll(ids);
});
}
}
// update version
await DB.instance.put<dynamic>(
boxName: DB.boxNameDBInfo, key: "hive_data_version", value: 9);
// try to continue migrating
return await migrate(9, secureStore: secureStore);
default:
// finally return
return;

View file

@ -1,3 +1,5 @@
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_svg/svg.dart';
@ -5,6 +7,7 @@ import 'package:stackwallet/models/contact.dart';
import 'package:stackwallet/pages/address_book_views/subviews/contact_popup.dart';
import 'package:stackwallet/providers/global/address_book_service_provider.dart';
import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/themes/theme_providers.dart';
import 'package:stackwallet/utilities/assets.dart';
import 'package:stackwallet/utilities/constants.dart';
import 'package:stackwallet/utilities/enums/coin_enum.dart';
@ -14,8 +17,6 @@ import 'package:stackwallet/widgets/conditional_parent.dart';
import 'package:stackwallet/widgets/expandable.dart';
import 'package:stackwallet/widgets/rounded_white_container.dart';
import '../themes/theme_providers.dart';
class AddressBookCard extends ConsumerStatefulWidget {
const AddressBookCard({
Key? key,
@ -92,10 +93,12 @@ class _AddressBookCardState extends ConsumerState<AddressBookCard> {
),
child: contact.id == "default"
? Center(
child: SvgPicture.asset(
ref.watch(
themeProvider.select(
(value) => value.assets.stackIcon,
child: SvgPicture.file(
File(
ref.watch(
themeProvider.select(
(value) => value.assets.stackIcon,
),
),
),
width: 20,

View file

@ -1,3 +1,5 @@
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_svg/flutter_svg.dart';
@ -47,10 +49,12 @@ class _LivingStackIconState extends ConsumerState<LivingStackIcon> {
child: AnimatedScale(
duration: const Duration(milliseconds: 200),
scale: _hovering ? 1.2 : 1,
child: SvgPicture.asset(
ref.watch(
themeProvider.select(
(value) => value.assets.stackIcon,
child: SvgPicture.file(
File(
ref.watch(
themeProvider.select(
(value) => value.assets.stackIcon,
),
),
),
),

View file

@ -14,7 +14,7 @@ class ExchangeNavIcon extends ConsumerWidget {
File(
ref.watch(
themeProvider.select(
(value) => value.assets.buy,
(value) => value.assets.exchange,
),
),
),

View file

@ -68,9 +68,10 @@ class WalletNavigationBarItem extends ConsumerWidget {
Text(
data.label ?? "",
style: STextStyles.buttonSmall(context).copyWith(
color: Theme.of(context)
.extension<StackColors>()!
.bottomNavText),
color: Theme.of(context)
.extension<StackColors>()!
.bottomNavText,
),
),
],
),
@ -112,7 +113,11 @@ class WalletNavigationBarMoreItem extends ConsumerWidget {
child: Text(
data.label ?? "",
textAlign: TextAlign.center,
style: STextStyles.buttonSmall(context),
style: STextStyles.buttonSmall(context).copyWith(
color: Theme.of(context)
.extension<StackColors>()!
.bottomNavText,
),
),
),
const SizedBox(

View file

@ -175,7 +175,7 @@ class _WalletNavigationBarState extends ConsumerState<WalletNavigationBar> {
height: 20,
color: Theme.of(context)
.extension<StackColors>()!
.infoItemIcons,
.bottomNavIconIconHighlighted,
),
crossFadeState: ref
.watch(walletNavBarMore.state)
@ -190,10 +190,10 @@ class _WalletNavigationBarState extends ConsumerState<WalletNavigationBar> {
style:
STextStyles.buttonSmall(context)
.copyWith(
color: Theme.of(context)
.extension<
StackColors>()!
.bottomNavText),
color: Theme.of(context)
.extension<StackColors>()!
.bottomNavText,
),
),
secondChild: Text(
"More",
@ -202,7 +202,7 @@ class _WalletNavigationBarState extends ConsumerState<WalletNavigationBar> {
.copyWith(
color: Theme.of(context)
.extension<StackColors>()!
.infoItemIcons,
.bottomNavIconIconHighlighted,
),
),
crossFadeState: ref

View file

@ -343,14 +343,9 @@ flutter:
# exchange icons
- assets/svg/exchange_icons/
# theme selectors
# - assets/svg/dark-theme.svg
# - assets/svg/light-mode.svg
# buy
- assets/svg/buy/
# lottie animations
# basic
- assets/lottie/test2.json

View file

@ -1,17 +1,35 @@
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_svg/svg.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/annotations.dart';
import 'package:mockito/mockito.dart';
import 'package:stackwallet/models/isar/stack_theme.dart';
import 'package:stackwallet/models/notification_model.dart';
import 'package:stackwallet/notifications/notification_card.dart';
import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/themes/theme_service.dart';
import 'package:stackwallet/utilities/assets.dart';
import '../sample_data/theme_json.dart';
import 'notification_card_test.mocks.dart';
@GenerateMocks([
ThemeService,
])
void main() {
testWidgets("test notification card", (widgetTester) async {
final key = UniqueKey();
final mockThemeService = MockThemeService();
final theme = StackTheme.fromJson(
json: lightThemeJsonMap,
applicationThemesDirectoryPath: "test",
);
when(mockThemeService.getTheme(themeId: "light")).thenAnswer(
(_) => theme,
);
final notificationCard = NotificationCard(
key: key,
notification: NotificationModel(
@ -27,19 +45,21 @@ void main() {
);
await widgetTester.pumpWidget(
MaterialApp(
theme: ThemeData(
extensions: [
StackColors.fromStackColorTheme(
StackTheme.fromJson(
json: lightThemeJsonMap,
applicationThemesDirectoryPath: "test",
ProviderScope(
overrides: [
pThemeService.overrideWithValue(mockThemeService),
],
child: MaterialApp(
theme: ThemeData(
extensions: [
StackColors.fromStackColorTheme(
theme,
),
),
],
),
home: Material(
child: notificationCard,
],
),
home: Material(
child: notificationCard,
),
),
),
);

View file

@ -0,0 +1,122 @@
// Mocks generated by Mockito 5.3.2 from annotations
// in stackwallet/test/notifications/notification_card_test.dart.
// Do not manually edit this file.
// ignore_for_file: no_leading_underscores_for_library_prefixes
import 'dart:async' as _i5;
import 'dart:typed_data' as _i6;
import 'package:mockito/mockito.dart' as _i1;
import 'package:stackwallet/db/isar/main_db.dart' as _i2;
import 'package:stackwallet/models/isar/stack_theme.dart' as _i4;
import 'package:stackwallet/themes/theme_service.dart' as _i3;
// ignore_for_file: type=lint
// ignore_for_file: avoid_redundant_argument_values
// ignore_for_file: avoid_setters_without_getters
// ignore_for_file: comment_references
// ignore_for_file: implementation_imports
// ignore_for_file: invalid_use_of_visible_for_testing_member
// ignore_for_file: prefer_const_constructors
// ignore_for_file: unnecessary_parenthesis
// ignore_for_file: camel_case_types
// ignore_for_file: subtype_of_sealed_class
class _FakeMainDB_0 extends _i1.SmartFake implements _i2.MainDB {
_FakeMainDB_0(
Object parent,
Invocation parentInvocation,
) : super(
parent,
parentInvocation,
);
}
/// A class which mocks [ThemeService].
///
/// See the documentation for Mockito's code generation for more information.
class MockThemeService extends _i1.Mock implements _i3.ThemeService {
MockThemeService() {
_i1.throwOnMissingStub(this);
}
@override
_i2.MainDB get db => (super.noSuchMethod(
Invocation.getter(#db),
returnValue: _FakeMainDB_0(
this,
Invocation.getter(#db),
),
) as _i2.MainDB);
@override
List<_i4.StackTheme> get installedThemes => (super.noSuchMethod(
Invocation.getter(#installedThemes),
returnValue: <_i4.StackTheme>[],
) as List<_i4.StackTheme>);
@override
void init(_i2.MainDB? db) => super.noSuchMethod(
Invocation.method(
#init,
[db],
),
returnValueForMissingStub: null,
);
@override
_i5.Future<void> install({required _i6.Uint8List? themeArchiveData}) =>
(super.noSuchMethod(
Invocation.method(
#install,
[],
{#themeArchiveData: themeArchiveData},
),
returnValue: _i5.Future<void>.value(),
returnValueForMissingStub: _i5.Future<void>.value(),
) as _i5.Future<void>);
@override
_i5.Future<void> remove({required String? themeId}) => (super.noSuchMethod(
Invocation.method(
#remove,
[],
{#themeId: themeId},
),
returnValue: _i5.Future<void>.value(),
returnValueForMissingStub: _i5.Future<void>.value(),
) as _i5.Future<void>);
@override
_i5.Future<bool> verifyInstalled({required String? themeId}) =>
(super.noSuchMethod(
Invocation.method(
#verifyInstalled,
[],
{#themeId: themeId},
),
returnValue: _i5.Future<bool>.value(false),
) as _i5.Future<bool>);
@override
_i5.Future<List<_i3.StackThemeMetaData>> fetchThemes() => (super.noSuchMethod(
Invocation.method(
#fetchThemes,
[],
),
returnValue: _i5.Future<List<_i3.StackThemeMetaData>>.value(
<_i3.StackThemeMetaData>[]),
) as _i5.Future<List<_i3.StackThemeMetaData>>);
@override
_i5.Future<_i6.Uint8List> fetchTheme(
{required _i3.StackThemeMetaData? themeMetaData}) =>
(super.noSuchMethod(
Invocation.method(
#fetchTheme,
[],
{#themeMetaData: themeMetaData},
),
returnValue: _i5.Future<_i6.Uint8List>.value(_i6.Uint8List(0)),
) as _i5.Future<_i6.Uint8List>);
@override
_i4.StackTheme? getTheme({required String? themeId}) =>
(super.noSuchMethod(Invocation.method(
#getTheme,
[],
{#themeId: themeId},
)) as _i4.StackTheme?);
}

View file

@ -91,6 +91,7 @@ const Map<String, dynamic> lightThemeJsonMap = {
"snack_bar_text_info": "0xFF002A78",
"bottom_nav_icon_back": "0xFFA2A2A2",
"bottom_nav_icon_icon": "0xFF232323",
"bottom_nav_icon_icon_highlighted": "0xFF232323",
"top_nav_icon_primary": "0xFF232323",
"top_nav_icon_green": "0xFF00A578",
"top_nav_icon_yellow": "0xFFF4C517",

View file

@ -175,17 +175,6 @@ void main() async {
verifyNoMoreInteractions(cachedClient);
verifyNoMoreInteractions(tracker);
});
test("Multisig/P2SH address", () {
expect(
mainnetWallet?.addressType(
address: "3DYuVEmuKWQFxJcF7jDPhwPiXLTiNnyMFb"),
DerivePathType.bip49);
expect(secureStore.interactions, 0);
verifyNoMoreInteractions(client);
verifyNoMoreInteractions(cachedClient);
verifyNoMoreInteractions(tracker);
});
});
group("validate mainnet bitcoincash addresses", () {