001package com.gigya.android.sdk.ui; 002 003import android.content.Context; 004import android.os.Build; 005import android.os.Bundle; 006import android.support.annotation.Nullable; 007import android.support.v7.app.AppCompatActivity; 008import android.text.TextUtils; 009import android.util.SparseArray; 010import android.webkit.CookieManager; 011import android.webkit.CookieSyncManager; 012 013import com.gigya.android.sdk.Config; 014import com.gigya.android.sdk.Gigya; 015import com.gigya.android.sdk.GigyaLoginCallback; 016import com.gigya.android.sdk.GigyaPluginCallback; 017import com.gigya.android.sdk.account.models.GigyaAccount; 018import com.gigya.android.sdk.api.IBusinessApiService; 019import com.gigya.android.sdk.ui.plugin.IWebViewFragmentFactory; 020import com.gigya.android.sdk.ui.provider.ProviderFragment; 021import com.gigya.android.sdk.utils.UrlUtils; 022 023import java.util.HashMap; 024import java.util.List; 025import java.util.Map; 026 027public class Presenter<A extends GigyaAccount> implements IPresenter<A> { 028 029 public static class Consts { 030 031 public static final String REDIRECT_URL_SCHEME = "gsapi"; 032 public static final String ON_JS_LOAD_ERROR = "on_js_load_error"; 033 public static final String ON_JS_EXCEPTION = "on_js_exception"; 034 public static final String CONTAINER_ID = "pluginContainer"; 035 public static final int JS_TIMEOUT = 10000; 036 } 037 038 public static final String ARG_STYLE_SHOW_FULL_SCREEN = "arg_style_show_full_screen"; 039 public static final String ARG_OBFUSCATE = "arg_obfuscate"; 040 041 final private Context _context; 042 final private Config _config; 043 final private IWebViewFragmentFactory<A> _pfgFactory; 044 045 private static final String REDIRECT_URI = "gsapi://result/"; 046 047 public Presenter(Context context, Config config, IWebViewFragmentFactory<A> pfgFactory) { 048 _context = context; 049 _config = config; 050 _pfgFactory = pfgFactory; 051 } 052 053 @Override 054 public void showPlugin(final boolean obfuscate, 055 final String plugin, 056 final boolean fullScreen, 057 final Map<String, Object> params, 058 final GigyaPluginCallback<A> gigyaPluginCallback) { 059 if (!params.containsKey("lang")) { 060 params.put("lang", "en"); 061 } 062 if (!params.containsKey("deviceType")) { 063 params.put("deviceType", "mobile"); 064 } 065 HostActivity.present(_context, new HostActivity.HostActivityLifecycleCallbacks() { 066 @Override 067 public void onCreate(final AppCompatActivity activity, @Nullable Bundle savedInstanceState) { 068 Bundle args = new Bundle(); 069 args.putBoolean(ARG_STYLE_SHOW_FULL_SCREEN, fullScreen); 070 args.putBoolean(ARG_OBFUSCATE, obfuscate); 071 _pfgFactory.showPluginFragment(activity, plugin, params, args, gigyaPluginCallback); 072 } 073 }); 074 } 075 076 @Override 077 public void showNativeLoginProviders(List<String> providers, 078 final IBusinessApiService businessApiService, 079 final Map<String, Object> params, 080 final GigyaLoginCallback<A> gigyaLoginCallback) { 081 params.put("enabledProviders", TextUtils.join(",", providers)); 082 final String url = getPresentationUrl(params, "login"); 083 HostActivity.present(_context, new HostActivity.HostActivityLifecycleCallbacks() { 084 @Override 085 public void onCreate(final AppCompatActivity activity, @Nullable Bundle savedInstanceState) { 086 Bundle args = new Bundle(); 087 args.putString(ProviderFragment.ARG_TITLE, "Sign in"); 088 args.putString(ProviderFragment.ARG_URL, url); 089 args.putString(ProviderFragment.ARG_REDIRECT_PREFIX, "gsapi"); 090 args.putSerializable(WebViewFragment.ARG_PARAMS, (HashMap) params); 091 _pfgFactory.showProviderFragment(activity, businessApiService, params, args, gigyaLoginCallback); 092 } 093 }); 094 } 095 096 @Override 097 public void clearOnLogout() { 098 // Clearing cached cookies. 099 CookieManager cookieManager = CookieManager.getInstance(); 100 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 101 cookieManager.flush(); 102 } else { 103 CookieSyncManager.createInstance(_context); 104 cookieManager.removeAllCookie(); 105 } 106 } 107 108 @Override 109 public String getPresentationUrl(Map<String, Object> params, String requestType) { 110 // Setup parameters. 111 final Map<String, Object> urlParams = new HashMap<>(); 112 urlParams.put("apiKey", _config.getApiKey()); 113 urlParams.put("requestType", requestType); 114 if (params.containsKey("enabledProviders")) { 115 final String enabledProviders = (String) params.get("enabledProviders"); 116 if (enabledProviders != null) 117 urlParams.put("enabledProviders", enabledProviders); 118 } 119 if (params.containsKey("disabledProviders")) { 120 final String disabledProviders = (String) params.get("disabledProviders"); 121 if (disabledProviders != null) 122 urlParams.put("disabledProviders", disabledProviders); 123 } 124 if (params.containsKey("lang")) { 125 final String lang = (String) params.get("lang"); 126 if (lang != null) 127 urlParams.put("lang", lang); 128 } 129 if (params.containsKey("cid")) { 130 final String cid = (String) params.get("cid"); 131 if (cid != null) 132 urlParams.put("cid", cid); 133 } 134 urlParams.put("sdk", Gigya.VERSION); 135 urlParams.put("redirect_uri", REDIRECT_URI); 136 final String qs = UrlUtils.buildEncodedQuery(urlParams); 137 138 // Setup url. 139 final String endpoint = "gs/mobile/loginui.aspx"; 140 final String protocol = "https"; 141 final String domainPrefix = "socialize"; 142 return String.format("%s://%s.%s/%s?%s", protocol, domainPrefix, _config.getApiDomain(), endpoint, qs); 143 } 144 145 146 //region HOST ACTIVITY LIFECYCLE CALLBACKS TRACKING 147 148 private static SparseArray<HostActivity.HostActivityLifecycleCallbacks> lifecycleSparse = new SparseArray<>(); 149 private static SparseArray<WebLoginActivity.WebLoginActivityCallback> webLoginLifecycleSparse = new SparseArray<>(); 150 151 public static int addLifecycleCallbacks(HostActivity.HostActivityLifecycleCallbacks callbacks) { 152 int id = callbacks.hashCode(); 153 lifecycleSparse.append(id, callbacks); 154 return id; 155 } 156 157 public static int addWebLoginLifecycleCallback(WebLoginActivity.WebLoginActivityCallback callback) { 158 int id = callback.hashCode(); 159 webLoginLifecycleSparse.append(id, callback); 160 return id; 161 } 162 163 public static HostActivity.HostActivityLifecycleCallbacks getCallbacks(int id) { 164 return lifecycleSparse.get(id); 165 } 166 167 public static WebLoginActivity.WebLoginActivityCallback getWebLoginCallback(int id) { 168 return webLoginLifecycleSparse.get(id); 169 } 170 171 public static void flushLifecycleCallbacks(int id) { 172 lifecycleSparse.remove(id); 173 } 174 175 public static void flushWebLoginLifecycleCallback(int id) { 176 webLoginLifecycleSparse.remove(id); 177 } 178 179 public static void flush() { 180 lifecycleSparse.clear(); 181 webLoginLifecycleSparse.clear(); 182 System.gc(); 183 } 184 185 //endregion 186}