Skip to content

Commit

Permalink
Merge pull request #1426 from nopara73/enum
Browse files Browse the repository at this point in the history
Use enum instead of strings + fix status gets stucked issue
  • Loading branch information
nopara73 committed May 14, 2019
2 parents 70fc35f + 8696ef7 commit 9a6abe5
Show file tree
Hide file tree
Showing 7 changed files with 151 additions and 76 deletions.
3 changes: 2 additions & 1 deletion WalletWasabi.Gui/Controls/StatusBar.xaml
Expand Up @@ -11,6 +11,7 @@
<converters:ShowCursorConverter x:Key="ShowCursorConverter" />
<converters:ShouldDisplayValueConverter x:Key="ShouldDisplayValueConverter" />
<converters:PascalToPhraseConverter x:Key="PascalToPhraseConverter" />
<converters:StatusBarStatusStringConverter x:Key="StatusBarStatusStringConverter" />
</UserControl.Resources>

<Grid Cursor="{Binding UpdateAvailable, Converter={StaticResource ShowCursorConverter}}" Background="{Binding UpdateStatus, Converter={StaticResource UpdateStatusBrushConverter}}">
Expand Down Expand Up @@ -159,7 +160,7 @@
</DrawingPresenter.Drawing>
</DrawingPresenter>
</Grid>
<TextBlock Text="{Binding Status}" />
<TextBlock Text="{Binding StatusText}" />
</StackPanel>
</DockPanel>
</Grid>
Expand Down
28 changes: 11 additions & 17 deletions WalletWasabi.Gui/Controls/WalletExplorer/SendTabViewModel.cs
Expand Up @@ -198,13 +198,10 @@ public SendTabViewModel(WalletViewModel walletViewModel, bool isTransactionBuild

BuildTransactionCommand = ReactiveCommand.CreateFromTask(async () =>
{
const string buildingTransactionStatusText = "Building transaction...";
const string signingTransactionStatusText = "Signing transaction...";
const string broadcastingTransactionStatusText = "Broadcasting transaction...";
try
{
IsBusy = true;
MainWindowViewModel.Instance.StatusBar.TryAddStatus(buildingTransactionStatusText);
MainWindowViewModel.Instance.StatusBar.TryAddStatus(StatusBarStatus.BuildingTransaction);
Password = Guard.Correct(Password);
Label = Label.Trim(',', ' ').Trim();
Expand Down Expand Up @@ -253,10 +250,9 @@ public SendTabViewModel(WalletViewModel walletViewModel, bool isTransactionBuild
var label = Label;
var operation = new WalletService.Operation(script, amount, label);
const string dequeuingSelectedCoinsStatusText = "Dequeueing selected coins...";
try
{
MainWindowViewModel.Instance.StatusBar.TryAddStatus(dequeuingSelectedCoinsStatusText);
MainWindowViewModel.Instance.StatusBar.TryAddStatus(StatusBarStatus.DequeuingSelectedCoins);
TxoRef[] toDequeue = selectedCoinViewModels.Where(x => x.CoinJoinInProgress).Select(x => x.Model.GetTxoRef()).ToArray();
if (toDequeue != null && toDequeue.Any())
{
Expand All @@ -270,7 +266,7 @@ public SendTabViewModel(WalletViewModel walletViewModel, bool isTransactionBuild
}
finally
{
MainWindowViewModel.Instance.StatusBar.TryRemoveStatus(dequeuingSelectedCoinsStatusText);
MainWindowViewModel.Instance.StatusBar.TryRemoveStatus(StatusBarStatus.DequeuingSelectedCoins);
}
var result = await Task.Run(() => Global.WalletService.BuildTransaction(Password, new[] { operation }, FeeTarget, allowUnconfirmed: true, allowedInputs: selectedCoinReferences));
Expand All @@ -291,53 +287,51 @@ public SendTabViewModel(WalletViewModel walletViewModel, bool isTransactionBuild
return;
}
MainWindowViewModel.Instance.StatusBar.TryAddStatus(signingTransactionStatusText);
MainWindowViewModel.Instance.StatusBar.TryAddStatus(StatusBarStatus.SigningTransaction);
SmartTransaction signedTransaction = result.Transaction;
if (IsHardwareWallet && !result.Signed) // If hardware but still has a privkey then it's password, then meh.
{
const string connectingToHardwareWalletStatusText = "Connecting to hardware wallet...";
const string acquiringSignatureFromHardwareWalletStatusText = "Acquiring signature from hardware wallet...";
PSBT signedPsbt = null;
try
{
IsHardwareBusy = true;
MainWindowViewModel.Instance.StatusBar.TryAddStatus(connectingToHardwareWalletStatusText);
MainWindowViewModel.Instance.StatusBar.TryAddStatus(StatusBarStatus.ConnectingToHardwareWallet);
// If we have no hardware wallet info then try refresh it. If we failed, then tha's a problem.
if (KeyManager.HardwareWalletInfo is null && !await TryRefreshHardwareWalletInfoAsync(KeyManager))
{
SetWarningMessage("Could not find hardware wallet. Make sure it's plugged in and you're logged in with your PIN.");
return;
}
MainWindowViewModel.Instance.StatusBar.TryAddStatus(acquiringSignatureFromHardwareWalletStatusText);
MainWindowViewModel.Instance.StatusBar.TryAddStatus(StatusBarStatus.AcquiringSignatureFromHardwareWallet);
signedPsbt = await HwiProcessManager.SignTxAsync(KeyManager.HardwareWalletInfo, result.Psbt);
}
catch (IOException ex) when (ex.Message.Contains("device not found", StringComparison.OrdinalIgnoreCase)
|| ex.Message.Contains("Invalid status 6f04", StringComparison.OrdinalIgnoreCase) // It comes when device asleep too.
|| ex.Message.Contains("Device is asleep", StringComparison.OrdinalIgnoreCase))
{
MainWindowViewModel.Instance.StatusBar.TryAddStatus(connectingToHardwareWalletStatusText);
MainWindowViewModel.Instance.StatusBar.TryAddStatus(StatusBarStatus.ConnectingToHardwareWallet);
// The user may changed USB port. Try again with new enumeration.
if (!await TryRefreshHardwareWalletInfoAsync(KeyManager))
{
SetWarningMessage("Could not find hardware wallet. Make sure it's plugged in and you're logged in with your PIN.");
return;
}
MainWindowViewModel.Instance.StatusBar.TryAddStatus(acquiringSignatureFromHardwareWalletStatusText);
MainWindowViewModel.Instance.StatusBar.TryAddStatus(StatusBarStatus.AcquiringSignatureFromHardwareWallet);
signedPsbt = await HwiProcessManager.SignTxAsync(KeyManager.HardwareWalletInfo, result.Psbt);
}
finally
{
MainWindowViewModel.Instance.StatusBar.TryRemoveStatus(connectingToHardwareWalletStatusText, acquiringSignatureFromHardwareWalletStatusText);
MainWindowViewModel.Instance.StatusBar.TryRemoveStatus(StatusBarStatus.ConnectingToHardwareWallet, StatusBarStatus.AcquiringSignatureFromHardwareWallet);
IsHardwareBusy = false;
}
signedTransaction = signedPsbt.ExtractSmartTransaction(result.Transaction.Height);
}
MainWindowViewModel.Instance.StatusBar.TryAddStatus(broadcastingTransactionStatusText);
MainWindowViewModel.Instance.StatusBar.TryAddStatus(StatusBarStatus.BroadcastingTransaction);
await Task.Run(async () => await Global.WalletService.SendTransactionAsync(signedTransaction));
TryResetInputsOnSuccess("Transaction is successfully sent!");
Expand All @@ -353,7 +347,7 @@ public SendTabViewModel(WalletViewModel walletViewModel, bool isTransactionBuild
}
finally
{
MainWindowViewModel.Instance.StatusBar.TryRemoveStatus(buildingTransactionStatusText, signingTransactionStatusText, broadcastingTransactionStatusText);
MainWindowViewModel.Instance.StatusBar.TryRemoveStatus(StatusBarStatus.BuildingTransaction, StatusBarStatus.SigningTransaction, StatusBarStatus.BroadcastingTransaction);
IsBusy = false;
}
},
Expand Down
Expand Up @@ -7,6 +7,7 @@
using System.Reactive.Disposables;
using System.Reactive.Linq;
using System.Threading.Tasks;
using WalletWasabi.Gui.Models;
using WalletWasabi.Gui.ViewModels;
using WalletWasabi.Models;

Expand Down Expand Up @@ -101,7 +102,6 @@ public override bool OnClose()

private async Task OnDoTransactionBroadcastAsync()
{
const string broadcastingTransactionStatusText = "Broadcasting transaction...";
try
{
IsBusy = true;
Expand All @@ -124,7 +124,7 @@ private async Task OnDoTransactionBroadcastAsync()
transaction = new SmartTransaction(Transaction.Parse(TransactionString, Global.Network ?? Network.Main), WalletWasabi.Models.Height.Unknown);
}

MainWindowViewModel.Instance.StatusBar.TryAddStatus(broadcastingTransactionStatusText);
MainWindowViewModel.Instance.StatusBar.TryAddStatus(StatusBarStatus.BroadcastingTransaction);
await Task.Run(async () => await Global.WalletService.SendTransactionAsync(transaction));

SetSuccessMessage("Transaction is successfully sent!");
Expand All @@ -136,7 +136,7 @@ private async Task OnDoTransactionBroadcastAsync()
}
finally
{
MainWindowViewModel.Instance.StatusBar.TryRemoveStatus(broadcastingTransactionStatusText);
MainWindowViewModel.Instance.StatusBar.TryRemoveStatus(StatusBarStatus.BroadcastingTransaction);
IsBusy = false;
ButtonText = "Broadcast Transaction";
}
Expand Down
53 changes: 53 additions & 0 deletions WalletWasabi.Gui/Converters/StatusBarStatusStringConverter.cs
@@ -0,0 +1,53 @@
using Avalonia.Data.Converters;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Text;
using WalletWasabi.Gui.Models;

namespace WalletWasabi.Gui.Converters
{
public class StatusBarStatusStringConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is StatusBarStatus status)
{
return Convert(status);
}

throw new InvalidOperationException($"Given value isn't a {nameof(StatusBarStatus)} enum.");
}

public static string Convert(StatusBarStatus status)
{
switch (status)
{
case StatusBarStatus.Ready: return "Ready";
case StatusBarStatus.CriticalUpdate: return "THE BACKEND WAS UPGRADED WITH BREAKING CHANGES - PLEASE UPDATE YOUR SOFTWARE";
case StatusBarStatus.OptionalUpdate: return "New Version Is Available";
case StatusBarStatus.Connecting: return "Connecting...";
case StatusBarStatus.Synchronizing: return "Synchronizing...";
case StatusBarStatus.Loading: return "Loading...";
case StatusBarStatus.SettingUpHardwareWallet: return "Setting up hardware wallet...";
case StatusBarStatus.ConnectingToHardwareWallet: return "Connecting to hardware wallet...";
case StatusBarStatus.AcquiringXpubFromHardwareWallet: return "Acquiring xpub from hardware wallet...";
case StatusBarStatus.AcquiringSignatureFromHardwareWallet: return "Acquiring signature from hardware wallet...";
case StatusBarStatus.BuildingTransaction: return "Building transaction...";
case StatusBarStatus.SigningTransaction: return "Signing transaction...";
case StatusBarStatus.BroadcastingTransaction: return "Broadcasting transaction...";
case StatusBarStatus.DequeuingSelectedCoins: return "Dequeueing selected coins...";
default:
{
Logging.Logger.LogWarning<StatusBarStatusStringConverter>("Status don't have conversion string specified. Calling ToString() on enum.");
return status.ToString();
}
}
}

public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotSupportedException();
}
}
}
24 changes: 24 additions & 0 deletions WalletWasabi.Gui/Models/StatusBarStatus.cs
@@ -0,0 +1,24 @@
using System;
using System.Collections.Generic;
using System.Text;

namespace WalletWasabi.Gui.Models
{
public enum StatusBarStatus
{
Ready,
CriticalUpdate,
OptionalUpdate,
Connecting,
Synchronizing,
Loading,
SettingUpHardwareWallet,
ConnectingToHardwareWallet,
AcquiringXpubFromHardwareWallet,
AcquiringSignatureFromHardwareWallet,
BuildingTransaction,
SigningTransaction,
BroadcastingTransaction,
DequeuingSelectedCoins
}
}
18 changes: 7 additions & 11 deletions WalletWasabi.Gui/Tabs/WalletManager/LoadWalletViewModel.cs
Expand Up @@ -388,25 +388,23 @@ public async Task<KeyManager> LoadKeyManagerAsync(bool requirePassword, bool isH

if (!selectedWallet.HardwareWalletInfo.Initialized)
{
const string settingUpHardwareWalletStatusText = "Setting up hardware wallet...";
const string connectingToHardwareWalletStatusText = "Connecting to hardware wallet...";
IEnumerable<HardwareWalletInfo> hwis;
try
{
IsHardwareBusy = true;
MainWindowViewModel.Instance.StatusBar.TryAddStatus(settingUpHardwareWalletStatusText);
MainWindowViewModel.Instance.StatusBar.TryAddStatus(StatusBarStatus.SettingUpHardwareWallet);
if (!await HwiProcessManager.SetupAsync(selectedWallet.HardwareWalletInfo))
{
throw new Exception("Setup failed.");
}

MainWindowViewModel.Instance.StatusBar.TryAddStatus(connectingToHardwareWalletStatusText);
MainWindowViewModel.Instance.StatusBar.TryAddStatus(StatusBarStatus.ConnectingToHardwareWallet);
hwis = await HwiProcessManager.EnumerateAsync();
}
finally
{
IsHardwareBusy = false;
MainWindowViewModel.Instance.StatusBar.TryRemoveStatus(settingUpHardwareWalletStatusText, connectingToHardwareWalletStatusText);
MainWindowViewModel.Instance.StatusBar.TryRemoveStatus(StatusBarStatus.SettingUpHardwareWallet, StatusBarStatus.ConnectingToHardwareWallet);
}

TryRefreshHardwareWallets(hwis);
Expand All @@ -420,16 +418,15 @@ public async Task<KeyManager> LoadKeyManagerAsync(bool requirePassword, bool isH

if (!TryFindWalletByMasterFingerprint(selectedWallet.HardwareWalletInfo.MasterFingerprint.Value, out walletName))
{
const string acquiringXpubFromHardwareWalletStatusText = "Acquiring xpub from hardware wallet...";
ExtPubKey extPubKey;
try
{
MainWindowViewModel.Instance.StatusBar.TryAddStatus(acquiringXpubFromHardwareWalletStatusText);
MainWindowViewModel.Instance.StatusBar.TryAddStatus(StatusBarStatus.AcquiringXpubFromHardwareWallet);
extPubKey = await HwiProcessManager.GetXpubAsync(selectedWallet.HardwareWalletInfo);
}
finally
{
MainWindowViewModel.Instance.StatusBar.TryRemoveStatus(acquiringXpubFromHardwareWalletStatusText);
MainWindowViewModel.Instance.StatusBar.TryRemoveStatus(StatusBarStatus.AcquiringXpubFromHardwareWallet);
}

Logger.LogInfo<LoadWalletViewModel>("Hardware wallet wasn't used previously on this computer. Creating new wallet file.");
Expand Down Expand Up @@ -529,11 +526,10 @@ private static bool TryFindWalletByMasterFingerprint(HDFingerprint masterFingerp

public async Task LoadWalletAsync()
{
const string loadingStatusText = "Loading...";
try
{
IsBusy = true;
MainWindowViewModel.Instance.StatusBar.TryAddStatus(loadingStatusText);
MainWindowViewModel.Instance.StatusBar.TryAddStatus(StatusBarStatus.Loading);

var keyManager = await LoadKeyManagerAsync(IsPasswordRequired, IsHardwareWallet);
if (keyManager is null)
Expand Down Expand Up @@ -570,7 +566,7 @@ public async Task LoadWalletAsync()
}
finally
{
MainWindowViewModel.Instance.StatusBar.TryRemoveStatus(loadingStatusText);
MainWindowViewModel.Instance.StatusBar.TryRemoveStatus(StatusBarStatus.Loading);
IsBusy = false;
}
}
Expand Down

0 comments on commit 9a6abe5

Please sign in to comment.