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}