Display 'Connecting...' when connection to daemon is lost

This commit is contained in:
j-berman 2022-03-25 12:34:47 -07:00
parent dd92f7bb36
commit 4ac01abe10
4 changed files with 42 additions and 12 deletions

View File

@ -230,7 +230,7 @@ public class WalletActivity extends BaseActivity implements WalletFragment.Liste
final WalletFragment walletFragment = getWalletFragment();
getWallet().rescanBlockchainAsync();
synced = false;
walletFragment.unsync();
walletFragment.onStartRescan();
invalidateOptionsMenu();
} catch (ClassCastException ex) {
Timber.d(ex.getLocalizedMessage());

View File

@ -374,6 +374,10 @@ public class WalletFragment extends Fragment
bSend.setEnabled(false);
}
if (isVisible()) enableAccountsList(false); //otherwise it is enabled in onResume()
}
public void onStartRescan() {
unsync();
firstBlock = 0;
}
@ -460,10 +464,17 @@ public class WalletFragment extends Fragment
} else {
sync = getString(R.string.status_synced) + " " + formatter.format(wallet.getBlockChainHeight());
ivSynced.setVisibility(View.VISIBLE);
setProgress(-1);
}
} else {
sync = getString(R.string.status_wallet_connecting);
setProgress(101);
ivSynced.setVisibility(View.GONE);
}
if (wallet.isSynchronized()) {
onSynced();
} else {
unsync();
}
setProgress(sync);
// TODO show connected status somewhere

View File

@ -283,6 +283,10 @@ public class Wallet {
this.synced = true;
}
public void setUnsynchronized() {
this.synced = false;
}
public static native String getDisplayAmount(long amount);
public static native long getAmountFromString(String amount);

View File

@ -121,8 +121,9 @@ public class WalletService extends Service {
Timber.d("newBlock() @ %d with observer %s", height, observer);
if (observer != null) {
boolean fullRefresh = false;
updateDaemonState(wallet, wallet.isSynchronized() ? height : 0);
if (!wallet.isSynchronized()) {
boolean receivedNewBlock = true;
boolean updatedWalletConnectionStatus = updateDaemonState(wallet, height, receivedNewBlock);
if (updatedWalletConnectionStatus || !wallet.isSynchronized()) {
updated = true;
// we want to see our transactions as they come in
wallet.refreshHistory();
@ -146,13 +147,13 @@ public class WalletService extends Service {
updated = true;
}
public void refreshed() { // this means it's synced
public void refreshed() {
Timber.d("refreshed()");
final Wallet wallet = getWallet();
if (wallet == null) throw new IllegalStateException("No wallet!");
wallet.setSynchronized();
if (updated) {
updateDaemonState(wallet, wallet.getBlockChainHeight());
boolean receivedNewBlock = false;
boolean updatedWalletConnectionStatus = updateDaemonState(wallet, wallet.getBlockChainHeight(), receivedNewBlock);
if (updated || updatedWalletConnectionStatus) {
wallet.refreshHistory();
if (observer != null) {
updated = !observer.onRefreshed(wallet, true);
@ -164,16 +165,20 @@ public class WalletService extends Service {
private long lastDaemonStatusUpdate = 0;
private long daemonHeight = 0;
private Wallet.ConnectionStatus connectionStatus = Wallet.ConnectionStatus.ConnectionStatus_Disconnected;
private static final long STATUS_UPDATE_INTERVAL = 120000; // 120s (blocktime)
private static final long STATUS_UPDATE_INTERVAL_SYNCED = 120000; // 120s (blocktime)
private static final long STATUS_UPDATE_INTERVAL_SYNCING = 10000; // 10s
private void updateDaemonState(Wallet wallet, long height) {
private boolean updateDaemonState(Wallet wallet, long height, boolean receivedNewBlock) {
Wallet.ConnectionStatus startConnectionStatus = connectionStatus;
long t = System.currentTimeMillis();
if (height > 0) { // if we get a height, we are connected
daemonHeight = height;
if (daemonHeight > 0 && height > 0 && (height > daemonHeight || receivedNewBlock)) {
if (height > daemonHeight)
daemonHeight = height;
connectionStatus = Wallet.ConnectionStatus.ConnectionStatus_Connected;
lastDaemonStatusUpdate = t;
} else {
if (t - lastDaemonStatusUpdate > STATUS_UPDATE_INTERVAL) {
long statusUpdateInterval = wallet.isSynchronized() ? STATUS_UPDATE_INTERVAL_SYNCED : STATUS_UPDATE_INTERVAL_SYNCING;
if (daemonHeight == 0 || t - lastDaemonStatusUpdate > statusUpdateInterval) {
lastDaemonStatusUpdate = t;
// these calls really connect to the daemon - wasting time
daemonHeight = wallet.getDaemonBlockChainHeight();
@ -185,6 +190,16 @@ public class WalletService extends Service {
}
}
}
setWalletSyncState(wallet);
return startConnectionStatus != connectionStatus;
}
public void setWalletSyncState(Wallet wallet) {
if (daemonHeight > 0 && daemonHeight <= wallet.getBlockChainHeight()) {
wallet.setSynchronized();
} else {
wallet.setUnsynchronized();
}
}
public long getDaemonHeight() {