From 9ed5485ae353c0cb3c8b2f6a97f2e905d77afd71 Mon Sep 17 00:00:00 2001 From: ByteHamster Date: Mon, 28 Aug 2023 17:27:53 +0200 Subject: Restore Nextcloud login state when recreated (#6600) --- .../NextcloudAuthenticationFragment.java | 31 +++++++++++++++++----- .../net/sync/nextcloud/NextcloudLoginFlow.java | 31 +++++++++++++++++++++- 2 files changed, 55 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/synchronization/NextcloudAuthenticationFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/preferences/synchronization/NextcloudAuthenticationFragment.java index 14440be47..2c9e555f1 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/synchronization/NextcloudAuthenticationFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/preferences/synchronization/NextcloudAuthenticationFragment.java @@ -23,6 +23,7 @@ import de.danoeh.antennapod.net.sync.nextcloud.NextcloudLoginFlow; public class NextcloudAuthenticationFragment extends DialogFragment implements NextcloudLoginFlow.AuthenticationCallback { public static final String TAG = "NextcloudAuthenticationFragment"; + private static final String EXTRA_LOGIN_FLOW = "LoginFlow"; private NextcloudAuthDialogBinding viewBinding; private NextcloudLoginFlow nextcloudLoginFlow; private boolean shouldDismiss = false; @@ -40,17 +41,34 @@ public class NextcloudAuthenticationFragment extends DialogFragment dialog.setView(viewBinding.getRoot()); viewBinding.chooseHostButton.setOnClickListener(v -> { - viewBinding.errorText.setVisibility(View.GONE); - viewBinding.chooseHostButton.setVisibility(View.GONE); - viewBinding.loginProgressContainer.setVisibility(View.VISIBLE); nextcloudLoginFlow = new NextcloudLoginFlow(AntennapodHttpClient.getHttpClient(), viewBinding.serverUrlText.getText().toString(), getContext(), this); - nextcloudLoginFlow.start(); + startLoginFlow(); }); - + if (savedInstanceState != null && savedInstanceState.getStringArrayList(EXTRA_LOGIN_FLOW) != null) { + nextcloudLoginFlow = NextcloudLoginFlow.fromInstanceState(AntennapodHttpClient.getHttpClient(), + getContext(), this, savedInstanceState.getStringArrayList(EXTRA_LOGIN_FLOW)); + startLoginFlow(); + } return dialog.create(); } + private void startLoginFlow() { + viewBinding.errorText.setVisibility(View.GONE); + viewBinding.chooseHostButton.setVisibility(View.GONE); + viewBinding.loginProgressContainer.setVisibility(View.VISIBLE); + viewBinding.serverUrlText.setEnabled(false); + nextcloudLoginFlow.start(); + } + + @Override + public void onSaveInstanceState(@NonNull Bundle outState) { + super.onSaveInstanceState(outState); + if (nextcloudLoginFlow != null) { + outState.putStringArrayList(EXTRA_LOGIN_FLOW, nextcloudLoginFlow.saveInstanceState()); + } + } + @Override public void onDismiss(@NonNull DialogInterface dialog) { super.onDismiss(dialog); @@ -75,7 +93,7 @@ public class NextcloudAuthenticationFragment extends DialogFragment SynchronizationCredentials.setHosturl(server); SynchronizationCredentials.setUsername(username); SyncService.fullSync(getContext()); - if (isVisible()) { + if (isResumed()) { dismiss(); } else { shouldDismiss = true; @@ -88,5 +106,6 @@ public class NextcloudAuthenticationFragment extends DialogFragment viewBinding.errorText.setVisibility(View.VISIBLE); viewBinding.errorText.setText(errorMessage); viewBinding.chooseHostButton.setVisibility(View.VISIBLE); + viewBinding.serverUrlText.setEnabled(true); } } diff --git a/net/sync/gpoddernet/src/main/java/de/danoeh/antennapod/net/sync/nextcloud/NextcloudLoginFlow.java b/net/sync/gpoddernet/src/main/java/de/danoeh/antennapod/net/sync/nextcloud/NextcloudLoginFlow.java index 3ad171f7f..3d2374acf 100644 --- a/net/sync/gpoddernet/src/main/java/de/danoeh/antennapod/net/sync/nextcloud/NextcloudLoginFlow.java +++ b/net/sync/gpoddernet/src/main/java/de/danoeh/antennapod/net/sync/nextcloud/NextcloudLoginFlow.java @@ -21,6 +21,7 @@ import android.util.Log; import java.io.IOException; import java.net.URI; import java.net.URL; +import java.util.ArrayList; import java.util.concurrent.TimeUnit; public class NextcloudLoginFlow { @@ -28,6 +29,7 @@ public class NextcloudLoginFlow { private final OkHttpClient httpClient; private final HostnameParser hostname; + private final String rawHostUrl; private final Context context; private final AuthenticationCallback callback; private String token; @@ -38,12 +40,33 @@ public class NextcloudLoginFlow { public NextcloudLoginFlow(OkHttpClient httpClient, String hostUrl, Context context, AuthenticationCallback callback) { this.httpClient = httpClient; + this.rawHostUrl = hostUrl; this.hostname = new HostnameParser(hostUrl); this.context = context; this.callback = callback; } + public static NextcloudLoginFlow fromInstanceState(OkHttpClient httpClient, Context context, + AuthenticationCallback callback, ArrayList instanceState) { + NextcloudLoginFlow flow = new NextcloudLoginFlow(httpClient, instanceState.get(0), context, callback); + flow.token = instanceState.get(1); + flow.endpoint = instanceState.get(2); + return flow; + } + + public ArrayList saveInstanceState() { + ArrayList state = new ArrayList<>(); + state.add(rawHostUrl); + state.add(token); + state.add(endpoint); + return state; + } + public void start() { + if (token != null) { + poll(); + return; + } startDisposable = Observable.fromCallable(() -> { URL url = new URI(hostname.scheme, null, hostname.host, hostname.port, hostname.subfolder + "/index.php/login/v2", null, null).toURL(); @@ -62,6 +85,8 @@ public class NextcloudLoginFlow { poll(); }, error -> { Log.e(TAG, Log.getStackTraceString(error)); + this.token = null; + this.endpoint = null; callback.onNextcloudAuthError(error.getLocalizedMessage()); }); } @@ -74,7 +99,11 @@ public class NextcloudLoginFlow { .observeOn(AndroidSchedulers.mainThread()) .subscribe(result -> callback.onNextcloudAuthenticated( result.getString("server"), result.getString("loginName"), result.getString("appPassword")), - error -> callback.onNextcloudAuthError(error.getLocalizedMessage())); + error -> { + this.token = null; + this.endpoint = null; + callback.onNextcloudAuthError(error.getLocalizedMessage()); + }); } public void cancel() { -- cgit v1.2.3