PushController.onConnectivityChanged() is not only called when the active network changes, but also when connectivity returns (offline -> online). In that case we need to restart the AccountPushControllers.
ImapConnection.isDataAvailable() didn't reliably work on all devices (returned true when no complete IMAP response was available). This lead to situations where a wakelock was being held the whole time the IDLE command was active. At the same time no alarm was set to refresh the IDLE connection. So most of the time the blocking read would time out.
It was possible that the 'callback' property was set to 'null' after another alarm was already scheduled. This meant the callback function wasn't called when the next alarm went off.
When the default network changes Android usually kills connections established over the old network after a little while. K-9 Mail treats this as a regular network error and sleeps for 5 minutes before trying to re-establish the Push connection(s). Closing old connections and opening new ones when a network change is detected avoids this error.
Use a "connection generation" value to mark all connections that have been created since the last closeAllConnections() call. Using that value we can recognize "old" connections that have not been in the connection pool at the time closeAllConnections() was called. We close them as soon as they are passed to releaseConnection().
When the last account is deleted while AccountsLiveData is active it will hold on to an empty list. Then, when an account is added again and AccountsLiveData becomes active again, the empty list is emitted before the list containing the new account is emitted. This lead to the onboarding screen being shown when it shouldn't have. Not holding on to old AccountsLiveData instances will get rid of this problem.
We could end up with a non-Push-capable account that has `folderPushMode` set to something other than `NONE` due to missing checks in the settings import code. See issue #5363.