Created
October 9, 2018 21:04
-
-
Save ogiba/c16a54c2ce13bf99f277e128ba8cfbd3 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| public class RequestRetryingHelper implements InternetConnectionListener, RetryableRequest.OnRetryCalledListener { | |
| private boolean receiverPaused; | |
| private NetworkConnectionBroadcastReceiver networkConnectionBroadcastReceiver; | |
| private final ArrayList<RetryableRequest> retryables = new ArrayList<>(); | |
| private MessageCallback messageCallback; | |
| public void onResume(@Nullable Context context) { | |
| if (networkConnectionBroadcastReceiver != null) { | |
| registerNetworkReceiver(context); | |
| } | |
| } | |
| public void onNewRetryable(@Nullable Context context, RetryableRequest request) { | |
| request.addOnRetryCalledListener(this); | |
| retryables.add(request); | |
| if (retryables.size() > 1) { //not first one | |
| return; | |
| } | |
| if (context == null) { | |
| return; | |
| } | |
| if (!NetworkConnectionBroadcastReceiver.isOnline(context)) { | |
| registerNetworkReceiver(context); | |
| showOfflineSnackbar(); | |
| } else { | |
| showRetrySnackbar(); | |
| } | |
| } | |
| public void onPause(@Nullable Context context) { | |
| pauseReceiver(context); | |
| } | |
| private void registerNetworkReceiver(@Nullable Context context) { | |
| if (context == null) { | |
| return; | |
| } | |
| networkConnectionBroadcastReceiver = new NetworkConnectionBroadcastReceiver(this); | |
| receiverPaused = false; | |
| context.registerReceiver(networkConnectionBroadcastReceiver, | |
| new IntentFilter(NetworkConnectionBroadcastReceiver.ACTION)); | |
| } | |
| private void pauseReceiver(@Nullable Context context) { | |
| if (context == null || networkConnectionBroadcastReceiver == null) { | |
| return; | |
| } | |
| context.unregisterReceiver(networkConnectionBroadcastReceiver); | |
| receiverPaused = true; | |
| } | |
| private void unregisterNetworkReceiver(@Nullable Context context) { | |
| pauseReceiver(context); | |
| receiverPaused = false; | |
| networkConnectionBroadcastReceiver = null; | |
| } | |
| private void showOfflineSnackbar() { | |
| if (messageCallback == null) { | |
| return; | |
| } | |
| messageCallback.hideMessage(); | |
| messageCallback.showMessage(R.string.network_connection_error); | |
| } | |
| private void showRetrySnackbar() { | |
| if (messageCallback == null) { | |
| return; | |
| } | |
| messageCallback.hideMessage(); | |
| messageCallback.showMessage(R.string.retry_request_message, R.string.retry_request_action, this::invokeRetries); | |
| } | |
| private void hideMessage() { | |
| if (messageCallback != null) { | |
| messageCallback.hideMessage(); | |
| } | |
| } | |
| @Override | |
| public void onInternetConnected() { | |
| invokeRetries(); | |
| } | |
| @Override | |
| public void onInternetDisconnected() { | |
| } | |
| private void invokeRetries() { | |
| List<RetryableRequest> localInstance = new ArrayList<>(retryables); //concurrent modification exception | |
| for (RetryableRequest request : localInstance) { | |
| request.retry(); | |
| } | |
| } | |
| @Override | |
| public void onRetryCalled(RetryableRequest request) { | |
| retryables.remove(request); | |
| if (retryables.size() == 0) { | |
| hideMessage(); | |
| //todo unregister receiver | |
| } | |
| } | |
| public void clearRetryables(@Nullable Context context) { | |
| retryables.clear(); | |
| if (receiverPaused) { | |
| networkConnectionBroadcastReceiver = null; | |
| } else { | |
| unregisterNetworkReceiver(context); | |
| } | |
| hideMessage(); | |
| } | |
| public void setMessageCallback(MessageCallback messageCallback) { | |
| this.messageCallback = messageCallback; | |
| } | |
| public interface MessageCallback { | |
| void showMessage(@StringRes int messageId); | |
| void showMessage(@StringRes int messageId, @StringRes int actionTextId, Runnable action); | |
| void hideMessage(); | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment