Restore Nextcloud login state when recreated (#6600)
This commit is contained in:
parent
3564484c2c
commit
9ed5485ae3
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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() {
|
||||
|
Loading…
x
Reference in New Issue
Block a user