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}