001package com.gigya.android.sdk.providers;
002
003import android.content.Context;
004
005import com.gigya.android.sdk.GigyaLogger;
006import com.gigya.android.sdk.containers.IoCContainer;
007import com.gigya.android.sdk.persistence.IPersistenceService;
008import com.gigya.android.sdk.providers.provider.FacebookProvider;
009import com.gigya.android.sdk.providers.provider.GoogleProvider;
010import com.gigya.android.sdk.providers.provider.IProvider;
011import com.gigya.android.sdk.providers.provider.LineProvider;
012import com.gigya.android.sdk.providers.provider.Provider;
013import com.gigya.android.sdk.providers.provider.ProviderCallback;
014import com.gigya.android.sdk.providers.provider.WeChatProvider;
015import com.gigya.android.sdk.providers.provider.WebLoginProvider;
016import com.gigya.android.sdk.utils.FileUtils;
017
018import java.util.ArrayList;
019
020import static com.gigya.android.sdk.GigyaDefinitions.Providers.FACEBOOK;
021import static com.gigya.android.sdk.GigyaDefinitions.Providers.GOOGLE;
022import static com.gigya.android.sdk.GigyaDefinitions.Providers.LINE;
023import static com.gigya.android.sdk.GigyaDefinitions.Providers.WECHAT;
024
025public class ProviderFactory implements IProviderFactory {
026    final private IoCContainer _container;
027    final private Context _context;
028    final private FileUtils _fileUtils;
029    final private IPersistenceService _psService;
030
031    private static final String LOG_TAG = "ProviderFactory";
032
033    public ProviderFactory(IoCContainer container,
034                           Context context,
035                           FileUtils fileUtils,
036                           IPersistenceService persistenceService) {
037        _container = container;
038        _context = context;
039        _fileUtils = fileUtils;
040        _psService = persistenceService;
041    }
042
043    @Override
044    public Provider providerFor(String name, ProviderCallback providerCallback) {
045        final Class<Provider> providerClazz = getProviderClass(name);
046
047        final IoCContainer tempContainer =
048                _container.clone()
049                        .bind(ProviderCallback.class, providerCallback);
050        try {
051            final Provider provider = tempContainer.createInstance(providerClazz);
052            // Bind generated provider to main IoC container.
053            _container.bind(providerClazz, provider);
054            return provider;
055        } catch (Exception e) {
056            GigyaLogger.error(LOG_TAG, "Missing dependency for creating provider");
057            return null;
058        } finally {
059            tempContainer.dispose();
060        }
061    }
062
063    @Override
064    public Provider usedProviderFor(String name) {
065        final Class<Provider> providerClazz = getProviderClass(name);
066        try {
067            return _container.get(providerClazz);
068        } catch (Exception e) {
069            e.printStackTrace();
070        }
071        return null;
072    }
073
074    private static final String LEGACY_GOOGLE_IDENTIFIER = "googleplus";
075
076    private Class getProviderClass(String providerName) {
077        if (providerName != null) {
078            switch (providerName) {
079                case FACEBOOK:
080                    if (FacebookProvider.isAvailable(_fileUtils)) {
081                        return FacebookProvider.class;
082                    }
083                    break;
084                case GOOGLE:
085                case LEGACY_GOOGLE_IDENTIFIER:
086                    if (GoogleProvider.isAvailable(_context)) {
087                        return GoogleProvider.class;
088                    }
089                    break;
090                case LINE:
091                    if (LineProvider.isAvailable(_fileUtils)) {
092                        return LineProvider.class;
093                    }
094                    break;
095                case WECHAT:
096                    if (WeChatProvider.isAvailable(_context, _fileUtils)) {
097                        return WeChatProvider.class;
098                    }
099                    break;
100            }
101        }
102
103        return WebLoginProvider.class;
104    }
105
106    @Override
107    public void logoutFromUsedSocialProviders() {
108        final ArrayList<IProvider> usedProviders = getUsedSocialProviders();
109        if (usedProviders.size() > 0) {
110            for (IProvider provider : usedProviders) {
111                provider.logout();
112            }
113
114            _psService.removeSocialProviders();
115        }
116    }
117
118    private final String[] _optionalBoundProviders = new String[]{GOOGLE, FACEBOOK, LINE, WECHAT};
119
120    private ArrayList<IProvider> getUsedSocialProviders() {
121        ArrayList<IProvider> providers = new ArrayList<>();
122        for (String optional : _optionalBoundProviders) {
123            try {
124                IProvider provider = (IProvider) _container.get(getProviderClass(optional));
125                if (provider != null) {
126                    providers.add(provider);
127                }
128            } catch (Exception e) {
129                e.printStackTrace();
130            }
131        }
132        return providers;
133    }
134}