@@ -121,8 +121,9 @@ public void newBlock(long height) {
121121 Timber .d ("newBlock() @ %d with observer %s" , height , observer );
122122 if (observer != null ) {
123123 boolean fullRefresh = false ;
124- updateDaemonState (wallet , wallet .isSynchronized () ? height : 0 );
125- if (!wallet .isSynchronized ()) {
124+ boolean receivedNewBlock = true ;
125+ boolean updatedWalletConnectionStatus = updateDaemonState (wallet , height , receivedNewBlock );
126+ if (updatedWalletConnectionStatus || !wallet .isSynchronized ()) {
126127 updated = true ;
127128 // we want to see our transactions as they come in
128129 wallet .refreshHistory ();
@@ -146,13 +147,13 @@ public void updated() {
146147 updated = true ;
147148 }
148149
149- public void refreshed () { // this means it's synced
150+ public void refreshed () {
150151 Timber .d ("refreshed()" );
151152 final Wallet wallet = getWallet ();
152153 if (wallet == null ) throw new IllegalStateException ("No wallet!" );
153- wallet . setSynchronized () ;
154- if ( updated ) {
155- updateDaemonState ( wallet , wallet . getBlockChainHeight ());
154+ boolean receivedNewBlock = false ;
155+ boolean updatedWalletConnectionStatus = updateDaemonState ( wallet , wallet . getBlockChainHeight (), receivedNewBlock );
156+ if ( updated || updatedWalletConnectionStatus ) {
156157 wallet .refreshHistory ();
157158 if (observer != null ) {
158159 updated = !observer .onRefreshed (wallet , true );
@@ -164,16 +165,20 @@ public void refreshed() { // this means it's synced
164165 private long lastDaemonStatusUpdate = 0 ;
165166 private long daemonHeight = 0 ;
166167 private Wallet .ConnectionStatus connectionStatus = Wallet .ConnectionStatus .ConnectionStatus_Disconnected ;
167- private static final long STATUS_UPDATE_INTERVAL = 120000 ; // 120s (blocktime)
168+ private static final long STATUS_UPDATE_INTERVAL_SYNCED = 120000 ; // 120s (blocktime)
169+ private static final long STATUS_UPDATE_INTERVAL_SYNCING = 10000 ; // 10s
168170
169- private void updateDaemonState (Wallet wallet , long height ) {
171+ private boolean updateDaemonState (Wallet wallet , long height , boolean receivedNewBlock ) {
172+ Wallet .ConnectionStatus startConnectionStatus = connectionStatus ;
170173 long t = System .currentTimeMillis ();
171- if (height > 0 ) { // if we get a height, we are connected
172- daemonHeight = height ;
174+ if (daemonHeight > 0 && height > 0 && (height > daemonHeight || receivedNewBlock )) {
175+ if (height > daemonHeight )
176+ daemonHeight = height ;
173177 connectionStatus = Wallet .ConnectionStatus .ConnectionStatus_Connected ;
174178 lastDaemonStatusUpdate = t ;
175179 } else {
176- if (t - lastDaemonStatusUpdate > STATUS_UPDATE_INTERVAL ) {
180+ long statusUpdateInterval = wallet .isSynchronized () ? STATUS_UPDATE_INTERVAL_SYNCED : STATUS_UPDATE_INTERVAL_SYNCING ;
181+ if (daemonHeight == 0 || t - lastDaemonStatusUpdate > statusUpdateInterval ) {
177182 lastDaemonStatusUpdate = t ;
178183 // these calls really connect to the daemon - wasting time
179184 daemonHeight = wallet .getDaemonBlockChainHeight ();
@@ -185,6 +190,16 @@ private void updateDaemonState(Wallet wallet, long height) {
185190 }
186191 }
187192 }
193+ setWalletSyncState (wallet );
194+ return startConnectionStatus != connectionStatus ;
195+ }
196+
197+ public void setWalletSyncState (Wallet wallet ) {
198+ if (daemonHeight > 0 && daemonHeight <= wallet .getBlockChainHeight ()) {
199+ wallet .setSynchronized ();
200+ } else {
201+ wallet .setUnsynchronized ();
202+ }
188203 }
189204
190205 public long getDaemonHeight () {
0 commit comments