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
|
public class NextcloudAuthenticationFragment extends DialogFragment
|
||||||
implements NextcloudLoginFlow.AuthenticationCallback {
|
implements NextcloudLoginFlow.AuthenticationCallback {
|
||||||
public static final String TAG = "NextcloudAuthenticationFragment";
|
public static final String TAG = "NextcloudAuthenticationFragment";
|
||||||
|
private static final String EXTRA_LOGIN_FLOW = "LoginFlow";
|
||||||
private NextcloudAuthDialogBinding viewBinding;
|
private NextcloudAuthDialogBinding viewBinding;
|
||||||
private NextcloudLoginFlow nextcloudLoginFlow;
|
private NextcloudLoginFlow nextcloudLoginFlow;
|
||||||
private boolean shouldDismiss = false;
|
private boolean shouldDismiss = false;
|
||||||
@ -40,17 +41,34 @@ public class NextcloudAuthenticationFragment extends DialogFragment
|
|||||||
dialog.setView(viewBinding.getRoot());
|
dialog.setView(viewBinding.getRoot());
|
||||||
|
|
||||||
viewBinding.chooseHostButton.setOnClickListener(v -> {
|
viewBinding.chooseHostButton.setOnClickListener(v -> {
|
||||||
viewBinding.errorText.setVisibility(View.GONE);
|
|
||||||
viewBinding.chooseHostButton.setVisibility(View.GONE);
|
|
||||||
viewBinding.loginProgressContainer.setVisibility(View.VISIBLE);
|
|
||||||
nextcloudLoginFlow = new NextcloudLoginFlow(AntennapodHttpClient.getHttpClient(),
|
nextcloudLoginFlow = new NextcloudLoginFlow(AntennapodHttpClient.getHttpClient(),
|
||||||
viewBinding.serverUrlText.getText().toString(), getContext(), this);
|
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();
|
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
|
@Override
|
||||||
public void onDismiss(@NonNull DialogInterface dialog) {
|
public void onDismiss(@NonNull DialogInterface dialog) {
|
||||||
super.onDismiss(dialog);
|
super.onDismiss(dialog);
|
||||||
@ -75,7 +93,7 @@ public class NextcloudAuthenticationFragment extends DialogFragment
|
|||||||
SynchronizationCredentials.setHosturl(server);
|
SynchronizationCredentials.setHosturl(server);
|
||||||
SynchronizationCredentials.setUsername(username);
|
SynchronizationCredentials.setUsername(username);
|
||||||
SyncService.fullSync(getContext());
|
SyncService.fullSync(getContext());
|
||||||
if (isVisible()) {
|
if (isResumed()) {
|
||||||
dismiss();
|
dismiss();
|
||||||
} else {
|
} else {
|
||||||
shouldDismiss = true;
|
shouldDismiss = true;
|
||||||
@ -88,5 +106,6 @@ public class NextcloudAuthenticationFragment extends DialogFragment
|
|||||||
viewBinding.errorText.setVisibility(View.VISIBLE);
|
viewBinding.errorText.setVisibility(View.VISIBLE);
|
||||||
viewBinding.errorText.setText(errorMessage);
|
viewBinding.errorText.setText(errorMessage);
|
||||||
viewBinding.chooseHostButton.setVisibility(View.VISIBLE);
|
viewBinding.chooseHostButton.setVisibility(View.VISIBLE);
|
||||||
|
viewBinding.serverUrlText.setEnabled(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -21,6 +21,7 @@ import android.util.Log;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
public class NextcloudLoginFlow {
|
public class NextcloudLoginFlow {
|
||||||
@ -28,6 +29,7 @@ public class NextcloudLoginFlow {
|
|||||||
|
|
||||||
private final OkHttpClient httpClient;
|
private final OkHttpClient httpClient;
|
||||||
private final HostnameParser hostname;
|
private final HostnameParser hostname;
|
||||||
|
private final String rawHostUrl;
|
||||||
private final Context context;
|
private final Context context;
|
||||||
private final AuthenticationCallback callback;
|
private final AuthenticationCallback callback;
|
||||||
private String token;
|
private String token;
|
||||||
@ -38,12 +40,33 @@ public class NextcloudLoginFlow {
|
|||||||
public NextcloudLoginFlow(OkHttpClient httpClient, String hostUrl, Context context,
|
public NextcloudLoginFlow(OkHttpClient httpClient, String hostUrl, Context context,
|
||||||
AuthenticationCallback callback) {
|
AuthenticationCallback callback) {
|
||||||
this.httpClient = httpClient;
|
this.httpClient = httpClient;
|
||||||
|
this.rawHostUrl = hostUrl;
|
||||||
this.hostname = new HostnameParser(hostUrl);
|
this.hostname = new HostnameParser(hostUrl);
|
||||||
this.context = context;
|
this.context = context;
|
||||||
this.callback = callback;
|
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() {
|
public void start() {
|
||||||
|
if (token != null) {
|
||||||
|
poll();
|
||||||
|
return;
|
||||||
|
}
|
||||||
startDisposable = Observable.fromCallable(() -> {
|
startDisposable = Observable.fromCallable(() -> {
|
||||||
URL url = new URI(hostname.scheme, null, hostname.host, hostname.port,
|
URL url = new URI(hostname.scheme, null, hostname.host, hostname.port,
|
||||||
hostname.subfolder + "/index.php/login/v2", null, null).toURL();
|
hostname.subfolder + "/index.php/login/v2", null, null).toURL();
|
||||||
@ -62,6 +85,8 @@ public class NextcloudLoginFlow {
|
|||||||
poll();
|
poll();
|
||||||
}, error -> {
|
}, error -> {
|
||||||
Log.e(TAG, Log.getStackTraceString(error));
|
Log.e(TAG, Log.getStackTraceString(error));
|
||||||
|
this.token = null;
|
||||||
|
this.endpoint = null;
|
||||||
callback.onNextcloudAuthError(error.getLocalizedMessage());
|
callback.onNextcloudAuthError(error.getLocalizedMessage());
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -74,7 +99,11 @@ public class NextcloudLoginFlow {
|
|||||||
.observeOn(AndroidSchedulers.mainThread())
|
.observeOn(AndroidSchedulers.mainThread())
|
||||||
.subscribe(result -> callback.onNextcloudAuthenticated(
|
.subscribe(result -> callback.onNextcloudAuthenticated(
|
||||||
result.getString("server"), result.getString("loginName"), result.getString("appPassword")),
|
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() {
|
public void cancel() {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user