summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorByteHamster <ByteHamster@users.noreply.github.com>2023-08-28 17:27:53 +0200
committerGitHub <noreply@github.com>2023-08-28 17:27:53 +0200
commit9ed5485ae353c0cb3c8b2f6a97f2e905d77afd71 (patch)
tree363d8fe629fc7b7be5be32a1e155b69bfcf76984
parent3564484c2cdec5b53826fd7967b4b29a55dda8f1 (diff)
downloadAntennaPod-9ed5485ae353c0cb3c8b2f6a97f2e905d77afd71.zip
Restore Nextcloud login state when recreated (#6600)
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/preferences/synchronization/NextcloudAuthenticationFragment.java31
-rw-r--r--net/sync/gpoddernet/src/main/java/de/danoeh/antennapod/net/sync/nextcloud/NextcloudLoginFlow.java31
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<String> 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<String> saveInstanceState() {
+ ArrayList<String> 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() {