001package com.gigya.android.sdk.interruption;
002
003import com.gigya.android.sdk.GigyaLogger;
004import com.gigya.android.sdk.GigyaLoginCallback;
005import com.gigya.android.sdk.api.GigyaApiResponse;
006import com.gigya.android.sdk.containers.IoCContainer;
007import com.gigya.android.sdk.interruption.link.LinkAccountsResolver;
008import com.gigya.android.sdk.interruption.tfa.TFAProviderResolver;
009import com.gigya.android.sdk.network.GigyaError;
010
011public class InterruptionResolverFactory implements IInterruptionResolverFactory {
012
013    private static final String LOG_TAG = "InterruptionResolverFactory";
014
015    //Dependencies
016    final private IoCContainer _container;
017
018    private boolean _enabled = true;
019
020    public InterruptionResolverFactory(IoCContainer container) {
021        _container = container.clone();
022    }
023
024    @Override
025    public void setEnabled(boolean enabled) {
026        _enabled = enabled;
027    }
028
029    @Override
030    public boolean isEnabled() {
031        return _enabled;
032    }
033
034    @Override
035    public void resolve(GigyaApiResponse apiResponse, GigyaLoginCallback loginCallback) {
036        if (!_enabled) {
037            loginCallback.onError(GigyaError.fromResponse(apiResponse));
038            return;
039        }
040
041        final IoCContainer resolverContainer =
042                _container.clone()
043                        .bind(GigyaApiResponse.class, apiResponse)
044                        .bind(GigyaLoginCallback.class, loginCallback);
045
046        final int errorCode = apiResponse.getErrorCode();
047        GigyaLogger.debug(LOG_TAG, "resolve: with errorCode = " + errorCode + " callID: " + apiResponse.getCallId());
048
049        try {
050            switch (errorCode) {
051                case GigyaError.Codes.ERROR_ACCOUNT_PENDING_VERIFICATION:
052                    loginCallback.onPendingVerification(apiResponse, getRegToken(apiResponse));
053                    break;
054                case GigyaError.Codes.ERROR_ACCOUNT_PENDING_REGISTRATION:
055                    PendingRegistrationResolver resolver = resolverContainer.createInstance(PendingRegistrationResolver.class);
056                    loginCallback.onPendingRegistration(apiResponse, resolver);
057                    break;
058                case GigyaError.Codes.ERROR_PENDING_PASSWORD_CHANGE:
059                    // TODO: #baryo resolver?
060                    loginCallback.onPendingPasswordChange(apiResponse);
061                    break;
062                case GigyaError.Codes.ERROR_LOGIN_IDENTIFIER_EXISTS:
063                    LinkAccountsResolver linkAccountsResolver = resolverContainer.createInstance(LinkAccountsResolver.class);
064                    linkAccountsResolver.requestConflictingAccounts();
065                    break;
066                case GigyaError.Codes.ERROR_PENDING_TWO_FACTOR_REGISTRATION:
067                case GigyaError.Codes.ERROR_PENDING_TWO_FACTOR_VERIFICATION:
068                    TFAProviderResolver tfaProviderResolver = resolverContainer.createInstance(TFAProviderResolver.class);
069                    tfaProviderResolver.init();
070                    break;
071                case GigyaError.Codes.SUCCESS_ERROR_ACCOUNT_LINKED:
072                    Resolver finalizeResolver = resolverContainer.createInstance(Resolver.class);
073                    finalizeResolver.finalizeRegistration(null);
074                    break;
075                default:
076                    handleUnsupportedResponse(apiResponse, loginCallback);
077                    break;
078            }
079        } catch (Exception e) {
080            // error with creating resolvers - could be missing container dependencies
081            GigyaLogger.error(LOG_TAG, e.getMessage());
082            handleUnsupportedResponse(apiResponse, loginCallback);
083        } finally {
084            resolverContainer.dispose();
085        }
086    }
087
088    private void handleUnsupportedResponse(GigyaApiResponse apiResponse, GigyaLoginCallback loginCallback) {
089        loginCallback.onError(GigyaError.fromResponse(apiResponse));
090    }
091
092    private String getRegToken(GigyaApiResponse apiResponse) {
093        return apiResponse.getField("regToken", String.class);
094    }
095}