001package com.gigya.android.sdk.providers.provider;
002
003import android.app.Activity;
004import android.content.Context;
005import android.content.Intent;
006import android.os.Bundle;
007import android.support.annotation.Nullable;
008import android.support.v7.app.AppCompatActivity;
009
010import com.gigya.android.sdk.GigyaLogger;
011import com.gigya.android.sdk.api.IBusinessApiService;
012import com.gigya.android.sdk.persistence.IPersistenceService;
013import com.gigya.android.sdk.ui.HostActivity;
014import com.gigya.android.sdk.utils.FileUtils;
015import com.tencent.mm.opensdk.modelbase.BaseResp;
016import com.tencent.mm.opensdk.modelmsg.SendAuth;
017import com.tencent.mm.opensdk.openapi.IWXAPI;
018import com.tencent.mm.opensdk.openapi.IWXAPIEventHandler;
019import com.tencent.mm.opensdk.openapi.WXAPIFactory;
020
021import org.json.JSONObject;
022
023import java.util.Map;
024
025import static com.gigya.android.sdk.GigyaDefinitions.Providers.WECHAT;
026
027public class WeChatProvider extends Provider {
028
029    private static final String LOG_TAG = "WeChatProvider";
030
031    public WeChatProvider(Context context,
032                          FileUtils fileUtils,
033                          IPersistenceService persistenceService,
034                          IBusinessApiService businessApiService,
035                          ProviderCallback providerCallback) {
036        super(context, persistenceService, businessApiService, providerCallback);
037        _appId = fileUtils.stringFromMetaData("wechatAppID");
038        _api = WXAPIFactory.createWXAPI(_context, _appId, true);
039        _api.registerApp(_appId);
040    }
041
042    private String _appId;
043    private IWXAPI _api;
044    private BaseResp _resp;
045
046    @Override
047    public String getName() {
048        return WECHAT;
049    }
050
051    public static boolean isAvailable(Context context, FileUtils fileUtils) {
052        try {
053            String appId = fileUtils.stringFromMetaData("wechatAppID");
054            IWXAPI api = WXAPIFactory.createWXAPI(context, appId, false);
055            return (appId != null && api.isWXAppInstalled());
056        } catch (Throwable t) {
057            return false;
058        }
059    }
060
061    @Override
062    public void login(final Map<String, Object> loginParams, String loginMode) {
063        if (_connecting) {
064            return;
065        }
066        _connecting = true;
067        _loginMode = loginMode;
068        HostActivity.present(_context, new HostActivity.HostActivityLifecycleCallbacks() {
069            @Override
070            public void onCreate(AppCompatActivity activity, @Nullable Bundle savedInstanceState) {
071                final SendAuth.Req req = new SendAuth.Req();
072                req.scope = "snsapi_userinfo";
073                req.state = "";
074                _api.sendReq(req);
075            }
076
077            @Override
078            public void onResume(AppCompatActivity activity) {
079                if (_resp != null) {
080                    handleResponse(loginParams, _resp, activity);
081                }
082            }
083
084        });
085    }
086
087    @Override
088    public void logout() {
089        super.logout();
090        if (_api != null) {
091            _api.detach();
092        }
093    }
094
095    public void handleIntent(Intent intent, IWXAPIEventHandler eventHandler) {
096        if (_api != null && _api.isWXAppInstalled()) {
097            _api.handleIntent(intent, eventHandler);
098        }
099    }
100
101    public void onResponse(BaseResp resp) {
102        _resp = resp;
103    }
104
105    private void handleResponse(Map<String, Object> loginParams, BaseResp baseResp, Activity activity) {
106        switch (baseResp.errCode) {
107            case BaseResp.ErrCode.ERR_OK:
108                try {
109                    SendAuth.Resp sendResp = (SendAuth.Resp) baseResp;
110                    final String authCode = sendResp.code;
111                    final String providerSessions = getProviderSessions(authCode, -1L, _appId);
112                    onLoginSuccess(loginParams, providerSessions, _loginMode);
113                } catch (Exception e) {
114                    e.printStackTrace();
115                }
116                break;
117            case BaseResp.ErrCode.ERR_USER_CANCEL:
118                onCanceled();
119                break;
120            case BaseResp.ErrCode.ERR_AUTH_DENIED:
121                onLoginFailed("authentication_denied");
122                break;
123        }
124        if (activity != null) {
125            _resp = null;
126            activity.finish();
127        }
128    }
129
130    @Override
131    public String getProviderSessions(String tokenOrCode, long expiration, String uid) {
132        // code is relevant
133        try {
134            final String json = new JSONObject()
135                    .put(getName(), new JSONObject()
136                            .put("code", tokenOrCode).put("providerUID", uid)).toString();
137            GigyaLogger.debug(LOG_TAG, "Provider sessions: " + json);
138            return json;
139        } catch (Exception ex) {
140            _connecting = false;
141            ex.printStackTrace();
142        }
143        return null;
144    }
145
146    @Override
147    public boolean supportsTokenTracking() {
148        return false;
149    }
150
151    @Override
152    public void trackTokenChange() {
153        // Stub.
154    }
155}