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}