001package com.gigya.android.sdk.providers.provider;
002
003import android.content.Context;
004
005import com.gigya.android.sdk.GigyaLogger;
006import com.gigya.android.sdk.api.GigyaApiResponse;
007import com.gigya.android.sdk.api.IBusinessApiService;
008import com.gigya.android.sdk.network.GigyaError;
009import com.gigya.android.sdk.persistence.IPersistenceService;
010import com.gigya.android.sdk.providers.IProviderPermissionsCallback;
011import com.gigya.android.sdk.providers.IProviderTokenTrackerListener;
012import com.gigya.android.sdk.session.SessionInfo;
013
014import java.util.HashMap;
015import java.util.Map;
016
017public abstract class Provider implements IProvider {
018
019    private static final String LOG_TAG = "Provider";
020
021    final protected Context _context;
022    private final IPersistenceService _psService;
023    final protected IBusinessApiService _businessApiService;
024
025    boolean _connecting = false;
026
027    // Dynamic
028    String _loginMode;
029
030    private String _regToken;
031
032    IProviderTokenTrackerListener _tokenTrackingListener;
033
034    ProviderCallback _providerCallback;
035
036    public Provider(Context context, IPersistenceService persistenceService,
037                    IBusinessApiService businessApiService, ProviderCallback providerCallback) {
038        _context = context;
039        _psService = persistenceService;
040        _businessApiService = businessApiService;
041        _providerCallback = providerCallback;
042
043        if (supportsTokenTracking()) {
044            _tokenTrackingListener = new IProviderTokenTrackerListener() {
045                @Override
046                public void onTokenChange(String provider, String providerSession, final IProviderPermissionsCallback permissionsCallback) {
047                    GigyaLogger.debug(LOG_TAG, getName() + ": onProviderTrackingTokenChanges: provider = "
048                            + provider + ", providerSession =" + providerSession);
049                    // Setup refresh session request.
050                    final Map<String, Object> params = new HashMap<>();
051                    params.put("providerSession", providerSession);
052                    // Notify.
053                    _businessApiService.refreshNativeProviderSession(params, permissionsCallback);
054                }
055            };
056        }
057    }
058
059    @Override
060    public void logout() {
061        _connecting = false;
062    }
063
064    @Override
065    public void onCanceled() {
066        _connecting = false;
067
068        // Trigger cancellation callback.
069        _providerCallback.onCanceled();
070    }
071
072    @Override
073    public void onLoginSuccess(final Map<String, Object> loginParams, String providerSessions, String loginMode) {
074        _connecting = false;
075        GigyaLogger.debug(LOG_TAG, "onLoginSuccess: provider = "
076                + getName() + ", providerSessions = " + providerSessions);
077
078        // Setup request.
079        loginParams.put("providerSessions", providerSessions);
080        loginParams.put("loginMode", loginMode);
081
082        if (loginMode.equals("link") && _regToken != null) {
083            loginParams.put("regToken", _regToken);
084        }
085
086        Runnable completionHandler = new Runnable() {
087            @Override
088            public void run() {
089                _psService.addSocialProvider(getName());
090                if (supportsTokenTracking()) {
091                    trackTokenChange();
092                }
093            }
094        };
095
096        // Notify.
097        _providerCallback.onProviderSessions(loginParams, completionHandler);
098    }
099
100    @Override
101    public void onLoginSuccess(String providerName, SessionInfo sessionInfo) {
102        _connecting = false;
103
104        GigyaLogger.debug(LOG_TAG, "onLoginSuccess: provider = "
105                + getName() + ", sessionToken = " + sessionInfo.getSessionToken());
106
107        Runnable completionHandler = new Runnable() {
108            @Override
109            public void run() {
110                _psService.addSocialProvider(getName());
111                if (supportsTokenTracking()) {
112                    trackTokenChange();
113                }
114            }
115        };
116
117        //Notify.
118        _providerCallback.onProviderSession(providerName, sessionInfo, completionHandler);
119    }
120
121    @Override
122    public void onLoginFailed(String error) {
123        _connecting = false;
124        GigyaLogger.debug(LOG_TAG, "onProviderLoginFailed: provider = "
125                + getName() + ", error =" + error);
126
127        // Notify.
128        final String json = GigyaError.errorFrom(error).getData();
129        _providerCallback.onError(new GigyaApiResponse(json));
130    }
131
132    @Override
133    public void onLoginFailed(GigyaApiResponse response) {
134        _connecting = false;
135        GigyaLogger.debug(LOG_TAG, "onProviderLoginFailed: provider = "
136                + getName() + ", error =" + response.toString());
137
138        // Notify.
139        _providerCallback.onError(response);
140    }
141
142    @Override
143    public void setRegToken(String regToken) {
144        _regToken = regToken;
145    }
146}