Restore Nextcloud login state when recreated (#6600)

This commit is contained in:
ByteHamster 2023-08-28 17:27:53 +02:00 committed by GitHub
parent 3564484c2c
commit 9ed5485ae3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 55 additions and 7 deletions

View File

@ -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);
}
}

View File

@ -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() {